jishanlaike 发表于 2011-2-28 18:18:24

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

如有任务voidTask_A(void *pdata);


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

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

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

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

jishanlaike 发表于 2011-3-3 12:33:33

终于明白了。。。。

ba_wang_mao 发表于 2011-3-4 11:19:07

如有任务voidTask_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控制权
具体过程是如何的呢?

nter 发表于 2011-3-4 11:32:55

改用CortOS吧,抢占式,高效

jishanlaike 发表于 2011-3-4 12:42:00

CortOS? 我看看,看是否适合咱。。。。
ba_wang_mao
你好,任务若要用该参数,必须压栈,传递参数的局部变量和函数内局部变量不同,我以前的理解,把2者弄混了。。。。
页: [1]
查看完整版本: 最近研究uCOS,再次请大家讨论一下任务堆栈初始化问题