本文主要是介绍tqOS的PendSV抢占式任务调度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
参考文献为:
1、Cortex-M3权威指南
2、 http://www.cnblogs.com/sky1991/p/stepbystep_stm32_os_3.html
3、 http://www.openedv.com/posts/list/64274.htm
4、tqOS V1.2
其实PendSV的原理就是软中断,将PendSV的中断优先级设置为最低,不可以打断任何其他中断服务程序。为什么这样呢?因为其他中断服务程序种必定用到了R0-R3、LR、PC、SP,如果在其他中断执行了一半的时候PendSV中断将其打断,则在PendSV中断处理函数中入栈的寄存器不是原始的线程留下来的寄存器的值了,而是被那个被打断的中断处理函数所修改过的值了。所以PendSV中断优先级必须是最低的,这样在所有其他中断都执行完并返回之后(返回的时候自动恢复寄存器R0-R3、LR、PC、SP)再执行PendSV异常时就可以完整的将线程的上下文保存到栈之中。
这里有几点说明一下,Cortex-M3处理器进入中断的时候只对R0-R3、LR、PC、SP进行自动压栈处理,而不对R4-R11寄存器进行处理。在中断返回的时候也弹出R0-R3、LR、PC、SP。PendSV也是一种中断,所以要完整的保存任务环境就要在PendSV中断中将R4-R11寄存器压栈,并且出栈的时候要先弹出R4-R11,然后再返回,中断返回过程中自动将剩余的R0-R3、LR、PC、SP寄存器组弹出。
移植的时候不要忘了在startup头文件中对PendSV进行初始化并设置中断优先级为最低优先级。
这篇关于tqOS的PendSV抢占式任务调度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!