搜索
bottom↓
回复: 4

最近研究uCOS,再次请大家讨论一下任务堆栈初始化问题

[复制链接]

出0入0汤圆

发表于 2011-2-28 18:18:24 | 显示全部楼层 |阅读模式
如有任务  void  Task_A(void *pdata);


作者说必须模仿任务调用函数时,把void *pdata这个局部变量保存到栈中,
作者给的中断返回地址是任务起始地址。

假设;
    Task_A被调用时,“把void *pdata这个局部变量保存到栈中”这种动作一定是通过实时在在的汇编语句完成的,这些汇编语句在任务开始地址的下面,在任务执行代码的前面,如果不是这样的话,如放在调用任务函数的前面,那么中断函数的局部变量就不好解释了,因中断可以在任何地方发生,故这些汇编代码一定放在函数开头处。而编译器在给void  Task_A(void *pdata)汇编代码时,一定在本任务函数前头加上了这些实实在在的汇编代码----即把局部变量放入堆栈中,保存返回地址。

    如果是这样的话,任务执行中断返回指令,开始执行时,是从任务起始地址处执行,从任务起始地址开始执行的话,这些汇编语句不是会“把void *pdata这个局部变量保存到栈中”吗?

我的问题是:为什么还要在初始化栈时,人为压栈呢???

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-3-3 12:33:33 | 显示全部楼层
终于明白了。。。。

出0入0汤圆

发表于 2011-3-4 11:19:07 | 显示全部楼层
如有任务  void  Task_A(void *pdata);

作者说必须模仿任务调用函数时,把void *pdata这个局部变量保存到栈中,
作者给的中断返回地址是任务起始地址。
----------------------------------------------------------------------

   注意:你所谓的“void *pdata这个局部变量”是Task_A 任务的地址。

   当使用OSTaskCreate()创建任务A时,把void *pdata这个局部变量保存到栈中(即把Task_A 任务函数的起始地址保存到堆栈中),这样,当 Task_A 任务 第一次得到CPU的控制权时,操作系统会将IP(指令寄存器)指向“Task_A 任务的起始地址”,这样就实现了任务切换。


  请自己分析以下两种情况:
     (1)、Task_A 任务被中断服务程序打断
     (2)、Task_A 任务被高优先级任务剥夺CPU控制权
  具体过程是如何的呢?

出0入0汤圆

发表于 2011-3-4 11:32:55 | 显示全部楼层
改用CortOS吧,抢占式,高效

出0入0汤圆

 楼主| 发表于 2011-3-4 12:42:00 | 显示全部楼层
CortOS? 我看看,看是否适合咱。。。。
ba_wang_mao
你好,任务若要用该参数,必须压栈,传递参数的局部变量和函数内局部变量不同,我以前的理解,把2者弄混了。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-16 10:23

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

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