在线时间0 小时
UID174876
注册时间2010-3-11
NXP金币0
该用户从未签到
版主
  
- 积分
- 322
- 最后登录
- 1970-1-1
|
发表于 2011-1-31 13:39:09
|
显示全部楼层
RE:KINETIS MQX在任务调度时为什么不使用PENDSV呢?
不好意思,之前没好好看过MQX在M4上的移植代码,有些误导,现纠正如下:
1. 确实MQX在M4上的移植代码中没有用到PendSV。尽管中断向量表中有PendSV的入口“_pend_svc”(可见BSP代码中的vectors.c),但在实际应用中并没有用到PENDSVSET。
2. 虽然没有用PendSV,但是用了SVCall,具体代码可参见PSP的dispatch.s中的"_sched_start_internal","_sched_run_internal","_sched_execute_scheduler_internal","_task_block": svc SVC_RUN_SCHED/SVC_TASK_BLOCK/SVC_TASK_SWITCH。
3. 个人理解,在此用SVCall和PendSV类似,都从thread模式切换到了handler模式,SP从PSP切换到了MSP,同时在PSP中保存了{r0-r3,r12,r14,r15}和xPSR。不同的是用SVCall可以传递一个立即数给_svc_handler()以区分系统调用的功能。
4. 从handler模式返回到thread模式,同uCOS等其他操作系统在M系列MCU上的移植一样,都用"bx lr",并且lr=0xFFFFFFFD,以pop回{r0-r3,r12,r14,r15}及xPSR。 |
|