4.ucos的中断
中断过程:只有开放了中断,系统在接受中断请求后,才会停止当前运行的任务,而去运行中断服务子程序。当中断服务子程序运行结束后,系统将会根据情况,返回到被终止的任务继续运行,或者转向另一个具有更高优先级别的就绪任务。
注意:对于可剥脱型的ucos2内核在说,中断服务子程序结束后,系统将会根据情况进行一次任务调度去运行优先级别高的任务,而不一定返回。
ucos允许中断嵌套,即高级别的中断源的中断请求可以打断低优先级别的中断服务程序的运行,用一个全局变量OSIntNesting。
在写中断服务程序时,要用到两个重要的函数OSIntEnter()和OSIntExit()。
OSIntEnter()的调用通常发生在中断服务程序保护了呗中断任务的断点数据之后(即把被中断的任务放进任务数据栈后),运行中断服务程序前。
OSIntExit()函数在中断嵌套层数计数器为0、调度器未锁定且从任务就绪表中查找到的最高级就绪任务又不是被中断的任务的条件下将要进行任务切换,否侧就会返回被中断的服务子程序。
中断任务切换函数:ucos运行完中断服务程序之后,并不一定返回到中断任务。而是通过一次任务调度来决定返回的去向,因此系统还需要一个中断级任务调度器。OSIntExit函数在中断嵌套层数计数器为0、调度器未被锁定且从任务就绪表中查找到的最高级就绪任务又不是被中断的任务的条件下进行任务切换,完成这个工作的函数OSIntCtxSw(); 就叫做中断切换函数。
临界段:当有异步时间发生时会引发中断请求,但CPU只有在中断开放期间才响应,也就是说所有的CPU都具有开中断和关中断指令,以便一些代码不受中断干扰,这些代码叫临界段。
ucos用os_enter_critical和OS_Exit_critical封装相关允许中断的命令。
上面命令的实现方法一共有三种通过OS_CRITICAL_METHOD来设定。STM32用的是第三种方法。
#if OS_CRITICAL_METHOD == 3
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
#endif
#define OS_ENTER_CRITICAL() {cpu_sr = OS_CPU_SR_Save();}
#define OS_EXIT_CRITICAL() {OS_CPU_SR_Restore(cpu_sr);}
#endif
4.2uscos的时钟
ucos也是用硬件