ARM GCC 无法为 STM32F4 创建工作二进制文件,大量废弃代码

问题描述 投票:0回答:1

我已经将所有 STM32 项目迁移到 Codeblocks IDE 和 GCC 编译器 (arm-none-eabi)。 该过程使用 STM 的 CubeMX 生成基本代码,然后将所有内容与代码块项目文件、.s、.ld 等合并到适当的文件夹中。

注意到我使用 cortexM0 的项目正在构建并运行良好,但是对于 cortexM4 项目(STM32F401RE),运行构建的可执行文件时会发生很多疯狂的事情,因此我在这里提出问题。

我的猜测是我没有正确调用 GCC 或者某个地方配置错误。

如“定义”

STM32F401xE

作为“编译器选项”:

-mcpu=cortex-m0(注意:应该是-mcpu=cortex-m4) -f函数部分 -fdata-部分 -fno-通用 -s

作为“链接器选项”:

-Wl,--gc-部分 -Wl,-Map,默认/ggmeg.map -T ./STM32F401RETx_FLASH.ld -Wl,--打印内存使用情况,--gc-sections,--relax

任何帮助表示赞赏。 谢谢你,

请注意,我没有实时调试,因为我使用旧的 segger Jlink 作为 SWD 接口。我的第一个调试步骤是 - HAL_Init() 之后;系统时钟_配置(); MX_GPIO_Init(); - 将 GPIO 设置为 1,然后执行 while(1){},这样我就知道我的代码到目前为止已执行。

现在是野生动物:

  • 使用 -mcpu=cortex-m4 进行编译,代码在达到我的观点之前就崩溃了。
  • 使用 -mcpu=cortex-m0 进行编译(注意:我使用的 STM32 是 M4),效果更好,但是...
  • 如果我在 MX_GPIO_Init() 末尾和内部将 GPIO 设置为 1; GPIO 设置为 1,太棒了。
  • 如果我在 MX_GPIO_Init() 之后将 GPIO 设置为 1;它在到达我的部分之前就崩溃了。

我的结论是MX_GPIO_Init();返回时崩溃,表明存在严重问题。

gcc crash arm stm32 cortex-m
1个回答
0
投票

在使用 GCC 标志进行反复试验后,发现了问题:

-mcpu=cortex-m4 还必须传递给链接器(编译器和链接器)。

如果使用 -mcpu=cortex-m0 标志为 STM32F4 或 STM32L4 编译 CubeMX 代码。 CubeMX 库在主要问题上出现故障,包括无法初始化 PLL,并且程序将以 4MHz(引导加载程序的速度)运行。因此,在我们的例子中,systick 的运行速度慢了 20 倍,给人一种程序崩溃的错误印象(事实并非如此)。这个问题的原因尚不清楚,因为没有编译错误,M4 应该能够正常执行 M0 指令。

这仅影响皮层 M4,而不影响 M0。

谢谢你。

© www.soinside.com 2019 - 2024. All rights reserved.