[STM32F7] 多个优化选项下的错误代码生成

[复制链接]
338|11
lvluoo 发表于 2025-9-28 22:26 | 显示全部楼层 |阅读模式
-O2、-O3、-Ofast 优化时,编译器在执行路径中插入了 udf 255 指令,导致出现硬件故障(HF)。
1154                                      pQueryChunk->pSrcDriver = pParser->pSourceDriver;
080157f4:   ldr.w   r3, [r9, #20]
080157f8:   str.w   r3, [r11, #12]
080157fc:   b.n     0x801556e <httpG4WebPage+1130>
080157fe:   movs    r3, #0
08015800:   ldr.w   r2, [r9, #20]
08015804:   str     r2, [r3, #12]
08015806:   udf     #255    ; 0xff   <---------- obviously wrong
                        if (pQueryChunk && ioIsValid(pRawChunk))
                        {
                                pQueryChunk->pSrcDriver = pRawChunk->pSrcDriver;
                        }                       
                        else if (pParser)
                        {
                                pQueryChunk->pSrcDriver = pParser->pSourceDriver;
                        }
GNU C11 (GNU Tools for STM32 10.3-2021.10.20211105-1100) version 10.3.1 20210824 (release) (arm-none-eabi)
        compiled by GNU C version 7.3-win32 20180312, GMP version 6.1.0, MPFR version 3.1.4, MPC version 1.0.3, isl version isl-0.18-GMP
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
COLLECT_GCC_OPTIONS='-mcpu=cortex-m4' '-std=gnu11' '-g3' '-D' '_GNU_SOURCE=1' '-D' 'USE_HAL_DRIVER' '-D' '_DEBUG=1' '-D' 'DEBUG_RUN_WITHOUT_CHECKS=1' '-D' 'DEBUGFILEWRITE=0' '-D' 'DEBUG=0' '-D' 'SLOWSPIDEBUG=0' '-D' 'USE_FULL_ASSERT' '-D' '__USE_SIMPLE_SWO=0' '-D' 'USE_SWOTRACE=1' '-D' 'AMD64' '-D' 'HSE_VALUE=16000000UL' '-D' 'USE_FULL_LL_DRIVER=0' '-D' 'BOOTLOADER_VERSION=1' '-D' 'ALLOW_SOFTWARE_BKPTS=1' '-D' 'ARM_MATH_CM4' '-D' 'FORCE_CUBE_USB' '-D' 'USE_EMBEDDED_PHY=1' '-D' 'USE_USB_OTG_FS=1' '-D' 'BITMAP_LCD_ALLOWED=0' '-D' 'LCDGUI_ALLOWED=0' '-D' 'LCD_ALLOWED=0' '-D' 'GPS_ALLOWED=0' '-D' 'STM32L4S9xx' '-D' 'STM32L' '-D' 'INCLUDE_SLEEP_FUNCTIONS=1' '-D' 'COMPILE_FOR_EWB=1' '-D' 'COMPILE_USE_PL4S=1' '-c' '-Ofast' '-ffunction-sections' '-fdata-sections' '-Wall' '-v' '-fstack-usage' '-MMD' '-MP' '-MF' '-MT'  '-specs=nano.specs' '-mfpu=fpv4-sp-d16' '-mfloat-abi=hard' '-mthumb' '-o'  '-mlibarch=armv7e-m+fp' '-march=armv7e-m+fp'
-march=armv7e-m -mfloat-abi=hard -mfpu=fpv4-sp-d16 -meabi=5 -o Libraries/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.o C:\Users\Piotr\AppData\Local\Temp\ccHP5ygN.s
GNU assembler version 2.36.1 (arm-none-eabi) using BFD version (GNU Tools for STM32 10.3-2021.10.20211105-1100) 2.36.1.20210621
示例:这是一个相当大的项目(约 800 个源文件),生成了 800k 的代码。这使得集成开发环境(IDE)无法使用。只有 -O0 和 -Og 选项能够避免插入 udf 指令。

公羊子丹 发表于 2025-9-29 07:26 | 显示全部楼层
我也遇到过类似情况,开启 -O2 以上优化后总是莫名跑飞,感觉 GCC 优化器有 bug。
周半梅 发表于 2025-9-29 07:27 | 显示全部楼层
你这个 udf 255 看起来就是编译器直接插了非法指令,怀疑是优化器把某个空指针情况没处理好。
帛灿灿 发表于 2025-9-29 07:28 | 显示全部楼层
建议先缩小代码范围,把可疑函数单独提出来测试,看是不是优化误判。
童雨竹 发表于 2025-9-29 07:29 | 显示全部楼层
换个版本的 arm-none-eabi-gcc 试试,我印象里 9.x 系列有些版本就没问题。
万图 发表于 2025-9-29 07:30 | 显示全部楼层
可以试下在有问题的函数上加 __attribute__((optimize("O0"))) 来屏蔽全局优化。
Wordsworth 发表于 2025-9-29 07:31 | 显示全部楼层
你这里 -march 和 -mcpu 感觉有点怪,F7 应该用 cortex-m7,而不是 cortex-m4。
Bblythe 发表于 2025-9-29 07:32 | 显示全部楼层
我之前在 F429 上用 -Ofast 也遇到过非法指令,最后是退回 -O1 才稳定。
Pulitzer 发表于 2025-9-29 07:33 | 显示全部楼层
建议加上 -fno-strict-aliasing 试试,有时候优化器会因为别名分析搞错。
Uriah 发表于 2025-9-29 07:35 | 显示全部楼层
800 个源文件这么大,遇到边缘 case 也正常,最好先用较低优化编译,再局部热点函数单独提速。
Clyde011 发表于 2025-9-29 07:36 | 显示全部楼层
如果能最小化出触发 udf 的代码,直接提给 ARM GCC 社区,可能是已知 bug。
probedog 发表于 2025-9-29 11:07 | 显示全部楼层
可能编译器优化错误。
七毛钱 发表于 2025-9-29 12:07 | 显示全部楼层
高优化级别可能导致编译器错误地优化掉某些变量或代码路径,导致非法内存访问。
七毛钱 发表于 2025-9-29 13:08 | 显示全部楼层
pQueryChunk->pSrcDriver = pParser->pSourceDriver; 可能涉及空指针解引用或未初始化的指针,但编译器在高优化级别下可能错误地假设某些条件***为真/假。
内政奇才 发表于 2025-9-29 14:08 | 显示全部楼层
用的 arm-none-eabi-gcc 10.3.1 可能存在优化器 Bug
海滨消消 发表于 2025-9-29 16:09 | 显示全部楼层
代码依赖未定义行为高优化级别可能触发错误优化。
豌豆爹 发表于 2025-9-29 17:09 | 显示全部楼层
估计得降低优化级别。
麻花油条 发表于 2025-9-29 17:10 | 显示全部楼层
用 volatile 防止优化
豌豆爹 发表于 2025-9-29 19:11 | 显示全部楼层
升级到最新版 arm-none-eabi-gcc
classroom 发表于 2025-9-29 19:11 | 显示全部楼层
用 __attribute__((noinline)) 防止关键函数被优化
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

89

帖子

0

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