博客轉載:http://blog.csdn.net/heliangbin87/article/details/65442239?locationNum=9&fps=1
1、ABI和EABI
ABI(Application BinaryInterface), EABI(Embeded application Binary Interface),即編譯器將C代碼編譯成匯編代碼時使用的一種規則。一般包括
(1). C類型的表示(int, short,long, union…)
(2). 調用約定,包括如何傳遞參數和返回值;使用寄存器和堆棧。
2、ARM浮點運算
1.硬浮點
編譯器將代碼直接編譯成硬件浮點協處理器(浮點運算單元FPU)能識別的指令,這些指令在執行的時候ARM核直接把它轉給協處理器執行。FPU 通常有一套額外的寄存器來完成浮點參數傳遞和運算。使用實際的硬件浮點運算單元(FPU)會帶來性能的提升。使用硬浮點時,需要給編譯器傳遞-mfpu和-mfloat-abi參數,讓編譯器編譯出硬件浮點單元(fpu)處理器能識別的指令
2.軟浮點
編譯器把浮點運算轉成浮點運算的函數調用和庫函數調用,沒有FPU的指令調用,也沒有浮點寄存器的參數傳遞。浮點參數的傳遞也是通過ARM寄存器或者堆棧完成。如果系統沒有任何浮點處理器單元,使用hard-float就會產生非法指令和異常。因而一般的系統鏡像都采用軟浮點以兼容沒有VFP的處理器。
3、編譯時參數:-march=armv7-a-mfloat-abi=softfp -mfpu=neon-vfpv4
(1). -march=armv7-a:指定編譯時arm架構(即代碼要運行的架構)。
arm處理器每個核使用不同的arm體系結構版本,每個版本對應的指令集也可能不同,編譯優化時可能根據架構指令集不同進行不同的優化。
每個編譯器都有默認的-march選項,其值一般都隨主流芯片走。比如老一點的arm交叉編譯器,默認的選項可能是-march=armv4t,新一點的則可能是-march=armv6等等。用老編譯器編出來的二進制文件,只要沒使用特殊指令集,大多數可以跑在新片子上,因為arm的向下兼容。但是用新編譯器默認選項編出來的二進制可執行文件,基本上無法在老的平台上跑,因為新架構可能會引入一些新指令。所以用較新的編譯器為老板子編譯代碼,一定不能忘記設置-march這個編譯選項,否則很很很可能跑不起來
(2). -mfloat-abi=softfp: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的方式。
(3). -mfpu=neon-vfpv4
參數-mfpu就是用來指定要產生那種硬件浮點運算指令。常用的有vfpv3,vfpv4,neon等,hi3536 A17支持的是neon+vfpv4相結合的結構。
-mfpu = name(neon or vfpvx)指定FPU 單元; -mfloat-abi = name(soft、hard、 softfp):指定軟件浮點或硬件浮點或兼容軟浮點調用接口
如果只指定 -mfpu,那么默認編譯不會選擇選擇硬件浮點指令集
如果只指定 -mfloat-abi = hard或者softfp,那么編譯會使用硬件浮點指令集
而這編譯的匯編語言的不同參考博客: http://blog.csdn.net/liujia2100/article/details/27236477