一、典型的μC/OS-Ⅲ中断服务程序解析
μC/OS-Ⅲ系统中典型有内核参与中断服务程序示例如下:
MyISR: (1)
Disable all interrupts; (2)
Save the CPU registers; (3)
OSIntNestingCtr++; (4)
if(OSIntNestingCtr == 1){ (5)
OSTCBCurPtr->StkPtr = Current task's CPU stack pointer register value;
}
Clear interrupting device; (6)
Re-enable interrupts(optional); (7)
Call user ISR; (8)
OSIntExit(); (9)
Restore the CPU registers; (10)
Return from interrupt; (10)
(1)中断服务程序需要用汇编语言编写,MyISR需要替换为自定义的中断服务程序名称。
(2)在进入中断后进行其他处理前需要关闭所有中断,防止其他中断打断现场保护程序。若CPU对此功能进行硬件处理,则不需软件做任何工作。
(3)现场保护。μC/OS-Ⅲ系统中要求将全部需要进行现场保护的通用寄存器和特殊寄存器存入任务堆栈。
(4)递增OSIntNestingCtr变量,该变量指示中断嵌套层数。
(5)如果OSIntNestingCtr为1表示有任务被打断,进行现场保护时需要将被打断的任务指针保存到OS_TCB中。
(6)完成现场保护后,需要清除中断,以防止退出中断处理函数后重复执行中断。
(7)如果需要实现中断嵌套,此处可以重新打开中断。(可选)
(8)调用用户编写的中断处理程序user ISR。此程序应该尽量精简。
(9)中断服务程序结束后,调用OSIntExit()程序通知系统内核发生中断。在OSIntExit()中会递减OSIntNestingCtr,当发现OSIntNestingCtr为0,即已返回任务级程序,则执行任务调度,有优先级更高的程序需要执行,则直接执行,不再返回中断。若无更高优先级任务,则返回中断。
(10)若能返回中断继续执行,则进行现场恢复。并返回之前中断的任务。
μC/OS-Ⅲ系统中典型无内核参与中断服务程序示例如下:
MyshortISR: (1)
Save enough registers as needed by the ISR; (2)
Clear inter rupting device; (3)
DO NOT re-enable interrupts; (4)
Call user ISR; (5)
Restore the saved CPU registers; (6)
Return from interrupt; (6)
(1)同上,该名称需要替换为自定义中断服务函数名。
(2)此处仅保存中断服务程序需要使用的寄存器。
(3)清中断,避免中断服务程序退出后再次响应中断。
(4)注意此处不可重开中断,因为重开中断后,高优先级中断可能打断此中断执行,若高优先级中断调用系统内核,会导致中断时间变长。
(5)调用中断处理函数。
(6)中断处理完成,恢复CPU寄存器,返回原任务。
问题:此代码中无关中断操作,为何?
二、中断向任务发布消息的方式
(1)直接发布
直接发布方式是指响应中断后,中断处理函数处理了中断所需请求,然后调用系统内核,检测是否有高优先级任务就绪,进行任务调度。此模式下使用关中断方式来保护临界段代码。
(2)延迟发布
延迟发布方式是指响应中断后,中断处理函数对中断请求进行初步处理,然后将中断送入中断队列,等待进一步处理,之后就从中断返回。此模式下使用锁定调度器的方式保护临界段代码。
三、系统节拍中断
基于μC/OS-Ⅲ的系统通常需要底层平台提供一个周期性的定时信号,称为时钟节拍,或系统节拍。该时钟信号周期一般为10~1000Hz。
时钟节拍中断大体与其他中断相同,只是必须调用OSTimeTick()函数。该中断仅用于通知系统时钟节拍的到来。
时钟节拍可以用来实现延时、超时等待等系统功能服务。