JN5139 DIO中断机制
一、Application Queue API 队列函数实现的中断处理机制:
Application Queue API,只能与IEEE 802.15.4 stack一起使用,提供有应用,协议栈,硬件驱动等基于队列的接口,这些API用来处理来自IEEE 802.15.4 MAC子层和外设的中断,Application Queue中有三个特殊的队列:(MCPS,MLME,AHI)相关对应的队列的中断处理代码由用户编写。
二、回调函数实现的中断机制:
在回调函数中,由用户自己定义中断处理函数传递给外设API,当中断被触发时,这些函数被底层驱动函数直接调用。由于回调函数是运行在中断函数前后,所以回调函数必须要能够迅速返回才可以保证不延迟程序执行时间。相对来说,队列函数有时候更加适合,它的中断处理并不是发生在中断前后。在官方 JN-RM-2001-Integrated-Peripherals-API-2v3.pdf 中有很多寄存器回调函数的详细说明。
这两种中断处理机制的区别:
①在队列函数中, u32AppQApiInit( )是必须被调用的,这个函数用来初始化事件队列应用接口。
②回调函数中, u32AppApiInit( )是必须被调用的,不使用的参数设置为NULL,这个调用必须保证中断矢量表的初始化正确,所有的回调函数都要被寄存,当中断发生时调用此函数,寄存一个回调函数可以通过一个以寄存器回调函数的中断处理函数的指针来完成:
这里以指向 vDIOInterruptCallback()的指针作为回调函数的参数,vDIOInterruptCallback()完成的是中断处理,中断处理无返回值,有两个参数:
一旦中断发生,中断源通过masks 对照协议栈提供的信息来确定,如设别ID号(uint32 u32Device)和一个消息位( uint32 u32ItemBitmap)。
如上代码功能是判断中断是否来自Dio9,系统控制器(E_AHI_DEVICE_SYSCTRL)处理来自比较器,唤醒器和Dio产生的中断,中断源通过对比消息位(u32ItemBitmap)
和Dio9 mask( E_AHI_DIO9_INT))来确定。