1第4章中断处理与时间管理4.1中断处理4.2时钟节拍4.3时间管理习题24.1中断处理中断:由于某种事件的发生而导致程序流程的改变。产生中断的事件称为中断源。CPU响应中断的条件:至少有一个中断源向CPU发出中断信号;系统允许中断,且对此中断信号未予屏蔽。3图4.1中断嵌套4中断服务程序ISR中断一旦被识别,CPU会保存部分(或全部)运行上下文(context,即寄存器的值),然后跳转到专门的子程序去处理此次事件,称为中断服务子程序(ISR)。μC/OS-Ⅱ中,中断服务子程序要用汇编语言来编写,然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。5中断延迟中断延迟:从硬件中断发生到开始执行中断处理程序第一条指令所用的时间是从中断发生到中断跳转指令执行完毕之间的这段时间,它是实时内核最重要的指标。由于实时操作系统考虑得更多的是最坏的情况,而不是平均的情况,因此指令执行的时间必须按照最长的指令执行时间来计算。6计算公式在前后台系统中:在不可剥夺型和不可剥夺内核中:中断延迟=MAX最长指令时间,用户关中断时间+内核关中断时间,中断向量跳转时间7中断响应中断响应:从中断发生起到开始执行中断用户处理程序的第一条指令所用的时间即从中断发生到刚刚开始处理异步事件之间的这段时间,它包括开始处理这个中断前的全部开销。在前后台系统和不可剥夺型内核中:中断响应=中断延迟+保存CPU内部寄存器的时间在可剥夺型内核中中断响应=中断延迟+保存CPU内部寄存器的时间+内核进入中断服务函数的执行时间8中断恢复时间CPU返回到被中断了的程序代码所需要的时间。在前后台系统和不可剥夺型内核中对于可剥夺型内核=中断恢复时间恢复CPU内部寄存器值的时间+执行中断返回指令的时间=中断恢复时间判定是否有优先级更高的任务进入了就绪态的时间+恢复CPU内部寄存器的时间+执行中断返回指令的时间9前后台系统和不可剥夺型内核的中断延迟、响应和恢复时间的比较10可剥夺型内核的中断延迟、中断响应和中断恢复时间的比较图4.3可剥夺型内核的中断延迟、响应和恢复时间的比较11非屏蔽中断非屏蔽中断(NMI):指不能用系统指令来关闭的中断特点:中断优先级高、延迟时间短、响应快、不能被嵌套、不能忍受内核的延迟一般常应用于紧急事件处理,如掉电保护等。非屏蔽中断的规则如下:(1)在非屏蔽中断处理程序中,不能处理临界区代码、不能使用内核提供的服务。(2)在非屏蔽中断处理程序中,参数的传递必须用全程变量,且全程变量的字节长度必须能够一次读完。12(1)保存全部CPU寄存器的值;(2)调用OSIntEnter(),或直接把全局变量OSIntNesting(中断嵌套层次)加1;(3)执行用户代码做中断服务;(4)调用OSIntExit();(5)恢复所有CPU寄存器;(6)执行中断返回指令。用户ISR的框架13标准的μC/OS-Ⅱ中断处理程序流程图14μC/OS-Ⅱ的中断处理过程示意图15μC/OS-Ⅱ的中断处理过程具体如下:(1)当一个中断发生时,若中断是开放的,则CPU运行完毕当前指令。(2)CPU自动将当前指令的下一条指令的程序计数器指针保存到堆栈中,然后再将中断矢量入口地址赋给程序计数器,将程序转入中断矢量入口单元。(3)中断入口矢量单元中一般有一条长跳转指令,程序将根据长跳转指令的指向跳转到相应的用户程序去,执行中断服务子程序。从第(1)步到第(3)步执行完毕之间的时间差,就是中断延迟时间。16(4)程序保存所有需要保存的CPU寄存器。(5)调用一个内核系统服务——中断进入函数OSIntEnter(),通知内核,CPU已经进入中断服务子程序,并且计算中断嵌套层次。μC/OS-Ⅱ的最大中断嵌套层次是255层,该数值主要是由中断嵌套层数计数器OSIntNesting的数据类型决定的。从第(1)步到第(5)步执行完毕之间的时间差,就是中断响应时间。(6)中断服务用户子程序。17(7)中断返回前需要调用一个内核系统服务——中断脱离函数OSIntExit(),通知内核CPU要退出当前中断。中断脱离函数首先将中断嵌套计数器减1,若此时程序还处于中断嵌套中,则继续执行上一个中断;若程序没有中...