keil局部变量分配地址问题

2019-07-15 21:00发布

最近闲着无聊移植了一下ucos到stc的单片机里面,发现如下问题
void Taska(void *aa) reentrant
{
char a=0;
char b=0;
a++;
b++;
OStimeDly(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能自动优化?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
yoeksome
1楼-- · 2019-07-16 02:05
自己顶 不要掉下去了
zhangguosong4
2楼-- · 2019-07-16 05:31
不错,下载下来看看。。。
yoeksome
3楼-- · 2019-07-16 08:14
自己再顶着
hobbye501
4楼-- · 2019-07-16 13:11
仿真不是万能的 你可以添加几个全局变量 把局部变量的值付给他 查看变量! 用不用static 要看你的功能需求!
A670521546
5楼-- · 2019-07-16 18:37
 精彩回答 2  元偷偷看……
yoeksome
6楼-- · 2019-07-16 19:52
自己搞错了 忽略了函数重入部分的堆栈指针?C_XBP 以为这个部分keil会自动完成
网上查资料得:任务分配的变量可以被覆盖,因为有了仿真堆栈?C_XBP 所以当任务被切换后原来的变量可能就会被新任务的某些变量覆盖 所以需要保存?C_XBP指针以便在任务切换回来的时候进行复原 因为是可重入函数,所有局部变量都会保存到仿真栈中,所以这时任务就可以正常运行起来了 不知这样说对不对
还有一个问题就是这时的任务堆栈就只保存了CP指针和?C_XBP指针以及r0-r7 PSW DPL DPH B ACC寄存器 那么任务堆栈不是就可以很小了么 反而需要把XBPSTACKTOP分配大一些才行 求指教
感谢上面的意见 不过仿真都跑步起来 还找不到问题 那在硬件上找问题更困难了点吧

一周热门 更多>