初始化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 static/image/common/back.gif
没听懂你什么意思...
就是我在初始化我自己建立的任务栈的时候,__SP的赋值应该是怎么判定的,在进入之后很多代码都是些*stk-- = x;之类的语句,这些都是对栈指针进行修改,最后再将修改后的指针赋值给SP.
我的问题就在于stk减多少次是怎么去判断的.
SP指针赋值后怎么找到PC指针的.
不知道这样表达清楚不.
谢谢! 楼主的MCU 指针是16位的? 本帖最后由 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的地址了 于是任务就切换了
=========================================
编辑原因:写反了栈增长方向,特改之 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寄存器,那些顺序上面的要求以及在栈上的偏移值.
谢谢! zhonggp 发表于 2012-10-31 00:26 static/image/common/back.gif
谢谢你的指导,\我大概理解了你的意思.
我上面的问题没有针对的MCU,那是在AVR的OS上看到的代码但是不理解. ...
依据的话 建议你去看看任务控制块的结构 chinmel 发表于 2012-10-31 09:40 static/image/common/back.gif
依据的话 建议你去看看任务控制块的结构
昨天完成按照你说的,我通过仿真理解了这块的内容,谢谢你了. zhonggp 发表于 2012-10-31 12:44 static/image/common/back.gif
昨天完成按照你说的,我通过仿真理解了这块的内容,谢谢你了.
嘿嘿 没事 能帮到你最好了
页:
[1]