keil局部变量分配地址问题
时间:10-02
整理:3721RD
点击:
最近闲着无聊移植了一下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能自动优化?
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能自动优化?
自己顶 不要掉下去了
不错,下载下来看看。
自己再顶着
仿真不是万能的 你可以添加几个全局变量 把局部变量的值付给他 查看变量! 用不用static 要看你的功能需求!
小编可以参考下这篇关于Keil下的C51的内存分配和优化的帖子http://bbs.elecfans.com/jishu_412923_1_1.html
自己搞错了 忽略了函数重入部分的堆栈指针?C_XBP 以为这个部分keil会自动完成
网上查资料得:任务分配的变量可以被覆盖,因为有了仿真堆栈?C_XBP 所以当任务被切换后原来的变量可能就会被新任务的某些变量覆盖 所以需要保存?C_XBP指针以便在任务切换回来的时候进行复原 因为是可重入函数,所有局部变量都会保存到仿真栈中,所以这时任务就可以正常运行起来了 不知这样说对不对
还有一个问题就是这时的任务堆栈就只保存了CP指针和?C_XBP指针以及r0-r7 PSW DPL DPH B ACC寄存器 那么任务堆栈不是就可以很小了么 反而需要把XBPSTACKTOP分配大一些才行 求指教
感谢上面的意见 不过仿真都跑步起来 还找不到问题 那在硬件上找问题更困难了点吧
设置好STARTUP.A51中的XBPSTACK和XBPSTACKTOP 已经可以运行在STC15L2K16S上面了 不过还有很多疑问没解决 上面那个仿真栈中的数据与任务堆栈的问题还是不懂 求指教