文章目录
- 1. 发生的场景
- 2. 警告内容
- 3.警告含义
- 4.警告屏蔽解决尝试
- 5. 警告消除解决尝试
1. 发生的场景
- stm32L4系列使用数学库时遇到
2. 警告内容
Warning: L6989W: Could not apply patch sdcomp-29491-629360 to instruction VPOP {d8-d13} at offset 0x54, instruction is within an IT block and is not the last instruction for acos.o(i.__hardfp_acos).
3.警告含义
- 某些 STM32L4 器件存在 FMC(Flexible Memory Controller)的错误,其中 FMC 不支持 9 个字或更多的读取突发访问。为了防止大于 8 个字的突发访问,开发了一个特殊的链接程序补丁,用于修补某些指令,以避免大于 8 个字的突发访问。然而,如果要修补的指令位于 IT(If-Then)块内而不是该块中的最后一条指令,就会生成此警告1
4.警告屏蔽解决尝试
使用通用的警告屏蔽方式,屏蔽掉指定的警告,仅供参考,可能不生效或错误
- AC5:
- 1.使用宏命令
#pragma diag_suppress 6989 // 引发L6989W警告的代码 #pragma diag_default 6989
-
- 使用编译参数:
- –diag_suppress=<警告码>,其中警告码是编译器给出的,比如 47 和 5502。
- 1.使用宏命令
- AC6:
- 在 Keil 的配置选项中,添加 -Wno-<警告类型> 这样的命令来忽略某种警告。例如,如果你想忽略 [-Wunused-value] 警告,只需在配置界面添加 -Wno-unused-value。(但其实我也不知道这个警告是啥类型。。。)
5. 警告消除解决尝试
- 发现使用数学计算函数的
替换API
可能可以解决报错,比如acos()
替换为acosf()
,我的警告就这么没了,没了!!!。。。嘿,网上搜半天都没找到合适的办法,自己随便试试就没了,看来不能太依赖搜索,有时候得让脑子运动一下~~- acos() acosf()这俩函数的区别,都满足使用需求,当然用没问题的那个啦~
- acos() 函数接受 double 类型的参数,并返回 double 类型的结果。这个函数用于处理双精度浮点数,提供较高的精度。
- acosf() 函数接受 float 类型的参数,并返回 float 类型的结果。这个函数用于处理单精度浮点数,它在某些平台上可能比 acos() 更快,因为它不需要将输入参数和返回值从 float 转换为 double。
- acos() acosf()这俩函数的区别,都满足使用需求,当然用没问题的那个啦~
还是0错误0警告看起来舒服。。。