搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2010-12-7 18:42:22 | 显示全部楼层
回复【1楼】AVR_DIY 苹果的另一半
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2010-12-7 19:17:16 | 显示全部楼层
51单片机用Keil C51编译器情况有些特殊。

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

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

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

多任务切换需要同时处理硬件栈和软件模拟的再入栈。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 08:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表