移植uCOS-II到C51 - 4

现在在分析任务级的任务切换,即当前任务主动放弃对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的书时,才觉得人家总结的真好啊。我这些语焉不详的东西真可以扔进垃圾桶了。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值