我正在开发嵌入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>
我想念什么?
答案 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