移植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的书时,才觉得人家总结的真好啊。我这些语焉不详的东西真可以扔进垃圾桶了。
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的书时,才觉得人家总结的真好啊。我这些语焉不详的东西真可以扔进垃圾桶了。
相关文章推荐
- 移植uCOS-II到C51 - 3
- 移植uCOS-II到C51 - 7
- 移植uCOS-II到C51 - 6
- 移植uCOS-II到C51 - 1
- 移植uCOS-II到C51 - 2
- 移植uCOS-II到C51 - 5
- uCOS-II移植 (B OSStartHang)问题 和 多任务不能切换问题
- uCOS-II移植的一点心得
- UCOS-II在LPC2210上的移植--OS_CPU_A.s
- uCOS-II移植-LPC2119_Keil
- uCOS-II在MSP430上的移植2——详细过程
- ucos-ii在ti dsp 28377芯片上的运行过程和移植过程
- 在KEIL MDK下的uCOS-II的FL2440移植
- UCOS-II在LPC2210上的移植--OS_CPU_c.c
- 在51系列单片机上移植uCOS-II
- UCOS-II移植ARM的读书笔记(补12.11)
- UCOS-II移植ARM的读书笔记(12.20)
- UCOS-II移植ARM的读书笔记(12.25)
- ucos-II移植到stm32上关于systick部分的修改
- IAR移植uCOS-II到STM32开发板(STM32F107VCT6)