zhonggp 发表于 2012-10-22 12:52:15

初始化OS任务栈的问题

在一些任务初始化的时候我们常常这样写:
void CreatTask(void *pFun,unsigned char *stk)
{
//我们家是stk的值是 0x1500
//下面在栈顶保存函数指针
*stk-- = pFun >> 8;
*stk-- = pFun&0xFF;
//此时stk的值是 0x14FE
__SP = stk;

};
void fun1()
{
while(1)
{
printf("1111111111111111111\r\n");
}
}
void main()
{
unsigned char stkbuf;
CreatTask(fun1,stkbuf);

}

问题在于__SP = stk;返回后PC是如何知道stk+2位置的??

detail2012 发表于 2012-10-27 15:55:36

没听懂你什么意思...

zhonggp 发表于 2012-10-30 23:15:34

detail2012 发表于 2012-10-27 15:55 static/image/common/back.gif
没听懂你什么意思...

就是我在初始化我自己建立的任务栈的时候,__SP的赋值应该是怎么判定的,在进入之后很多代码都是些*stk-- = x;之类的语句,这些都是对栈指针进行修改,最后再将修改后的指针赋值给SP.
我的问题就在于stk减多少次是怎么去判断的.
SP指针赋值后怎么找到PC指针的.

不知道这样表达清楚不.
谢谢!

chinmel 发表于 2012-10-30 23:33:12

楼主的MCU 指针是16位的?

chinmel 发表于 2012-10-30 23:43:44

本帖最后由 chinmel 于 2012-10-30 23:45 编辑

栈是8位的,指针是16位,并且栈是向下增长的满栈。那似乎是8位的MCU?
main函数在调用了creat_task函数后,在creat_task函数里面,这时栈的情况,地址从低到高依次是:

X                        低地址
X                        高地址
main函数地址,       SP当前指向此处

然后,经过开头那两部操作,先是把函数指针的高8位入栈,再把它的低8位入栈,此时栈的情况是:


fun1的低8位            SP当前指向此处
fun1的高8位            低地址
main函数的地址      高地址

那么返回时自然是先返回fun1的地址了 于是任务就切换了

=========================================
编辑原因:写反了栈增长方向,特改之

zhonggp 发表于 2012-10-31 00:26:37

chinmel 发表于 2012-10-30 23:43 static/image/common/back.gif
栈是8位的,指针是16位,并且栈是向下增长的满栈。那似乎是8位的MCU?
main函数在调用了creat_task函数后, ...

谢谢你的指导,\我大概理解了你的意思.
我上面的问题没有针对的MCU,那是在AVR的OS上看到的代码但是不理解.
但是在ucosii里面那些寄存器的保护有什么依据吗?如下面代码: 代码是飞思卡尔DG128的芯片


*--stk = opt;                        //该一个字节为特殊选项,存用户参数
    *--stk = (INT16U)task;                                     //PC入栈   
    *--stk = (INT16U)(0x1122);                 //Y
    *--stk = (INT16U)(0x3344);                             //X   
    ((INT8U *)stk)--;
    *(INT8U *)stk = (INT8U)(((INT16U)pdata)>>8); //A
    ((INT8U *)stk)--;
    *(INT8U *)stk = (INT8U)(pdata);             //B
    ((INT8U *)stk)--;
    *(INT8U *)stk = (INT8U)(0x00);       //CCR
    ((INT8U *)stk)--;
    *(INT8U *)stk = *(INT8U *)pdata;   //只有PPAGE一个内容       

至于Y寄存器,X寄存器,那些顺序上面的要求以及在栈上的偏移值.

谢谢!

chinmel 发表于 2012-10-31 09:40:50

zhonggp 发表于 2012-10-31 00:26 static/image/common/back.gif
谢谢你的指导,\我大概理解了你的意思.
我上面的问题没有针对的MCU,那是在AVR的OS上看到的代码但是不理解. ...

依据的话 建议你去看看任务控制块的结构

zhonggp 发表于 2012-10-31 12:44:49

chinmel 发表于 2012-10-31 09:40 static/image/common/back.gif
依据的话 建议你去看看任务控制块的结构

昨天完成按照你说的,我通过仿真理解了这块的内容,谢谢你了.

chinmel 发表于 2012-10-31 12:50:58

zhonggp 发表于 2012-10-31 12:44 static/image/common/back.gif
昨天完成按照你说的,我通过仿真理解了这块的内容,谢谢你了.

嘿嘿 没事 能帮到你最好了
页: [1]
查看完整版本: 初始化OS任务栈的问题