嵌入式Linux中断现场保护的优化
中断的优先级定义为6,仅次于最高优先级。以µC/OS-II时钟中断处理为例,中断处理过程如图3。µC/OS-II时钟中断服务中,首先要对中断嵌套计数器OSIntNesting进行加1操作,防止在嵌套的中断中进行任务调度;随后调用OSTimeTick()对每个睡眠任务的OSTCBDly进行减1以及对系统时间OSTime加1操作;最后调用OSIntExit()进行任务调度,如果不需要任务切换则返回到中断服务程序中。可见在时钟中断处理中,操作最多的集中在OSTimeTick()和OSIntExit()这两个函数上。通过armCC编译器的-s选项对两者进行编译,在得到的汇编代码中,前者需要使用R0、R1、R4-R7,后者需要R0-R3,没有使用R8-R12,而OSIntNesting++的操作也完全可以使用R0-R7进行,这样,在进入中断处理时,需要保存的通用寄存器仅仅为R0-R7。因此对图3中的①进行改写得到的保护中断现场的代码如图4所示。 µC/OS-II其他的中断处理与时钟中断相似,仅仅需要把OSTimeTick()替换成对应的处理,如果能在不牺牲代码效率的情况下,将相应处理集中到R0-R3这几个寄存器中,则该中断处理中,仅仅使用R0-R3,只要对它们进行保护即可,从而能更进一步缩短中断响应时间,大大缩短中断响应时间,提高中断实时性。 四、总结 传统的中断现场保护保存所有寄存器的内容,虽然使得程序的设计得到简化,但是同时造成了多余的寄存器保护,增加了中断响应的时间。有限中断现场保护策略能够根据具体中断服务中所需要使用的通用寄存器而进行相应的有限的保护,缩短了现场保护的时间,使用户中断服务能够尽早的到处理,提高了中断实时性。但是同时,有限中断现场保护的效率也受到中断服务处理复杂程度以及编译器性能的影响。对于中断服务简单,而对实时性要求高的中断,效果较明显,而对于复杂的中断服务,需要的通用寄存器较多,从而中断现场保护的寄存器也较多。而在同一中断服务中,效率高的编译器能够在不牺牲代码效率的情况下使用尽可能少的寄存器来完成中断服务,从而减少了需要中断现场保护的寄存器数,达到提高中断实时性的要求。
图3. µC/OS-II时钟中断处理
图4 µC/OS-II时钟中断现场保护
- 基于TMS320F2812的高压电机保护装置 (04-26)
- 嵌入式实时操作系统设计及应用探讨(05-25)
- 基于VxWorks的新型数字化故障录波器设计与实现(01-18)
- 基于VxWorks平台的快速交流信号采样及计算(03-26)
- 基于DSP的SPWM实现(04-19)
- 一种基于嵌入式实时操作系统的微机保护装置网络通信方案(05-07)