ST意法半导体
直播中

李梅

8年用户 1440经验值
私信 关注
[问答]

请问STM32L4出现Warning:L6989W怎么解决?

Warning: L6989W: Could not apply patch sdcomp-29491-629360 to instruction VPOP     {d8-d15} at offset 0xf4, instruction is within an IT block and is not the last instruction for log.o(i.__hardfp_log).

回帖(1)

李鸿洋

2025-3-21 17:56:14

出现STM32L4的编译警告L6989W通常与ARM工具链的补丁应用问题相关,尤其是在处理浮点指令时。以下是逐步解决方案:


问题原因


警告指出链接器无法在log.o__hardfp_log函数中对VPOP {d8-d15}指令应用补丁,因为该指令位于IT条件块(If-Then)内部且不是最后一条指令。IT块要求条件执行的指令必须遵循特定结构,导致补丁无法安全修改代码。




解决方案




  1. 更新工具链



    • 升级ARM GCC编译器:确保使用最新版本的ARM工具链(如Arm GNU Toolchain),旧版本可能缺失针对Cortex-M4浮点处理的优化补丁。

    • 更新STM32Cube库:通过STM32CubeMX或官网下载最新固件包,替换旧的数学库(如libarm_cortexM4lf_math.a)。




  2. 调整编译器选项



    • 修改浮点ABI设置

      在编译器选项中明确指定浮点参数,确保所有文件使用相同的ABI(Application Binary Interface):  
      -mfloat-abi=hard -mfpu=fpv4-sp-d16

      检查项目中是否混用了softfphard,需统一为hard


    • 降低优化级别

      尝试将优化级别从-O2/-Os改为-O1,避免激进优化生成IT块:
      -O1

    • 禁用特定优化(可选):

      添加-fno-conditional-execution(如果编译器支持),但ARM Thumb-2通常需要IT块,可能无效。




  3. 替换数学库实现



    • 使用Newlib-nano的软浮点实现

      在链接器选项中替换数学库,避免硬件浮点:
      --specs=nano.specs -lm

      但会牺牲性能。


    • 重新编译数学库

      若使用自定义数学库,确保以正确选项编译,如:
      -mfloat-abi=hard -mfpu=fpv4-sp-d16 -O2




  4. 检查汇编代码



    • 反汇编分析

      通过arm-none-eabi-objdump -d log.o查看__hardfp_log的汇编,确认VPOP是否在IT块中间。例如:
      ITTE NE
      VPOPNE {d8-d10}
      VPOPNE {d11-d13}  ; 非最后一条指令触发警告
      VPOPNE {d14-d15}

      若存在此类结构,需调整代码生成策略。





  5. 联系ST技术支持



    • 提供完整工程配置和复现步骤,询问是否有已知补丁或更新。






临时规避


若警告不影响功能,可通过链接器选项忽略:


-Wl,--no-warn

但需确保运行时无异常。




总结


优先尝试更新工具链和库,并统一浮点编译选项。若问题仍存,检查汇编代码或替换数学库。多数情况下,升级工具链或调整优化级别即可解决。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分