选择了硬浮点abi,但GCC在STM32上使用了软浮点库

时间:2018-07-23 08:32:09

标签: gcc floating-point stm32

我正在开发嵌入FPv4-SP FPU的STM32L4。 我正在测试FPU的使用情况。我正在使用硬浮点abi进行编译:

arm-atollic-eabi-gcc -c  (...)  __VFP_FP__ -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard xxx.o  -o xxx.o xxx.c

(即使我认为它没有用,我也将相同的选项-mfloat-abi添加到链接命令中)

但是,在查看汇编代码时,我注意到软件浮点库函数被称为:

35          volatile float f = 0.125;
0800a2b4:   mov.w   r3, #1040187392 ; 0x3e000000
0800a2b8:   str     r3, [r7, #4]
37          f = f/0.4;
0800a2ba:   ldr     r3, [r7, #4]
0800a2bc:   mov     r0, r3
0800a2be:   bl      0x8000348 <__extendsfdf2>
0800a2c2:   add     r3, pc, #100    ; (adr r3, 0x800a328 <csem_tests+136>)
0800a2c4:   ldrd    r2, r3, [r3]
0800a2c8:   bl      0x8000644 <__divdf3>

我想念什么?

2 个答案:

答案 0 :(得分:2)

我不知道回答我自己的问题是否是正确的方法,不便之处,敬请原谅,但我想这比删除帖子更好。

我发现了问题:我用于测试的float变量实际上被强制转换为双精度,并且由于FPU仅是单精度的,因此该操作由软件处理。强制变量像这样浮动:

float f = (float)0.125;
f = f/(float)0.68768;

解决了该问题,即使我不太了解为什么编译器将此变量转换为两倍。

答案 1 :(得分:2)

因为字符串常量总是双精度的(如果一个操作数是双精度的,则所有运算都在双精度上完成),除非您使用'f'后缀-0.125f或命令行选项-fsingle-precision-constant。 / p>

如果您需要“纯” FPU代码,则还需要使用-ffast-math-fno-math-errno