最近研究uCOS,再次请大家讨论一下任务堆栈初始化问题
如有任务voidTask_A(void *pdata);作者说必须模仿任务调用函数时,把void *pdata这个局部变量保存到栈中,
作者给的中断返回地址是任务起始地址。
假设;
Task_A被调用时,“把void *pdata这个局部变量保存到栈中”这种动作一定是通过实时在在的汇编语句完成的,这些汇编语句在任务开始地址的下面,在任务执行代码的前面,如果不是这样的话,如放在调用任务函数的前面,那么中断函数的局部变量就不好解释了,因中断可以在任何地方发生,故这些汇编代码一定放在函数开头处。而编译器在给voidTask_A(void *pdata)汇编代码时,一定在本任务函数前头加上了这些实实在在的汇编代码----即把局部变量放入堆栈中,保存返回地址。
如果是这样的话,任务执行中断返回指令,开始执行时,是从任务起始地址处执行,从任务起始地址开始执行的话,这些汇编语句不是会“把void *pdata这个局部变量保存到栈中”吗?
我的问题是:为什么还要在初始化栈时,人为压栈呢??? 终于明白了。。。。 如有任务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控制权
具体过程是如何的呢? 改用CortOS吧,抢占式,高效 CortOS? 我看看,看是否适合咱。。。。
ba_wang_mao
你好,任务若要用该参数,必须压栈,传递参数的局部变量和函数内局部变量不同,我以前的理解,把2者弄混了。。。。
页:
[1]