出於低功耗、封裝限制等種種原因,以前的一些ARM處理器沒有獨立的硬件浮點運算單元,需要手寫軟件來實現浮點運算。
隨着技術發展,現在高端的ARM處理器基本都具備了硬件執行浮點操作的能力。
這樣,新舊兩種架構之間的差異,就產生了兩個不同的嵌入式應用程序二進制接口(EABI)——軟浮點與矢量浮點(VFP)。
但是軟浮點(soft float)和硬浮點(hard float)之間有向前兼容卻沒有向後兼容的能力,
也就是軟浮點的二進制接口(EABI)仍然可以用於當前的高端ARM處理器。
1 fpu單元
在ARM體系架構內核中,有些有浮點運算單元(fpu,floating point unit),如下圖,有些沒有。
對於沒有fpu內核,是不能使用armel和armhf的。
在有fpu的情況下,就可以通過gcc的選項-mfloat-abi
來指定使用哪種,有如下三種值:
- soft:不用fpu計算,即使有fpu浮點運算單元也不用。
- armel:(arm eabi little endian)也即softfp,用fpu計算,但是傳參數用普通寄存器傳,這樣中斷的時候,只需要保存普通寄存器,中斷負荷小,但是參數需要轉換成浮點的再計算。
- armhf:(arm hard float)也即hard,用fpu計算,傳參數用fpu中的浮點寄存器傳,省去了轉換性能最好,但是中斷負荷高。
- arm64:64位的arm默認就是hard float的,因此不需要hf的後綴。
kernel、rootfs和app編譯的時候,指定的必須保持一致纔行。
使用softfp模式,會存在不必要的浮點到整數、整數到浮點的轉換。
而使用hard
模式,在每次浮點相關函數調用時,平均能節省20個CPU週期。
對ARM這樣每個週期都很重要的體系結構來說,這樣的提升無疑是巨大的。
在完全不改變源碼和配置的情況下,在一些應用程序上,雖然armhf
比armel
硬件要求(確切的是指fpu硬件)高一點,但是armhf
能得到20-25%的性能提升。
對一些嚴重依賴於浮點運算的程序,更是可以達到300%的性能提升。
2 armel與armhf
之前EABI中,armel(低端ARM硬件,支持armv4以上版本),在執行浮點運算之前,浮點參數必須首先通過整數寄存器,然後傳遞到浮點運算單元。
新的EABI ,也就是armhf,通過直接傳遞參數到浮點寄存器優化了浮點運算的調用約定。
相比我們熟悉的armel,armhf代表了另一種不兼容的二進制標準。
在一些社區的支持下,armhf目前已經得到了很大的發展。
像Ubuntu,已經計劃在之後的發行版中放棄armel,轉而支持armhf編譯的版本。
正如目前依然很火熱的Raspberry Pi(ARM11),由於ubuntu只支持armv7架構的編譯,Raspberry Pi將不能直接安裝ubuntu系統。
而BB Black(Cortex-A8)和Cubietruct(Cortex-A7)則同時支持ubuntu的armel與armhf的編譯。
3 安裝armel和armhf
以上就是armel與armhf的比較。
相信大家也應該有個大概的瞭解了。
在Ubuntu系統下,如何根據需求分別實現兩種交叉編譯器的安裝呢?
3.1 arm-linux-gnueabi的安裝
sudo apt-get install gcc-arm-linux-gnueabi
按操作下載即可,沒啥好說的。
3.2 arm-linux-gnueabihf的安裝
兩種方法,
- linaro開源組織有相關的交叉工具鏈下載,點擊進入網頁選擇下載即可,地址:https://launchpad.net/linaro-toolchain-binaries。
- 到本站工具鏈頁面下載,地址:https://www.veryarm.com/arm-linux-gnueabihf-gcc。
然後就是解壓到自定義目錄中,並添加bin環境變量。
4 armhf 使用
armhf的開啓需要硬件的支持,在Debian的wiki上要求ARMv7 CPU、Thumb-2指令集以及VFP3D16浮點處理器。
在gcc的編譯參數上,使用-mfloat-abi=hard -mfpu=vfp
即可。
在工具上,CodeSourcery最早支持hard模式。
或者,也可已自己編譯工具鏈。