ARM GCC浮點相關總結

2021-09-30 12:37:35 字數 2386 閱讀 7746

名字解釋:

編譯版本問題:

gcc 4.0 為分界線

4.0版本以下,由於採用oabi介面,其對浮點的支援不太好

4.0版本以上,採用了新的eabi介面,其對軟浮點和硬浮點的支援都比較好。

考慮在4.0版本以下時,其支援的arm核心大多數沒有硬浮點,所以可以分析資料比較少,

現在重點關注4.0版本以上。以下所述都是針對4.0版本以上的。

編譯器相關的引數:

undefined reference to `__aeabi_fdiv'

或者類似的提示,主要因為一般情況下聯結器沒有去主動尋找軟浮點庫,這時使用將libgcc庫加入即可。

-mfloat-abi=softfp

-mfloat-abi=hard

這兩個引數都用來產生硬浮點指令,至於產生**型別的硬浮點指令,需要由-mfpu=***引數來指令。這兩個引數不同的地方是:

-mfloat-abi=softfp生成的**採用相容軟浮點呼叫介面(即使用-mfloat-abi=soft時的呼叫介面),這樣帶來的好處是:相容性和靈活性。庫可以採用-mfloat-abi=soft編譯,而關鍵的應用程式可以採用-mfloat-abi=softfp來編譯。特別是在庫由第三方發布的情況下。

-mfloat-abi=hard生成的**採用硬浮點(fpu)呼叫介面。這樣要求所有庫和應用程式必須採用這同乙個引數來編譯,否則連線時會出現介面不相容錯誤。

-mfpu=vfp

-mfpu=fpa

...前面已經講述了,-mfpu引數就是用來指定要產生哪種硬浮點指令。常見的有vfp,fpa等。

編譯器使用時要注意的地方:

1.確認編譯器預設是使用哪種引數來處理浮點操作的。寫乙個簡單的浮點數程式:

#include

int main(void)

然後使用

arm-linux-gcc -c main.c -o main.o

再使用arm-linux-objdump -d main.o

然後觀察產生的指令,從而確定預設使用的是軟浮點還是硬浮點。(確認的過程,看個人。晃一眼,裡面如果有不熟悉指令,那可能就是硬浮點指令了)

2.確認編譯器所帶的庫使用哪種引數來編譯的。

3.確認所使用的晶元是否支援硬浮點,如果支援,是哪種型別的浮點指令。如果1,2與使用的晶元相衝突,這時就要考慮另尋編譯器了。

這三點確認以後,我們在寫自己的應用程式時,就會知道該怎樣使用這些引數了。

linux相關問題:

這裡涉及兩個問題:1.使用的arm晶元不支援硬浮點

2.使用的arm晶元支援硬浮點

問題1:使用的arm晶元不支援硬浮點

在配置arm linux核心時,應該都會看到這樣的配置:

menu "floating point emulation"

comment "at least one emulation must be selected"

config fpe_nwfpe

...這個是用來配置在核心裡面模擬浮點處理器。

這個配置有什麼作用呢?估計很少有人能夠知道。其實它是這樣的:

當使用的arm晶元不支援硬浮點,而又採用了-mfpu=fpa -mfloat-abi=softfp/hard來編譯應用程式。現在應該知道,採用這樣的引數是要引數fpa硬浮點指令。但是使用的arm晶元不支援硬浮點,這時這個配置就其作用了。因為使用了fpa硬浮點指令,但使用的arm晶元不支援硬浮點,這樣當程式執行到fpa硬浮點指令,會出現指令異常,便會陷入到核心裡,這時這個模擬浮點處理器就來模擬這些浮點指令。現在應該清楚了,其作用了吧。但是現在有了更好的辦法,前面已經講過了,採用-mfloat-abi=soft引數來編譯應用程式,這樣效率會快得多。想想從使用者態切換到核心態,以及由此產生的cache和tlb表的損失。所以可以考慮將這個配置拋棄了。

問題2:使用的arm晶元支援硬浮點

一般arm晶元支援硬浮點,都是採用協處理器方式的。與arm核心本身一樣,協處理器也有自己的暫存器。這樣當多個程序同時涉及浮點運算時,會怎樣?所以linux核心為了支援硬浮點,也要做一些工作的。

核心配置:

config vfp

bool "vfp-format floating point maths"

depends on cpu_v6 || cpu_arm926t || cpu_v7 || cpu_feroceon

如果使用的arm晶元支援硬浮點,同時在應用程式裡面使用了硬浮點,那麼核心可能需要做一些工作。。上面這個配置是針對vfp硬浮點處理器的;如果是其他硬浮點處理,需要參考相關的資料,來確認要做哪些功能。如果可以確保所有時候,可以確保只有乙個程序使用硬浮點處理器,那可以不需要考慮對硬浮點相關暫存器的儲存和切換,問題是可以確認嗎?

對於浮點運算,針對arm晶元應該盡量避免。如果無法避免,那就需要綜合考慮到底使用哪種方式?如何去操作?效能如何?都需要考慮,去實驗測試是最好的。

浮點數相關

剛剛看了別人的部落格裡關於浮點數的講解,我用通俗的話總結一下 以浮點數9.0為例子,用二進位制表示為1001.0,科學記數公式為 1 num 1 s m 2 e s表示符號,e表示階乘,m表示有效數字 簡單來說就是s填0或者1來決定正負,e表示小數點要移位的次數,m表示1.001也就是有效數字,基本...

浮點數相關

浮點數 float,double 精度問題與巨集定義 define float 單精度 double 雙精度 位元組 4 8 32位 64位 float型別所占用4個位元組則會有32位,而在儲存時,系統會將實型資料分成小數部分和指數二個部分來儲存。由於小數也存在正負,最前面的單獨一位來表示符號位。0...

浮點數相關

4 下面的程式會輸出什麼?include int main 參 該項程式輸出如下所示,0 12 1095237632 原因是 浮點數是4個位元組,12.5f 轉成二進位制是 01000001010010000000000000000000,十六進製制是 0x41480000,十進位制是 109523...