arm64和armel、armhf的區別選擇

出於低功耗、封裝限制等種種原因,以前的一些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這樣每個週期都很重要的體系結構來說,這樣的提升無疑是巨大的。

在完全不改變源碼和配置的情況下,在一些應用程序上,雖然armhfarmel硬件要求(確切的是指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的安裝

兩種方法,

  1. linaro開源組織有相關的交叉工具鏈下載,點擊進入網頁選擇下載即可,地址:https://launchpad.net/linaro-toolchain-binaries
  2. 到本站工具鏈頁面下載,地址: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模式。

或者,也可已自己編譯工具鏈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章