[STM32F4] 编译器优化未能生成正确的代码。

[复制链接]
320|8
yunfu1117 发表于 2025-10-13 22:05 | 显示全部楼层 |阅读模式
我在 newlib_lock_glue.c 中遇到了一个奇怪的现象。在少数设备上,当开启优化时,代码无法正确执行。

在我看来,优化似乎丢弃了某些语句。该函数是从 sprintf 调用的。

在项目中用了FreeRTOS 和线程安全策略 #4(允许在中断中使用锁)。

反汇编代码中缺少返回指令,并且在 if 代码块中没看到实现返回的指令。

以下是带有反汇编和调用堆栈的代码。
2398768ed069c1e5c6.png

没有头绪了。

代码newlib_lock_glue.c 是由 CubeIDE 生成的。

以下是我的 gcc 标志
-mcpu=cortex-m7
-std=gnu11
-g3
-DUSE_HAL_DRIVER
-DSTM32H7A3xx
-DSTM32_THREAD_SAFE_STRATEGY=4
-c
-Os
-ffunction-sections
-fdata-sections
-Wall
-Wextra
-Wshadow
-Wundef
-fstack-usage
--specs=nano.specs
-mfpu=fpv5-d16
-mfloat-abi=hard
-mthumb

solty 发表于 2025-10-14 15:53 | 显示全部楼层
代码中可能存在未定义行为,导致编译器优化时做出错误假设。
spicy 发表于 2025-10-14 16:53 | 显示全部楼层
编译器 Bug吧
stormwind123 发表于 2025-10-14 19:54 | 显示全部楼层
链接顺序或内存模型问题
七毛钱 发表于 2025-10-14 19:55 | 显示全部楼层
局部禁用优化,在关键函数前添加 __attribute__((optimize("O0"))),强制 GCC 不优化该函。
又见江南雨 发表于 2025-10-14 20:55 | 显示全部楼层
全局降低优化级别,将 -Os 改为 -O0 或 -O1看看。
没有太阳的晴天 发表于 2025-10-14 22:56 | 显示全部楼层
升级 GCC,更新 FreeRTOS 和 CubeMX
classroom 发表于 2025-10-14 15:57 | 显示全部楼层
检查未定义行为如空指针、内存分配失败。
cr315 发表于 2025-10-14 22:57 | 显示全部楼层
局部禁用优化(__attribute__((optimize("O0"))))以验证是否为优化器 Bug。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

64

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部