最近闲着无聊移植了一下ucos到stc的
单片机里面,发现如下问题
void Taska(void *aa) reentrant
{
char a=0;
char b=0;
a++;
b++;
OS
timeDly(2);
}
void Taskb(void *bb) reentrant
{
char a=0;
char b=0;
a++;
b++;
OSTimeDly(2);
}
在keil中
仿真都不会得到 a和b累加的结果
观察得到的结论是两个task中的a和b地址被ucos中的其它变量使用了
只有将a和b变量定义为static 才能正常工作
但是我观察别人移植的ucos任务里面定义局部变量时没有加static限制一样正常使用 请问是什么问题? 我以前理解的都是keil中局部变量都作为静态变量分配地址的 。。。 难道局部变量keil能自动优化?
网上查资料得:任务分配的变量可以被覆盖,因为有了仿真堆栈?C_XBP 所以当任务被切换后原来的变量可能就会被新任务的某些变量覆盖 所以需要保存?C_XBP指针以便在任务切换回来的时候进行复原 因为是可重入函数,所有局部变量都会保存到仿真栈中,所以这时任务就可以正常运行起来了 不知这样说对不对
还有一个问题就是这时的任务堆栈就只保存了CP指针和?C_XBP指针以及r0-r7 PSW DPL DPH B ACC寄存器 那么任务堆栈不是就可以很小了么 反而需要把XBPSTACKTOP分配大一些才行 求指教
感谢上面的意见 不过仿真都跑步起来 还找不到问题 那在硬件上找问题更困难了点吧
一周热门 更多>