英国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。