GCC Cortex-M4-mfpu=vfpv4与-mfpu=fpv4-sp-d16

GCC Cortex-M4-mfpu=vfpv4与-mfpu=fpv4-sp-d16,gcc,floating-point,arm,cortex-m,Gcc,Floating Point,Arm,Cortex M,我在Kinetis Design Studio中使用飞思卡尔K22(Cortex-M4F),其中包括一个GNU工具链。我试图使用Invense提供的仅二进制的库,他们使用GCC编译了它,以便在Cortex-M4F上使用编译器的CPU选项“-mcpu=Cortex-m4-mthumb-mfloat abi=hard-mfpu=vfpv4” 飞思卡尔工具链默认为“-mcpu=cortex-m4-mthumb-mfloat abi=hard-mfpu=fpv4-sp-d16”。当我尝试将我的程序链接到

我在Kinetis Design Studio中使用飞思卡尔K22(Cortex-M4F),其中包括一个GNU工具链。我试图使用Invense提供的仅二进制的库,他们使用GCC编译了它,以便在Cortex-M4F上使用编译器的CPU选项“-mcpu=Cortex-m4-mthumb-mfloat abi=hard-mfpu=vfpv4”

飞思卡尔工具链默认为“-mcpu=cortex-m4-mthumb-mfloat abi=hard-mfpu=fpv4-sp-d16”。当我尝试将我的程序链接到供应商的仅二进制库时,会出现如下链接错误:

c:/freescale/kds_1.1.1/toolchain/bin/。/lib/gcc/arm none eabi/4.8.0/。/../../../../../arm none eabi/bin/ld.exe:错误:./startup/startup.o使用VFP寄存器参数,22F_eval_spi_to_invense_CHECKED_IN.elf不使用 c:/freescale/kds_1.1.1/toolchain/bin/./lib/gcc/arm none eabi/4.8.0/../../../../../../../arm none eabi/bin/ld.exe:无法合并文件的目标特定数据。/startup/startup.o

我可以为-mfpu=vfpv4重建Kinetis平台库,但仍然会出现链接错误,可能是因为其他Kinetis库是使用 “-mfpu=fpv4-sp-d16”


由于两者都是针对带有FPU的Cortex-M4的,因此vpfv4和fpv4-sp-d16的GCC生成代码之间是否存在实际差异?它们实际上是不兼容的,还是链接器过于迂腐?

使用“vfpv4”似乎完全是错误的-如果编译器真的认为它可以使用“full”vfpv4所暗示的任何双精度操作或寄存器16-31,那么它将给您无法工作的代码。我不知道是否还涉及到其他魔法(例如交叉检查-mcpu选项),我同意,但我没有任何选择vfpv4;这是Invensense在为Cortex-M4F(在他们的例子中是STM32F4)编译时使用的。我认为他们使用float而不是double编写所有代码,因此实际上不应该包含任何双精度指令。由于已知代码在Cortex-M4F上工作,因此我将尝试编写一个脚本,将供应商库中每个.o的.ARM.attributes部分的Tag_FP_arch值从5(vfpv4)更改为6(fpv4-sp-d16)。向供应商投诉,并要求他们修复库。任何M4F都只兼容于
-mfpu=fpv4-sp-d16
-看起来他们没有正确测试他们的东西。我怀疑他们会修复它。他们对STM32F4进行了测试,所以我认为他们不会认为这是个问题。供应商库中的.ARM.attributes部分实际上不包含标记。我已经使用objcopy删除了.ARM.attributes部分,这允许代码链接,但我还无法验证它是否正常工作。