加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

uCOS-II 堆栈的理解

(2013-05-19 14:43:27)
标签:

ucos-ii

堆栈

分类: uC/OS-II

昨天给老师当助教,是uCOS-II嵌入式操作系统这门课程。这个操作系统我已经忘的差不多了,最近拿起书本啃了几天,做了几个实验,算是有些明白。杭电本科的学生算是比较认真的,学生问我的问题比较多,我说和大家一起学习,毕竟都算是初学者。

    有个女生问我OS的堆栈是怎么创建的,在任务切换前后是怎么操作的。我当时有点摸不到头脑,之前没考虑过这个问题。其实大体上说就是保存现场和恢复现场的问题。但是怎么从代码那里得到解释。

首先弄清一个概念:堆栈就是RAM里面的一段数据空间,用来保存任务的信息。堆栈指针就一个指向堆栈的一个数据指针。

我们来看看堆栈是怎么操作的。OS每个任务都有一个自己的堆栈,以便发生任务切换的时候保存CPU的数据。堆栈是在任务创建的时候开辟的,有四个参数,任务入口地址(void *task),任务参数(viod *pdada),任务堆栈的起始地址(OS_STK *ptos),任务优先级(INT16U  opt). 不论是在上下文任务切换(OSCtxSw)还是中断任务切换(OSIntCtxSw),都要将正在运行任务的数据保存到堆栈,将下一个要运行的任务的数据从堆栈中将数据恢复出来(出栈),给CPU使用。我们假设创建了两个任务Task1Task2Task1的优先级高于Task2的优先级。在创建这个两个任务的时候,在OSTaskCreate函数里会调用OSTaskStkInit 函数创建一个堆栈,也就是在RAM中开辟一段数据空间,并填入相应的数值,当然我们在第一次创建的时候,并不知道CPU的数据,只需要在相应的位置填入传入的参数即可,其他可以为零,然后并返回一个指向栈顶的一个指针。这个地址放在任务TCB的第一个成员中。如果进行任务切换,要得到数据时,可以从这里获得堆栈的地址并恢复数据(出栈)

 两个任务创建完毕,Task1开始运行,这个时候会调用汇编函数OSStartHighRdy(运行高优先级任务),将Task1的堆栈栈顶地址给SP(SP = OSTCBHighRdy->OSTCBStkPtr),然后从该地址依次出栈,将数据放到RO-R12LRPCCPSR中,SP最终指向了Task1的栈底,这时候,CPU可以使用这些数据进行运行,这时候我们看到,Task1已经开始运行了。http://s1/mw690/932ba3b9gdd0c8e86fb00&690堆栈的理解" TITLE="uCOS-II 堆栈的理解" />

 

                                    任务恢复时数据出栈

如果Task1要挂起,运行Task2.此时要进行任务切换了,此时要执行OSCtxSw函数,此函数首先做的任务就是保存数据(入栈),将RO-R12LRPCCPSR的数据给SP,请注意,之前SP指向的是Task1的栈底,CPU数据入栈后,SP指向了栈顶,并将此时SP的地址给OSTCBCur->OSTCBStkPtr (OSTCBCur->OSTCBStkPtr = SP),注意OSTCBCur就是Task1TCB,此时任务1的栈顶地址保存好了,下次发生任务切换的时候可以再从这个地址开始恢复数据。执行OSTaskSwHook后,开始将高就绪任务Task2变为当前任务(OSTCBCur = OSTCBHighRdy),修改任务的优先级,将SP的值变为Task2的栈顶地址(SP = OSTCBHighRdy->OSTCBStkPtr),然后从SP地址开始恢复数据(出栈),就像上面恢复Task1的数据一样,CPU得到数据后,开始运行,我们看到Task2开始跑起来了。

http://s5/mw690/932ba3b9gdd0c921ad754&690堆栈的理解" TITLE="uCOS-II 堆栈的理解" />
                                          任务挂起时数据入栈
    当我们在定义任务堆栈大小的时候,可以将堆栈定义的大一下,因为任务在中断的时候,不知道要保存多少临时数据。任务的挂起就像是突然被冻结一样,所有一切信息全部保存,只是不能运行而已,当数据已恢复,所有的东西又开始在被冻的断点处开始运行。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有