![](/img/trans.png)
[英]STM32 gcc (arm-none-eabi-gcc) links printf even though it is not used
[英]Hard float abi selected but soft float library used by GCC on 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>
我想念什么?
我不知道回答我自己的問題是否是正確的方法,不便之處,敬請原諒,但我想這比刪除帖子更好。
我發現了問題:用於測試的float變量實際上被強制轉換為雙精度,並且由於FPU僅是單精度的,因此該操作是通過軟件處理的。 強制變量像這樣浮動:
float f = (float)0.125;
f = f/(float)0.68768;
即使我不十分了解為什么編譯器將此變量強制轉換為兩倍,也解決了該問題。
因為字符串常量總是雙-fsingle-precision-constant
如果操作數之一是雙-fsingle-precision-constant
,則所有運算都在double上完成),除非您使用'f'后綴0.125f
或命令行選項-fsingle-precision-constant
。
如果您需要“純” FPU代碼,則還需要使用-ffast-math
和-fno-math-errno
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.