【问题标题】:STM8: local declared pointer on global variableSTM8:全局变量上的局部声明指针
【发布时间】:2020-10-27 12:53:12
【问题描述】:

在我的带有 Cosmic 编译器的 STM8 Disco Board 上,我尝试了以下代码并期望 '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) 的错误地址

enter image description here

【问题讨论】:

  • 您如何查看这些值?在检查值之前你确定最后一行已经执行了吗?
  • @Rafael 在此声明之后 ptr_aLocal = &a;放置此语句 printf("%d\n", ptr_a == ptr_aLocal );看看有没有输出1。
  • @Tordek:我正在使用 ST Visual Develops Debugger 查看值。运行 gcc exe 时,我使用 printf 输出值。是 ptr_aLocal = &a;已被执行。
  • @Vlad:当代码在STM8上运行时,printf应该输出到哪里?
  • 您是否禁用了所有优化?该行可能不会做任何事情,因为它正在分配一个局部变量并立即退出。

标签: c pointers


【解决方案1】:

各种旧版本的 misc 嵌入式编译器倾向于在一定程度上优化代码,即使在本应禁用优化的情况下也是如此。特别是 Cosmic 和 Codewarrior 在旧版本中有这样的怪癖。由于未使用局部变量,因此对其进行了优化。

您可以通过查看生成的汇编器亲自看到这一点 - 任何半体面的调试器都将支持汇编步骤调试。如果那里没有堆栈推送或索引寄存器存储指令,那么它被优化掉了。

您可以强制变量与volatile int *ptr_aLocal 一起使用。


与您的问题无关,在对 8 位微控制器进行编程时,应尽可能使用 uint8_t 而不是 int

【讨论】:

  • @Rafael 所以检查调试器中的反汇编。指令是否生成?
  • 在反汇编中没有生成指令ptr_aLocal = &a;。但是在代码末尾添加ptr_b = ptr_aLocal;行时,ptr_b显示变量'a'(0x106)的正确地址,尽管'ptr_aLocal'仍然包含变量a的错误地址(0x108)
  • @Rafael 发布反汇编函数。可能是局部变量存储在索引寄存器等中。或者它只是另一个经典的堆栈溢出错误。检查 SP。
  • 我更笨拙地检查了反汇编和 SP。看来ptr_aLocal = &a; 行没有生成,ptr_b = ptr_aLocal, 行是使用SP 执行的。但是,当优化设置为“禁用调试”时,为什么ptr_aLocal 被优化掉了?
  • @Rafael 因为,如前所述,各种较旧的嵌入式编译器往往具有不稳定且可疑的优化器设置……您必须询问供应商原因。
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 2014-11-24
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多