Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arm嵌入式GCC工具链-不同版本7和9_Arm_Cortex M_Arm None Eabi Gcc - Fatal编程技术网

Arm嵌入式GCC工具链-不同版本7和9

Arm嵌入式GCC工具链-不同版本7和9,arm,cortex-m,arm-none-eabi-gcc,Arm,Cortex M,Arm None Eabi Gcc,我们在Cortex-M3项目中使用基于GCC的ARM嵌入式工具链(ARM维护ARM) 我们最近在一个使用GNU11和GNU++14以及newlib nano(nano.specs)的项目中从7.2.1升级到9.3.1,优化级别设置为Og 我们面临一些奇怪的行为,突然随机一个GPIO无法再打开/关闭,如果我们使用7.2.1,这种情况不会发生。当单步执行程序以检查为什么不再切换时,所有命令都正确执行:初始化,然后将值写入GPIO。 同样值得注意的是,如果我们将优化级别更改为任何其他级别(O0、01、

我们在Cortex-M3项目中使用基于GCC的ARM嵌入式工具链(ARM维护ARM)

我们最近在一个使用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时,7.2.1和9.3.1之间发生了什么变化,新的库nano和调试优化(Og)
  • 如何解释旧版本似乎产生了可运行的二进制文件,而新版本会导致问题
  • 您如何解释,为什么只有Og会引起麻烦,而所有其他优化级别似乎都可以正常工作

非常感谢您的任何提示/输入。

很可能您的代码中存在错误。我碰巧在O3中从7切换到9时发现,使用strd和ldrd进行的一些新的优化出现了指针未对齐的问题。所以,在指责编译器之前,先搜索一下你的bug。如果您发现编译器错误的异常证据,那么我们可以讨论它,但在本例中您应该非常具体。可能吧。我根本不想责怪编译器。这正是我目前所拥有的。你有什么建议可以帮我找到bug,比如未对齐的访问。您将如何搜索它?我想到的第一件事是:您是否尝试在gpio切换指令上停止调试器,并检查寄存器是否正确写入,其他gpio寄存器是否正确配置,外围设备是否正确计时?您还可以使用调试器在运行时配置gpio,并检查级别是否更改。从那里,当你发现缺少什么时,你可以倒退到问题的根源。当您发现零件的性能不符合预期时,装配检查可能会有所帮助。OK thank you@Damianogcc不一定随着时间的推移而变得更好。从4.x/5.x到现在,输出有所下降,但这并不意味着有问题的输出,可能只是性能差异或尺寸。所以你可能有时间的问题,但你不应该对这个太敏感。您需要检查编译器输出(从每个工具中反汇编此代码),以查看差异,并查看代码是如何导致输出的。