wujiaji818 发表于 2010-12-4 18:08:56

ucos2移植51任务中局部变量的位置

自己因为一门课程的原因要把ucos2移植到51上,看了一些资料,其中在邵贝贝老师的书里有一个问题不大想得通:从第一章范例2看,任务中使用的局部变量是使用了任务的堆栈的,但任务的堆栈是在函数外申请的全局变量,函数内局部变量是在内部申请的,这两个的空间是怎么重合的呢?自己在嵌入式这方面经验很少,感觉自己在拿以前PC编程的一些经验在套,肯定有问题,但不知在哪里……向大家求教,先感谢了~

AVR_DIY 发表于 2010-12-6 11:29:11

楼上的听说过 压栈 和出栈吗?
虽然一个任务中定义的是局部变量,但是在进行任务切换(比如中断到来进行任务切换)时,这些局部变量以及该任务下的系统堆栈都是被压入了此任务的堆栈中去了,然后将下一个就绪的优先级最高的任务的堆栈COPY到系统堆栈,这样该任务(优先级高的)就得到CPU权,开始执行!!
之所以,要把这些局部变量压入到任务的堆栈空间是因为这样才能保证每个任务下次运行继续在刚才的那个“中断”点开始执行,而不是重开始初始化局部变量再运行! 如果是这样的话,跟调用普通函数没什么两样!

wujiaji818 发表于 2010-12-7 18:42:22

回复【1楼】AVR_DIY 苹果的另一半
-----------------------------------------------------------------------

谢谢你的回答~~~这两天自己也看了一些东西,确实是如你说的那样, 一般的CPU每个任务都是有自己堆栈的,UCOS2局部变量对堆栈的占用就应该体现在压栈出栈上(寄存器什么的是我们手动压,局部变量系统自动压了吧)………………不过这样的话51就实现不了这个功能了吧?(或者说依据当下的原理不能实现)毕竟51使用的是模拟栈,每次压入栈的只是栈顶指针?C_XBP而已……
再次谢谢了额,感觉看了你的回答一下子清醒了不少^^~~

health 发表于 2010-12-7 19:17:16

51单片机用Keil C51编译器情况有些特殊。

一般的C编译器是把局部变量放在堆栈中的,函数返回,堆栈收回,局部变量失效。
但是由于51的堆栈空间太小,局部变量放入堆栈中不太现实,所以keil c51独辟蹊径,
局部变量放在内存的固定区域,就像全局变量那样。不同的是,没有调用关系的不同函数的局部变量可以共用同一块内存区域。

普通函数直接用于多任务,会由于局部变量被覆盖而出错。

可以声明为再入函数,这样的函数使用一个软件模拟的堆栈用于局部变量。

多任务切换需要同时处理硬件栈和软件模拟的再入栈。
页: [1]
查看完整版本: ucos2移植51任务中局部变量的位置