您的位置:首页 > 其它

移植uCOS-II到C51 - 4

2007-10-16 20:11 176 查看
现在在分析任务级的任务切换,即当前任务主动放弃对CPU的控制权,通过系统任务调度转而运行其它已就绪的任务。调用顺序如下:

OSTimeDly()
|
OSSched()
|更新OSTCBHighRdy,使其指向新任务的任务控制块
OS_TASK_SW()->OSCtxSW()
|保存现场到当前任务模拟栈
C_OSCtxSW()
|从新任务模拟栈恢复现场
}开始执行新任务

首先,保护现场到硬件栈;然后计算硬件栈的长度并保存到R0,需要在当前任务的模拟栈预留R0+1个字节出来,将硬件栈的内容搬到模拟栈中去,+1字节是留给SP的,好比OSTaskStkInit()初始化任务模拟栈时写入的offset。注意此时C_XBP依然指向当前任务模拟栈的vd,保存现场后需要更新C_XBP使其指向新的栈顶。这个值会在C_OSCtxSW()中被写入任务控制块。在OSCtxSW()跳转到C_OSCtxSW()时,现场保护完毕,当前任务的模拟栈保存了SP,IE,各寄存器组,最后在执行到OSCtxSW()时,由于之前一系列CALL指令而被押入硬件栈的函数返回地址,当然最终会返回到OSTimeDly()的下一条语句。最后跳转到C_OSCtxSW(),调用LoadCtx()从新任务的模拟栈恢复现场,任务切换完成。

发现自己看过别人的移植代码,再来回头看Jean Labrosse的书时,才觉得人家总结的真好啊。我这些语焉不详的东西真可以扔进垃圾桶了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: