uCOS-II 堆栈的理解

标签:
ucos-ii堆栈 |
分类: uC/OS-II |
昨天给老师当助教,是uCOS-II嵌入式操作系统这门课程。这个操作系统我已经忘的差不多了,最近拿起书本啃了几天,做了几个实验,算是有些明白。杭电本科的学生算是比较认真的,学生问我的问题比较多,我说和大家一起学习,毕竟都算是初学者。
首先弄清一个概念:堆栈就是RAM里面的一段数据空间,用来保存任务的信息。堆栈指针就一个指向堆栈的一个数据指针。
我们来看看堆栈是怎么操作的。OS每个任务都有一个自己的堆栈,以便发生任务切换的时候保存CPU的数据。堆栈是在任务创建的时候开辟的,有四个参数,任务入口地址(void *task),任务参数(viod *pdada),任务堆栈的起始地址(OS_STK *ptos),任务优先级(INT16U
如果Task1要挂起,运行Task2.此时要进行任务切换了,此时要执行OSCtxSw函数,此函数首先做的任务就是保存数据(入栈),将RO-R12,LR,PC,CPSR的数据给SP,请注意,之前SP指向的是Task1的栈底,CPU数据入栈后,SP指向了栈顶,并将此时SP的地址给OSTCBCur->OSTCBStkPtr (OSTCBCur->OSTCBStkPtr = SP),注意OSTCBCur就是Task1的TCB,此时任务1的栈顶地址保存好了,下次发生任务切换的时候可以再从这个地址开始恢复数据。执行OSTaskSwHook后,开始将高就绪任务Task2变为当前任务(OSTCBCur = OSTCBHighRdy),修改任务的优先级,将SP的值变为Task2的栈顶地址(SP = OSTCBHighRdy->OSTCBStkPtr),然后从SP地址开始恢复数据(出栈),就像上面恢复Task1的数据一样,CPU得到数据后,开始运行,我们看到Task2开始跑起来了。