Chinaunix首页 | 论坛 | 博客
  • 博客访问: 211751
  • 博文数量: 93
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 978
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-10 15:46
个人简介

青春无悔

文章分类

全部博文(93)

文章存档

2015年(16)

2014年(77)

我的朋友

分类: C/C++

2015-02-09 14:22:56

一、简介:
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即可。
连接正确的数据库文件:
阅读(1100) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~