我的uC/OS-II,我的读书笔记之中断服务
中断服务程序(ISR)是嵌入式应用系统获取各种事件的基本手段,而事件是实时性问题的讨论基础和时间计算的起点。理论上Cortex-M3内核支持1-240个,但是貌似目前厂商没有支持这么多的。
中断优先级,不同的中断服务程序安排了不同的优先级,在允许中断嵌套的情况下,最高优先级的中断总是能够得到及时响应。中断优先级安排原则如下:
紧迫性:触发中断的事件允许耽误的时间越短,设定的中断优先级越高。紧迫性为最高原则。
关键性:触发中断的事件越关键,设定的中断优先级越高。
频繁性:触发中断的事件发生越频繁,设定的中断优先级越高。频繁事件的间隔时间比较短,如果不及时处理则有可能遗漏。
快捷性:在前三项条件相近时,ISR处理越快捷,设定的中断优先级越高。当发生中断嵌套时,耗时短的ISR嵌套在耗时长的ISR中时,对耗时长的ISR的完成时间影响不明显;而反之则影响很大。
在uC/OS-II中,操作系统对ISR进行了管理,其ISR代码的编写必须遵循一定的规则。下面我们以按键中断为例来看一下uC/OS-II系统下中断服务程序的结构:
Void ExInt3ISR(void)
{ OSIntEnter(); //调用“进入中断”服务函数
OSSemPost(Sem); //发送信号量
Int3Clear(); //清除按键中断,以便下次再次响应按键中断
OSIntExit(); //调用“退出中断”服务函数
}
上述代码包含了四 个必不可少部分:
1、调用实时操作系统提供的“进入中断”服务函数,用来通知实时操作系统,以便系统掌握当前中断的嵌套深度。这里一定要注意:所有用户编写的ISR函数均必须在函数体的最前面加入调用OSIntEnter()函数的语句。
2、ISR功能代码:此部分完成中断处理,但是这里系统不允许调用延时函数和可能被挂起的系统服务函数。
3、清除中断的标志位。
4、调用系统的“退出中断”服务函数,以实现“抢占式”实时操作系统的任务调度功能。
与中断相关联的任务的通信还需要详细分析,这里由于篇幅的问题暂时省略。带中断服务程序的uC/OS-II示例也会另帖奉上,敬请期待。