英國ARM公司是全球領先的半導體知識產權(IP)提供商。全世界超過95%的智能手機和平板電腦都采用ARM架構。ARM設計了大量高性價比、耗能低的RISC處理器、相關技術及軟件。2014年基于ARM技術的全年全球出貨量是120億顆,從誕生到現在為止基于ARM技術的芯片有600億顆 [2] 。技術具有性能高、成本低和能耗省的特點。在智能機、平板電腦、嵌入控制、多媒體數字等處理器領域擁有主導地位。
現在的嵌入式開發大部分都是ARM處理器了,從MCU級別的M0,M3,M4,M23,M33,到MPU級別的ARM9,ARM11,ARM-A5x,ARM-A7x。
📢 1991 年,ARM 公司成立于英國劍橋,主要出售芯片設計技術的授權。
ARM公司是蘋果、諾基亞、Acorn、VLSI、Technology等公司的合資企業。
產品有A,R,M三個系列,和ARM名字重合,funny。
1. ARM 處理器的分類
1.1 按系列分類
-
Cortex-M系列(通用微處理器)
包括Cortex-M0、M3、M4,新的M23,M33,以及早期的ARM7TDMI,這類處理器一般不跑操作系統,或者只跑個RTOS
-
Cortex-R系列(實時微處理器)
這類處理器可以認為是在Cortex-M的基礎上增強了實時性能,用于高安全,高實時的場合。
-
Cortex-A系列(帶MMU的處理器)
包括Cortex-A5,A7,A9,到現在的A5x,A7x,以及早期的ARM9,ARM11。這類處理器一般跑Linux,安卓之類的帶內存管理功能的操作系統,利用這類操作系統的強大功能去實現復雜的應用。
1.2 按指令集分類
-
V4 指令集
ARM7TDMI、ARM9TDMI、Intel StrongARM
-
V5 指令集
ARM926EJ、Intel XScale
-
V6 指令集
ARM11,M0
-
V7 指令集
ARM-A系列中的32位,M3,M4,M7
-
V8 指令集
ARM-A系列中的64位,M23,M33,M55,A系列32位用V8的比較少,但也有。
1.3 按硬件浮點分類
這種分類有些牽強,但是和編譯器有較大關系,幾種之間不兼容,所以這里單獨列一下。
-
無硬件浮點單元
浮點運算通過軟件完成,低端的M0,M3,M23;部分A系列的都沒有。對應浮點編譯選項為
soft
。 -
有硬件浮點單元,但是傳參數用普通寄存器傳
編譯器后綴有
el
的對應這種形式,對應浮點編譯選項為softfp
,這種形式的產品比較少,后面會詳細說明。 -
有硬件浮點單元,傳參數也用浮點單元的寄存器傳
編譯器后綴有
hf
的對應這種形式,對應浮點編譯選項為hard
32位CPU帶硬件浮點運算功能的大部分都是這種。
64位CPU都帶硬浮點,也是這種。
2. ARM 編譯器的分類
交叉編譯就是在一種平臺上編譯出能運行在體系結構不同的另一種平臺上的程序,比如在PC平臺(X86 CPU)上編譯出能運行在以ARM為內核的CPU平臺上的程序,編譯得到的程序在X86 CPU平臺上是不能運行的,必須放到ARM CPU平臺上才能運行,雖然兩個平臺用的都是Linux系統。 交叉編譯工具鏈是一個由編譯器、連接器和解釋器組成的綜合開發環境,交叉編譯工具鏈主要由binutils、gcc和glibc三個部分組成。有時出于減小 libc 庫大小的考慮,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。
- 免費版目前有三大主流工具商提供,第一是GNU(提供源碼,自行編譯制作),第二是 Codesourcery,第三是Linora。
- 收費版有ARM原廠提供的armcc、IAR提供的編譯器等等,這些價格都比較昂貴
交叉編譯工具鏈的一般命名規則為:arch [-vendor][-os] [-(gnu)eabi]
-
arch - 體系架構,如ARM,MIPS
-
verdor -工具鏈提供商
-
os - 目標操作系統
-
eabi - 嵌入式應用二進制接口
ABI:二進制應用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在計算機中,應用二進制接口描述了應用程序(或者其他類型)和操作系統之間或其他應用程序的低級接口。
EABI:嵌入式ABI。嵌入式應用二進制接口指定了文件格式、數據類型、寄存器使用、堆積組織優化和在一個嵌入式軟件中的參數的標準約定。開發者使用自己的匯編語言也可以使用 EABI 作為與兼容的編譯器生成的匯編語言的接口。
兩者主要區別是,ABI是計算機上的,EABI是嵌入式平臺上(如ARM,MIPS等)。
2.1 arm-none-eabi編譯器
可以在下面這個網址下載:
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
這種編譯器的名字中沒有包含操作系統的信息,所以這種編譯器用于編譯裸機或者使用RTOS的程序,M0,M3之類的單片機都使用的是這種編譯器。
對應的64位為 aarch64-none-elf。
2.2 arm-none-linux-eabi編譯器
可以在下面這個網址下載:如何區分
https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads
這種編譯器的名字中包含linux,所以這種編譯器用于編譯linux中的程序,32位編譯器一般默認都是軟件浮點。
對應的64位為aarch64-none-linux-eabi,64位編譯器默認都是硬件浮點。
2.3 arm-linux-androideabi編譯器
顧名思義是安卓編譯器,64位為aarch64-linux-eabi
3. ARM編譯器和ARM架構相關的編譯選項
其實各芯片廠家提供的編譯器主要作用就是指定了下面這些選項的默認值(當然不僅僅是下面這些選項),使用戶使用起來更方便,不需要手動去指定了。
3.1 -mcpu和-march
- -mcpu用于指定cpu的類型,例如cortex-a7,cortex-a9,cortex-a53,cortex-a73之類的。
- -march用于指定cpu的指令集,例如armv6,armv7。
一般都是直接指定-mcpu,編譯器能正確推斷出-march的值。
3.2 -mfloat-abi和-mfpu
-mfloat-abi用于指定軟浮點還是硬浮點
- soft:軟浮點
- softfp:硬件浮點但是參數傳遞使用普通寄存器,中斷的時候,只需要保存普通寄存器,中斷負荷小,但性能較差,參數需要轉換成浮點的再計算。
- hard:硬浮點并且參數傳遞使用硬浮點寄存器,省去了轉換,性能最好,但是中斷負荷高。
一般armv5的CPU是soft,armv6以上的是hard,softfp的比較少
注意:不同mfloat-abi編譯出來的庫一般不兼容,所以整個linux系統中所有程序和庫的mfloat-abi應該保持一致。
- -mfpu用于指定硬浮點的類型,可以是vfp,vfpv3,neon-vfpv4。
一般32位CPU選擇vfp或者vfpv3,64位CPU選擇neon-vfpv4,或者直接不選擇,讓編譯器根據CPU選擇默認值即可。不同mfpu選項應該是能兼容的,這個沒測試,印象中是可以的,只要CPU本身有相應的硬件支持就行。
3.3 通過-print-multi-lib選項,可以查看編譯器支持的選項
3.4 通過readelf -a命令,查看程序和庫對應的編譯選項
4. 什么是Arm開發板?
一般來說再采購Arm嵌入式板卡的時候會涉及 核心板 和 開發板。
- 如何區分核心板:CPU + 內存 + FLASH + 電源 + IO接口 等等
- 開發板:SD卡 + 網口 + HDMI + 串口 + USB 等等
開發板有時也被叫做 底板。購買商家提供的開發板會比較貴,一般前期測試會使用,后期只是購買核心板,然后自行開發底板(開發板)。
5. 其他
-
如何區分arm支持32位還是64位
一般我們通過從指令集來區分,從ARMv3到ARMv7支持32位空間和32位算數運算。
2011年發布的ARMv8-A架構添加了對64位空間和64位算術運算的支持。
總結常見的:
- armv8是64位的,也可以叫 aarch64
- armv7是32位的
-
armv7、armv7l和armv7hl有什么區別?
armv7l中的
l
代表Little-Endian,與之對應的就是Big-Endian,含義是字節序。- Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。
- Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。
armv7hl中的
h
代表hard-float,指浮點運算直接由CPU(APU)完成,而不用通過軟件庫編譯成定點算法實現,對應的是soft-float。