新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2018-10-15
- 在线时间
- 7 小时
|
1金钱
查看Cortex-M3 权威指南一书,发现这样一张图
意思就是FreeRTOS的任务切换过程是这样一个流程:滴答定时器中断---->悬起PendSv 中断--->滴答定时器结束--->PendSV中断服务函数执行
滴答定时器中断来时,会自动将当前的任务A的R0-R3和xPSR, PC, LR, R12自动入栈,也就是说任务A的状态和真正的任务切换的现场保存相比还差R4-R11寄存器未进行压栈保存,那么按照内核指南的说明,上面步骤的滴答定时器中断退出时,不会执行POP操作而是直接执行这里的PendSV中断函数(中断咬尾),但是此时的PendSV函数还是会将R4-R11用PSP进行压栈(任务A 的栈空间)操作,但是此时的R4-R11已经不能保证是任务A进入中断之前的值了(1),因为中断服务函数可能也会用到R4-R11这些寄存器,所以压栈进去的内容就会有问题,这里无法解释FreeRTOS能正常进行多任务切换的现象。百思不得其解,发帖求助,大佬赐教啊。。。。。。。。。
|
|