概述
中断
uC/OS-II的中断服务子程序要用汇编程序来编写。下面是用户中断服务子程序的一般处理过程的伪代码:
保存全部CPU寄存器;
调用OSIntEnter或OSIntNesting直接加1;
中断服务;
调用OSIntExit;
恢复所有CPU寄存器;
执行中断返回指令;
uC/OS-II的中断处理与PC的中断处理类似。当发生中断时,首先保护现场,CPU寄存器入栈,再执行中断服务子程序,之后恢复现场,CPU寄存器出栈,最后执行中断返回。但是uC/OS-II需要知道用户在做中断服务,因此用户应该调用OSIntEnter(),或者将全局变量OSIntNesting直接加1.内核通过判断OSIntNesting的值来了解中断嵌套的情况。中断服务子程序退出时要调用脱离中断函数OSIntExit(),OSIntExit()首先应该将OSIntNesting减1,如果中断服务程序使更高优先级的任务就绪且没有中断嵌套,还必须进行中断级的任务调度,使高优先级的就绪任务运行。
uC/OS-II的时钟节拍
uC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。uC/OS-II的时钟节拍(clock tick)是特定周期性中断。中断之间的时间间隔取决于不同的应用,一般在10ms到20ms之间。时钟的节拍中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务等待事件发生时,提供等待超时的依据。uC/OS-II的时钟节拍中断类似于一个定时器中断,事实上在移植到特定的处理器上时,通常都用目标处理器的定时器做时钟节拍源。每个时钟节拍中断到来时调用时钟节拍中断服务将任务延时做一次裁决。
OSTimtick()是时钟节拍中断服务函数,函数中大量的工作是给每个用户任务控制块OS_TCB中的时间延时项OSTCBDly减1(如果该项不为0的话)。OSTimTick()从OSTCBList开始,沿着OS_TCB链表做,一直到空闲任务。当任务的任务控制块中的时间延时项OSTCBDly减到了0,这个任务就进入了就绪态。而被挂起的任务则不会进入就绪状态。OSTimTick()的执行时间直接与应用程序中建立了多少任务成正比。
最后
以上就是拉长缘分为你收集整理的2.uC/OS-II中断及时钟节拍的全部内容,希望文章能够帮你解决2.uC/OS-II中断及时钟节拍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复