簡體   English   中英

選擇了硬浮點abi,但GCC在STM32上使用了軟浮點庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM