📄 interrupt.c
字号:
/**************************************************************************** * * MODULE: Interrupt * * COMPONENT: Interrupt.c,v * * VERSION: AT-Jenie_Release_v1_RC3 * * REVISION: 1.3 * * DATED: 2007/09/25 09:03:21 * * STATUS: Exp * * AUTHOR: MRW * * DESCRIPTION Manage interrupt enabling / disabling * * CHANGE HISTORY: * * Interrupt.c,v * * * MRW * * LAST MODIFIED BY: mwild * $Modtime: $ * **************************************************************************** * * (c) Copyright 2007 JENNIC Ltd * ****************************************************************************//****************************************************************************//*** Include files ***//****************************************************************************/#include <jendefs.h>#include "interrupt.h"/****************************************************************************//*** Macro Definitions ***//****************************************************************************/#define SR_IEE (4)#define SR_TEE (2)#define GET_SR(reg) { asm volatile ("l.mfspr %0,r0,0x0011" :"=r"(reg) : ); }#define CLEAR_SR_BITS(bits) { \ register unsigned int reg; \ asm volatile ("l.mfspr %0,r0,0x0011" :"=r"(reg) : ); \ reg &= ~(bits); \ asm volatile ("l.mtspr r0,%0,0x0011" : : "r"(reg) ); \}#define SET_SR_BITS(bits) { \ register unsigned int reg; \ asm volatile ("l.mfspr %0,r0,0x0011" :"=r"(reg) : ); \ reg |= (bits); \ asm volatile ("l.mtspr r0,%0,0x0011" : : "r"(reg) ); \}/****************************************************************************//*** Type Definitions ***//****************************************************************************//****************************************************************************//*** Local Function Prototypes ***//****************************************************************************//****************************************************************************//*** Exported Variables ***//****************************************************************************//****************************************************************************//*** Local Variables ***//****************************************************************************/volatile uint32 gu32Counter;uint32 gu32_SR;/****************************************************************************//*** Exported Functions ***//****************************************************************************//****************************************************************************//*** Local Functions ***//****************************************************************************//**************************************************************************** * * NAME: vInterrupt_Suspend * * DESCRIPTION: * Disables interrupts if they were not already disabled * * PARAMETERS: Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC void vInterrupt_Suspend(void){ if (0 == gu32Counter++) { register uint32 u32SR; GET_SR(u32SR); gu32_SR = u32SR; if (gu32_SR & (SR_IEE | SR_TEE)) { CLEAR_SR_BITS(SR_IEE | SR_TEE); } }}/**************************************************************************** * * NAME: vInterrupt_Resume * * DESCRIPTION: * Enables interrupts if they were not already enabled * * PARAMETERS: Name RW Usage * None. * * RETURNS: * None. * * NOTES: * None. ****************************************************************************/PUBLIC void vInterrupt_Resume(void){ if (gu32Counter) { if (0 == --gu32Counter) { SET_SR_BITS(gu32_SR & (SR_IEE | SR_TEE)); } } else { /* interrupt enable / disable underflow */ while (1); }}/****************************************************************************//*** END OF FILE ***//****************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -