查看: 2801|回復: 0
打印 上一主題 下一主題

ARM GCC浮點(diǎn)相關(guān)總結

[復制鏈接]
跳轉到指定樓層
樓主
發(fā)表于 2017-4-7 11:07:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1、名字解釋?zhuān)?/font>

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

2、編譯版本問(wèn)題:
  GCC 4.0 為分界線(xiàn)
  4.0版本以下,由于采用OABI接口,其對浮點(diǎn)的支持不太好
  4.0版本以上,采用了新的EABI接口,其對軟浮點(diǎn)和硬浮點(diǎn)的支持都比較好。

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


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

  -mfloat-abi=softfp
  -mfloat-abi=hard
  這兩個(gè)參數都用來(lái)產(chǎn)生硬浮點(diǎn)指令,至于產(chǎn)生哪里類(lèi)型的硬浮點(diǎn)指令,需要由-mfpu=xxx參數來(lái)指令。這兩個(gè)參數不同的地方是:
         -mfloat-abi=softfp生成的代碼采用兼容軟浮點(diǎn)調用接口(即使用-mfloat-abi=soft時(shí)的調用接口),這樣帶來(lái)的好處是:兼 容性和靈活性。庫可以采用-mfloat-abi=soft編譯,而關(guān)鍵的應用程序可以采用-mfloat-abi=softfp來(lái)編譯。特別是在庫由第 三方發(fā)布的情況下。
         -mfloat-abi=hard生成的代碼采用硬浮點(diǎn)(FPU)調用接口。這樣要求所有庫和應用程序必須采用這同一個(gè)參數來(lái)編譯,否則連接時(shí)會(huì )出現接口不兼容錯誤。
  
  
  -mfpu=vfp
  -mfpu=fpa
  ...
  前面已經(jīng)講述了,-mfpu參數就是用來(lái)指定要產(chǎn)生哪種硬浮點(diǎn)指令。常見(jiàn)的有vfp,fpa等。


4、編譯器使用時(shí)要注意的地方:
  a.確認編譯器默認是使用哪種參數來(lái)處理浮點(diǎn)操作的。寫(xiě)一個(gè)簡(jiǎn)單的浮點(diǎn)數程序:
  #include
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
     然后觀(guān)察產(chǎn)生的指令,從而確定默認使用的是軟浮點(diǎn)還是硬浮點(diǎn)。(確認的過(guò)程,看個(gè)人;我谎,里面如果有不熟悉指令,那可能就是硬浮點(diǎn)指令了)

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

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


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

這里涉及兩個(gè)問(wèn)題:

問(wèn)題1:使用的ARM芯片不支持硬浮點(diǎn)
   在配置ARM Linux內核時(shí),應該都會(huì )看到這樣的配置:
    menu "Floating point emulation"
    comment "At least one emulation must be selected"
    config FPE_NWFPE
        ...
這個(gè)是用來(lái)配置在內核里面模擬浮點(diǎn)處理器。

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


您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页