interrupt.c

来自「JENNIC无线传感器网络 ZIGBEE 文件资料」· C语言 代码 · 共 155 行

C
155
字号
/**************************************************************************** * * 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 + =
减小字号Ctrl + -
显示快捷键?