日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARM GCC浮点相关总结

發(fā)布時間:2023/12/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM GCC浮点相关总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在編譯uboot的時候碰到硬浮點和軟浮點的問題,找了一點相關(guān)資料,轉(zhuǎn)一篇文字留作備忘。

#######################################################################
本文轉(zhuǎn)自http://blog.csdn.net/yuanyou/article/details/6410326
#######################################################################

1、名字解釋:

ABI,application binary interface (ABI),應用程序二進制接口。

2、編譯版本問題:

GCC 4.0 為分界線
4.0版本以下,由于采用OABI接口,其對浮點的支持不太好
4.0版本以上,采用了新的EABI接口,其對軟浮點和硬浮點的支持都比較好。

考慮在4.0版本以下時,其支持的ARM內(nèi)核大多數(shù)沒有硬浮點,所以可以分析資料比較少,
現(xiàn)在重點關(guān)注4.0版本以上。以下所述都是針對4.0版本以上的。

3、編譯器相關(guān)的參數(shù):

-mfloat-abi=soft 使用這個參數(shù)時,其將調(diào)用軟浮點庫(softfloat lib)來支持對浮點的運算,GCC編譯器已經(jīng)有這個庫了,一般在libgcc里面。這時根本不會使用任何浮點指令,而是采用常用的指令來模擬浮點運算。 但使用的ARM芯片不支持硬浮點時,可以考慮使用這個參數(shù)。在使用這個參數(shù)時,連接時一般會出現(xiàn)下面的提示:
undefined reference to `__aeabi_fdiv’
或者類似的提示,主要因為一般情況下連接器沒有去主動尋找軟浮點庫,這時使用將libgcc庫加入即可。

-mfloat-abi=softfp
-mfloat-abi=hard
這兩個參數(shù)都用來產(chǎn)生硬浮點指令,至于產(chǎn)生哪里類型的硬浮點指令,需要由-mfpu=xxx參數(shù)來指令。這兩個參數(shù)不同的地方是:
-mfloat-abi=softfp生成的代碼采用兼容軟浮點調(diào)用接口(即使用-mfloat-abi=soft時的調(diào)用接口),這樣帶來的好處是:兼 容性和靈活性。庫可以采用-mfloat-abi=soft編譯,而關(guān)鍵的應用程序可以采用-mfloat-abi=softfp來編譯。特別是在庫由第 三方發(fā)布的情況下。
-mfloat-abi=hard生成的代碼采用硬浮點(FPU)調(diào)用接口。這樣要求所有庫和應用程序必須采用這同一個參數(shù)來編譯,否則連接時會出現(xiàn)接口不兼容錯誤。

-mfpu=vfp
-mfpu=fpa

前面已經(jīng)講述了,-mfpu參數(shù)就是用來指定要產(chǎn)生哪種硬浮點指令。常見的有vfp,fpa等。

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

a.確認編譯器默認是使用哪種參數(shù)來處理浮點操作的。寫一個簡單的浮點數(shù)程序:

#include <stdio.h> int main(void) {double d1 = 10.3;double d2 = 2.0;double dret = d1/d2;dret++;printf("result :%f",dret);return 0; }

然后使用

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

再使用

arm-linux-objdump -d main.o

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

b.確認編譯器所帶的庫使用哪種參數(shù)來編譯的。
c.確認所使用的芯片是否支持硬浮點,如果支持,是哪種類型的浮點指令。如果1,2與使用的芯片相沖突,這時就要考慮另尋編譯器了。

這三點確認以后,我們在寫自己的應用程序時,就會知道該怎樣使用這些參數(shù)了。

5、Linux相關(guān)問題:

這里涉及兩個問題:

問題1:使用的ARM芯片不支持硬浮點

在配置ARM Linux內(nèi)核時,應該都會看到這樣的配置:

menu "Floating point emulation" comment "At least one emulation must be selected" config FPE_NWFPE ...

這個是用來配置在內(nèi)核里面模擬浮點處理器。

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

當使用的ARM芯片不支持硬浮點,而又采用了-mfpu=fpa -mfloat-abi=softfp/hard來編譯應用程序。現(xiàn)在應該知道,采用這樣的參數(shù)是要參數(shù)fpa硬浮點指令。但是使用的ARM芯片不支持硬浮點,這時這個配置就起作用了。因為使用了fpa硬浮點指令,但使用的ARM芯片不支持硬浮點,這樣當程序運行到fpa硬浮點指令,會出現(xiàn)指令異常,便會 陷入到內(nèi)核里,這時這個模擬浮點處理器就來模擬這些浮點指令。現(xiàn)在應該清楚了,其作用了吧。但是現(xiàn)在有了更好的辦法,前面已經(jīng)講過了,采用 -mfloat-abi=soft參數(shù)來編譯應用程序,這樣效率會快得多。想想從用戶態(tài)切換到內(nèi)核態(tài),以及由此產(chǎn)生的cache和TLB表的損失。所以可 以考慮將這個配置拋棄了。

問題2:使用的ARM芯片支持硬浮點

一般ARM芯片支持硬浮點,都是采用協(xié)處理器方式的。與ARM內(nèi)核本身一樣,協(xié)處理器也有自己的寄存器。這樣當多個進程同時涉及浮點運算時,會怎樣?所以Linux內(nèi)核為了支持硬浮點,也要做一些工作的。
內(nèi)核配置:

config VFP bool "VFP-format floating point maths" depends on CPU_V6 || CPU_ARM926T || CPU_V7 || CPU_FEROCEON

如果使用的ARM芯片支持硬浮點,同時在應用程序里面使用了硬浮點,那么內(nèi)核可能需要做一些工作。。上面這個配置是針對vfp硬浮點處理器的;如果是其他 硬浮點處理,需要參考相關(guān)的資料,來確認要做哪些功能。如果可以確保所有時候,可以確保只有一個進程使用硬浮點處理器,那可以不需要考慮對硬浮點相關(guān)寄存 器的保存和切換,問題是可以確認嗎?

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

總結(jié)

以上是生活随笔為你收集整理的ARM GCC浮点相关总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。