交叉編譯: 常見參數配置


博客轉載: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


免責聲明!

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



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