如何解决STM8:全局变量
在带有Cosmic编译器的STM8 disco开发板上,我尝试下面的代码,并期望'ptr_a'和'ptr_aLocal'相同:
int a,b,*ptr_a,*ptr_b;
void main()
{
int *ptr_aLocal;
a = 4;
b = 5;
ptr_a = &a;
ptr_b = &b;
ptr_aLocal = &a;
}
但是,'ptr_a'具有变量'a'的正确地址,而'ptr_aLocal'包含错误的地址。
使用gcc编译相同的代码时,“ ptr_a”和“ ptr_aLocal”与预期的一样。
在main中声明局部指针时,这里出现了什么问题?
感谢您的帮助。 拉斐尔
编辑:
现在我真的很困惑: 添加行“ ptr_b = ptr_aLocal;”时在代码末尾,ptr_b显示变量'a'(0x106)的正确地址,尽管'ptr_aLocal'仍然包含变量a(0x108)的错误地址
解决方法
各种杂项嵌入式编译器的较早版本都倾向于对代码进行某种程度的优化,即使据说优化被禁用。特别是Cosmic和Codewarrior在较旧的版本中有这样的怪癖。由于未使用局部变量,因此已对其进行优化。
您可以通过查看生成的汇编器来亲自查看-任何体面的调试器都将支持汇编步骤调试。如果那里没有堆栈推入或索引寄存器存储指令,则将其优化掉。
您可以强制变量与volatile int *ptr_aLocal
一起使用。
与您的问题无关,在对8位微控制器进行编程时,应尽可能使用uint8_t
而不是int
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。