ABI和EABI
ABI(Application BinaryInterface), EABI(Embeded application Binary Interface),即編譯器將C代碼編譯成匯編代碼時使用的一種規則。一般包括
- C類型的表示(int, short,long, union…)
- 調用約定,包括如何傳遞參數和返回值;使用寄存器和堆棧。
ARM浮點運算
硬浮點
編譯器將代碼直接編譯成硬件浮點協處理器(浮點運算單元FPU)能識別的指令,這些指令在執行的時候ARM核直接把它轉給協處理器執行。FPU 通常有一套額外的寄存器來完成浮點參數傳遞和運算。使用實際的硬件浮點運算單元(FPU)會帶來性能的提升。
使用硬浮點時,需要給編譯器傳遞-mfpu
和-mfloat-abi
參數,讓編譯器編譯出硬件浮點單元(fpu)處理器能識別的指令
軟浮點
編譯器把浮點運算轉成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。如果系統沒有任何浮點處理器單元,使用hard-float就會產生非法指令和異常。因而一般的系統鏡像都采用軟浮點以兼容沒有VFP的處理器。
編譯參數
-march=armv7
arm處理器每個核使用不同的arm體系結構版本,每個版本對應的指令集也可能不同;編譯優化時可能根據架構指令集不同進行不同的優化。所以選喲指定編譯時arm架構(即代碼要運行的架構),
-mfloat-abi=soft/softfp/hard
- soft(軟浮點):表明不是用FPU硬件,使用GCC整數算術庫來模擬浮點運算
- softfp(硬浮點):表明要使用FPU硬件來做浮點運算,函數的參數傳遞到整數寄存器(r0-r3)中,然后再傳遞到FPU。目的是為了生成的代碼采用兼容軟浮點調用接口(即使用-mfloat-abi=soft時的調用接口),這樣帶來的好處是:兼容性和靈活性。
實際也可以這樣應用:庫可以采用-mfloat-abi=soft編譯,而關鍵的應用程序可以采用-mfloat-abi=softfp來編譯。
- 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相結合的結構。