0

我们将基于 GCC 的 ARM Embedded Toolchain 用于我们的 Cortex-M3 项目(由 ARM 维护的 arm-none-eabi)。

我们最近在一个使用 GNU11 和 GNU++14 以及 newlib-nano (nano.specs) 的项目中从 7.2.1 升级到了 9.3.1,优化级别设置为 Og。

我们面临一些奇怪的行为,突然随机一个 GPIO 不再打开/关闭,如果我们使用 7.2.1,则不会发生这种情况。当单步执行程序检查为什么它不再切换时,所有命令都正确执行:初始化,然后将值写入 GPIO。同样值得注意的是,如果我们将优化级别更改为任何其他级别(O0、01、02、0s),它会再次起作用,似乎 9.3.1 的 Og 会破坏某些东西。

然后我们继续并开始搜索我们必须从优化中排除的代码部分(哪个函数或哪个指令),以便它再次变得可运行。在那里我们没有找到解决方案,因为它不是一个函数调用。通过缩小随机范围,只需禁用与访问GPIO无关的随机功能的优化,它就可以再次工作。

目前我们不知道如何进一步处理此事,以找到这种行为的根本原因。

问题:

  • 在 Gnu11/Gnu++14、newlib-nano 和优化调试 (Og) 方面,7.2.1 和 9.3.1 之间有什么变化?
  • 如何解释旧版本似乎生成了一个可运行的二进制文件,而新版本会导致问题?
  • 你怎么解释,为什么只有 Og 会造成麻烦,而所有其他优化级别似乎都可以正常工作?

高度赞赏任何提示/输入。

4

0 回答 0