移植Ucos应该满足的条件:
- 处理器的C编译器可以产生可重入码
可重入码可以被一个以上的任务调用,而不必担心数据的破坏。或者说可重入码在任何时刻都可以被中断,一段时间后又可以运行,而相应数据不会丢失。 - 在程序中可以打开和关闭中断
在Ucos中,打开和关闭中断主要通过OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()两个宏来进行的 - 处理器支持中断,并且能够产生定时中断(通常在10~1000Hz之间)
Ucos通过定时器的中断实现多任务的调度 - 处理器支持能够容纳一定量数据的硬件堆栈
对于一些只有10根地址线的8位控制器,芯片最多可访问1KB的存储单元,在这样的条件下移植是由困难的。 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈的指令
OSCtxSw()的工作
- 把终止任务的断电指针保存到任务堆栈中,即PC
- 把CPU通用寄存器的内容保存到任务堆栈中
- 把终止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中
- 获得待运行任务的任务控制块
- 使CPU通过任务控制块获得待运行任务的任务堆栈指针
- 把待运行任务的堆栈中的通用寄存器的内容恢复到CPU的通用寄存器中
CPU获得待运行任务的断电指针
在以上步骤中,第一项和最后一项有些麻烦,对于终止任务,应把任务的断点指针压入任务堆栈,对于待运行任务而言,应把任务堆栈的上次任务被终止时存放在堆栈中的中断指针推入PC寄存器。但是目前的处理器一般没有对PC的出栈和入栈指令。这时可以采用其他改变PC值的方法变通。即想办法引发一次中断。
Cotex_M3 移植
- Cotex-M3相关处理器采用“向下生长“的栈模式,堆栈指针SP总是指向最后一个被压入堆栈的32位整数。
函数OSPendSV()是Cortex_M3处理器进入异常服务例程时,通过一次PendSV异常中断完成在上下文切换时的用户线程模式到特权模式的切换,自动压栈了R0~R3,R12,LR(连接寄存器R14),PSR(程序状态寄存器)和PC(R15),并且在返回时自动弹出。