一、简介:
1.使用两次机制来控制处理中断和事件。SIC和CEC
2.外部中断-->SIC-->CEC的处理方式。
3.约定名称是:变量前序为ADI_INT_,函数前序为adi_int_
4.所有API返回值为ADI_INT_RESULT类型,例如ADI_INT_RESULT_SUCCESS(0值)
中断管理器初始化:adi_int_Init
1.通过参数传递中断管理器运行过程使用的“内存”。
2.二级处理数:
第1个绑定指定IVG的处理函数,作为首个中断处理程序;
另外又有中断绑定同样的IVG,那么这个(些),就是二级处理数。
3.没有额外分配的“内存”,中断管理器只能处理每个IVG的首个中断处理函数
4.假如所有IVG对应只有1个(首个中断处理函数),没有二级处理数,可以不分配“内存”;
相反,如有同一个IVG存在多个中断绑定,则需要分配额外的内存
5.分配长度为: n*ADI_INT_SECONDARY_MEMORY 字节;n表示二级处理数
6.配置adi_int_Init不会影响CEC和SIC,配置后,可以使用任何中断管理器API
7.另外一个参数传递给adi_int_EnterCriticalRegion()函数;
中断管理器注销:adi_int_Terminate()
一般不会用。
二、内核事件控制器
1.adi_int_CECHook()
ADI_INT_RESULT adi_int_CECHook(
u32 IVG,
ADI_INT_HANDLER_FN Handler,
void *ClientArg,
u32 NestingFlag
);
Handler不是ISR,而是标准C可赎回功能。
控制器传递ClientArg给Handler。
Handler返回:ADI_INT_RESULT_PROCESSED或ADI_INT_RESULT_NOT_PROCESSED
NestingFlag只对每个IVG的首个中断处理函数有效,对此IVG的其他二级处理数设置无效
最后,使能CEC的IMASK对应位,使能中断。
大多应用场合:频率最高或最紧急的中断自己拥有一个IVG,非紧急或频率较低的可以共用一个IVG
同一个IVG首个中断处理函数优化效率较高;二级处理数是堆叠或LIFO(后进先出)方式执行。
建议:给予优化性能的基础,合理安排首个中断处理函数和二级处理数。
2.adi_int_CECUnhook()
作用:在同一个IVG中断处理队列里面解除某个Handler.
假如首个中断处理函数被移除,那么二级处理函数里面最后一个将替代成为首个中断处理函数。
假如此IVG所有Handler均被移除,则会对CEC的IMASK适当清位,从而禁用中断
对于汇编而言:假如多个中断源申请同一个IVG号,区分RTI(中断完成返回)和RTS(中断未完成返回)的返回值。
中断处理函数模板
ADI_INT_HANDLER(mjk_SPORT_RX_handler)
{
... ... // user code
}
where the ADI_INT_HANDLER macro is defined as
#define ADI_INT_HANDLER(NAME) \
void (*NAME)(void *ClientArg)
三、系统中断控制器
adi_int_SICEnable – Enables peripheral interrupts to be passed to the CEC.
adi_int_SICDisable – Disables peripheral interrupts from being passed to the CEC.
adi_int_SICSetIVG – Sets the IVG level to which a peripheral interrupt is mapped.
adi_int_SICGetIVG – Detects the IVG level to which a peripheral interrupt is mapped.
adi_int_SICWakeup – Establishes whether a peripheral interrupt wakes up the processor from an idled state.
使能或禁用外部中断是否唤醒内核(在中断触发以及内核空闲的情况下)
adi_int_SICInterruptAsserted – Detects whether a peripheral interrupt is asserted.
应用场合:在中断函数里面判断。
adi_int_SICGlobalWakeup – Disables all peripherals from waking the processor, or restores all wakeups to previous state.
应用场合:主要用在低功耗的恢复。
四、保护临界区代码
adi_int_EnterCriticalRegion()
adi_int_ExitCriticalRegion()
可以嵌套
用法为成对:
...
Value = adi_int_EnterCriticalRegion(pArg);
... // critical section of code
adi_int_ExitCriticalRegion(Value);
...
过度使用会导致性能的影响。
五、修改IMASK
作用:兼容不同RTOS的需要;正常可以不使用。
六、文件结构
头文件adi_int.h已被services.h包含,故应用只包含services.h即可。
连接正确的数据库文件:
阅读(1059) | 评论(0) | 转发(0) |