MadCat 发表于 2010-8-5 20:10:12

UCOS的局部变量是如何保存的?

刚开始学UCOS,有个问题不明白。

UCOS中在切换任务中是如何保存各个任务的局部变量的?我看到它切换压盏时只是把积存器的值压了进去。

局部变量不是保存在RAM中么,UCOS如何保证它不会被别的任务中的数据覆盖掉呢?

june4th 发表于 2010-8-5 20:14:33

任务永远不返回,各任务的局部变量当然不会被覆盖,当然任务调用的子程序里面的局部变量就保不住了。

stm8s103 发表于 2010-8-5 22:46:42

NO,
局部变量时放在堆栈或者寄存器里。
任务切换出去时,把寄存器保存到的堆栈,
切换回来的时候,从堆栈恢复寄存器,

任务上下文切换实际就是任务堆栈切换来,切换去。
每个任务的堆栈都是单独分配,不会发生覆盖,当然,要分配足够的空间才行。

june4th 发表于 2010-8-5 23:35:05

回复【2楼】stm8s103
no,
局部变量时放在堆栈或者寄存器里。
任务切换出去时,把寄存器保存到的堆栈,
切换回来的时候,从堆栈恢复寄存器,
任务上下文切换实际就是任务堆栈切换来,切换去。
每个任务的堆栈都是单独分配,不会发生覆盖,当然,要分配足够的空间才行。

-----------------------------------------------------------------------

对于规范的C语言来说,你的说法肯定是错误的。
任务并没有返回上级调用函数,局部变量空间会保留在堆栈中。任务仅仅是把时间上的控制权交给了OS。
对于多种ARM移植的ucos-ii,Context切换函数OSCtxSw根本不做任务堆栈保护。

对于“不规范”的C语言,大部分8位单片机C语言都是如此,除非另行声明可重入(reentrance)属性,局部变量是静态分配的。这是因为8位单片机的间址(indirectly address)和变址(index address)指令匮乏,RAM太小,如果完全按照C语言规范来做的话,代码效率过于低下,在这种情况下,如果让我来做ucosii,会按照你的思路来完成的。事实上,我认为这些单片机没有足够运行ucosii的资源,所以从来没有研究过。
页: [1]
查看完整版本: UCOS的局部变量是如何保存的?