1. 程式人生 > >zigbee協議棧 中斷服務函式定義方法

zigbee協議棧 中斷服務函式定義方法

我們先看協議棧中 hal_uart.c 檔案中的串列埠操作中斷服務程式:

HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR )      //uart0  接收

HAL_ISR_FUNCTION( halUart1RxIsr, URX1_VECTOR )      //uart1  接收

HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR )      //uart0  傳送

HAL_ISR_FUNCTION( halUart1TxIsr, UTX1_VECTOR )      //uart1  傳送

這四個是 uart0 和uart1 的串列埠接收和傳送中斷服務程式,下面是協議棧定義中斷服務程式的方法。我們看一下 hal_mcu.h 檔案:

#define HAL_ISR_FUNC_PROTOTYPE(f,v)    _PRAGMA(vector=v) __near_func __interrupt void f(void)

#define HAL_ISR_FUNCTION(f,v)           HAL_ISR_FUNC_PROTOTYPE(f,v);

從這兩個#define 的定義可以瞭解到:

HAL_ISR_FUNCTION( halUart0RxIsr, URX0_VECTOR )按照定義展開來就是:

_PRAGMA(URX0_VECTOR) __near_func __interrupt void halUart0RxIsr

(void);

其中_PRAGMA 是編譯器預定義的宣告中斷服務程式的一個方法,URX0_VECTOR 是中斷編號(在

ioCC2530.h檔案中定義)。halUart1TxIsr就是f所指的函式,也就是我們的中斷服務函式。

常規中斷服務函式定義:

#pragma vector = T3_VECTOR      //定時器 T3

__interrupt void T3_ISR(void) 

協議棧中的定義:

_PRAGMA(URX0_VECTOR) __near_func __interrupt void halUart0RxIsr(void); 

註解:

_PRAGMA(URX0_VECTOR)            //定義中斷向量

__near_func                                 //IAR的特殊字

__interrupt                                   //中斷函式標誌

void  halUart0RxIsr(void);            //halUart0RxIsr  函式名

補充:

#define HAL_ISR_FUNC_DECLARATION(f,v)   \

    _PRAGMA(vector=v) __near_func __interrupt void f(void)

#define HAL_ISR_FUNC_PROTOTYPE(f,v)     \

    _PRAGMA(vector=v) __near_func __interrupt void f(void)

#define HAL_ISR_FUNCTION(f,v)           \

    HAL_ISR_FUNC_PROTOTYPE(f,v);    \

HAL_ISR_FUNC_DECLARATION(f,v)

還有這樣的定義,第一個是函式宣告,第二個是函式原型,第三個是函式定義,這三個不能少一個。