CMake: (一) arm浮點編譯參數



ABI和EABI

ABI(Application BinaryInterface), EABI(Embeded application Binary Interface),即編譯器將C代碼編譯成匯編代碼時使用的一種規則。一般包括

  1. C類型的表示(int, short,long, union…)
  2. 調用約定,包括如何傳遞參數和返回值;使用寄存器和堆棧。

ARM浮點運算

硬浮點

  編譯器將代碼直接編譯成硬件浮點協處理器(浮點運算單元FPU)能識別的指令,這些指令在執行的時候ARM核直接把它轉給協處理器執行。FPU 通常有一套額外的寄存器來完成浮點參數傳遞和運算。使用實際的硬件浮點運算單元(FPU)會帶來性能的提升。
  使用硬浮點時,需要給編譯器傳遞-mfpu-mfloat-abi參數,讓編譯器編譯出硬件浮點單元(fpu)處理器能識別的指令

軟浮點

  編譯器把浮點運算轉成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。如果系統沒有任何浮點處理器單元,使用hard-float就會產生非法指令和異常。因而一般的系統鏡像都采用軟浮點以兼容沒有VFP的處理器。

編譯參數

-march=armv7

arm處理器每個核使用不同的arm體系結構版本,每個版本對應的指令集也可能不同;編譯優化時可能根據架構指令集不同進行不同的優化。所以選喲指定編譯時arm架構(即代碼要運行的架構),

-mfloat-abi=soft/softfp/hard

  1. soft(軟浮點):表明不是用FPU硬件,使用GCC整數算術庫來模擬浮點運算
  2. softfp(硬浮點):表明要使用FPU硬件來做浮點運算,函數的參數傳遞到整數寄存器(r0-r3)中,然后再傳遞到FPU。目的是為了生成的代碼采用兼容軟浮點調用接口(即使用-mfloat-abi=soft時的調用接口),這樣帶來的好處是:兼容性和靈活性。

實際也可以這樣應用:庫可以采用-mfloat-abi=soft編譯,而關鍵的應用程序可以采用-mfloat-abi=softfp來編譯。

  1. hard(硬浮點):表明要使用FPU硬件來做浮點運算,並且函數的參數直接傳遞到FPU的寄存器(s0、d0)。這樣要求所有庫和應用程序必須采用這同一個參數來編譯,否則連接時會出現接口不兼容錯誤.

注意
-mfloat-abi=soft編譯的app或者庫,在用-mfloat-abi=softfp編譯的OS中是可以跑的;
-mfloat-abi=softfp編譯的app或者庫,在用-mfloat-abi=soft編譯的OS中,如果SoC中沒有FPU,那么是不能跑的;
-mfloat-abi=softfp/soft-mfloat-abi=hard,是互不兼容的。

Armv7系列基本都有硬浮點,所以一般都選擇softfp的方式。

-mfpu=neon-vfpv4

  參數-mfpu就是用來指定要產生哪種硬件浮點運算指令。常用的有vfpv3,vfpv4,neon等,hi3536 A17支持的是neon+vfpv4相結合的結構。


參考

  1. coolice87


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM