2017-03-06

安裝 ARM ToolChain on Debian

in Synaptic, install

1. crossbuild-essential-arm64 : 64 bits
2. crossbuild-essential-armel : 32 bits, soft floating point
3. crossbuild-essential-armhf : 32 bits, hard floating

為了方便未來我們使用, 三個不同版本的工具,可在 ~/.bashrc 中新增底下設定:

alias makearmel='make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-'
alias makearmhf='make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-'
alias makearm64='make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-'

----------------------------------------------------------------------------------------------
以 qemu-arm 測試:

: arm-linux-gnueabihf-gcc hello.c -o hello_arm
: qemu-arm -L /usr/arm-linux-armhf hello_arm

*** 善用 man qemu-arm ***

Kernel Building for Raspberry pi (ARM CPU)

1. [進階] 安裝 Raspberry Pi 的 Toolchain
2. [進階] 編譯 Raspberry Pi 的核心 OR KERNEL BUILDING : DOCUMENTATION > LINUX > KERNEL > BUILDING

raspberrypi-tools 是 32bits 的,所以在 debian wheezy amd64 要裝上 32bits 的程式庫。
$ sudo apt-get install libc6-i386 lib32stdc++6 lib32z1

裝好後,試試看指令能不能執行
$ arm-linux-gnueabihf-gcc
arm-linux-gnueabihf-gcc: fatal error: no input files
compilation terminated.

這樣 no input files 就是正常可執行的狀況

-bash: /opt/cross/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin/arm-linux-gnueabihf-gcc: No such file or directory

若出現 No such file or directory 則應該是 32bits 程式庫沒裝好,再用 ldd 檢查一下。

armel和armhf區別選擇


出於低功耗、封裝限制等種種原因,之前的一些ARM架構處理器因為內部資源寶貴,加入浮點運算單元是十分奢侈的,因為需要額外的軟件實現。隨著技術發展,目前高端的ARM處理器已經具備了硬件執行浮點操作的能力。這樣新舊兩種架構之間的差異,就產生了兩個不同的嵌入式應用程序二進制接口(EABI)——軟浮點與矢量浮點(VFP)。但是軟浮點(soft float)和硬浮點(hard float)之間有向前兼容卻沒有向後兼容的能力,也就是軟浮點的二進制接口(EABI)仍然可以用於當前的高端ARM處理器

fpu單元

在ARM體系架構內核中,有些有浮點運算單元(fpu),有些沒有。對於沒有fpu內核,是不能使用armel和armhf的。在有fpu的情況下,就可以通過gcc的選項-mfloat-abi來指定使用哪種,有如下三種值:
  • soft:不用​fpu計算,即使有fpu浮點運算單元也不用。
  • armel:也即softfp,用fpu計算,但是傳參數用普通寄存器傳,這樣中斷的時候,只需要保存普通寄存器,中斷負荷小,但是參數需要轉換成浮點的再計算。
  • armhf:也即hard,用fpu計算,傳參數用fpu中的浮點寄存器傳,省去了轉換性能最好,但是中斷負荷高。
kernel、rootfs和app編譯的時候,指定的必須保持一致才行。
使用softfp模式,會存在不必要的浮點到整數、整數到浮點的轉換。而使用hard模式,在每次浮點相關函數調用時,平均能節省20個CPU週期。對ARM這樣每個週期都很重要的體系結構來說,這樣的提升無疑是巨大的。
在完全不改變源碼和配置的情況下,在一些應用程序上,雖然armhf比armel硬件要求(確切的是指fpu硬件)高一點,但是armhf能得到20-25%的性能提升。對一些嚴重依賴於浮點運算的程序,更是可以達到300%的性能提升。

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的編譯。

安裝armel和armhf

以上就是armel與armhf的比較。相信大家也應該有個大概的瞭解了。在Ubuntu系統下,如何根據需求分別實現兩種交叉編譯器的安裝呢?

arm-linux-gnueabi的安裝 (debian synaptic supported)

sudo apt-get install gcc-arm-linux-gnueabi
按操作下載即可,沒啥好說的。

 arm-linux-gnueabihf的安裝 (debian synaptic supported)

兩種方法,
  1. linaro開源組織有相關的交叉工具鏈下載,點擊進入網頁選擇下載即可,地址:https://launchpad.net/linaro-toolchain-binaries
  2. 到本站工具鏈頁面下載,地址:http://www.veryarm.com/arm-linux-gnueabihf-gcc
然後就是解壓到自定義目錄中,並添加bin環境變量。

armhf 使用

armhf的開啟需要硬件的支持,在Debian的wiki上要求ARMv7 CPU、Thumb-2指令集以及VFP3D16浮點處理器。
在gcc的編譯參數上,使用-mfloat-abi=hard -mfpu=vfp即可。
在工具上,CodeSourcery最早支持hard模式。或者,也可已自己編譯工具鏈。