ARM编译器那些事#

基于ARM内核的芯片在我们的世界中无处不在,从简单的MCU到高端的应用处理器,各行各业中都有它们的身影。如今ARM生态系统非常繁荣,在这繁荣的背后编译器的作用功不可没。

ARM编译器的供应商主要是ARM公司,IAR公司和GNU开源组织。

1. 适用于Cortex-M/R内核的编译器#

ARM Compiler和IAR属于收费软件,结合ARM和IAR的IDE就能很方便的完成MCU的软件开发,这也是我们平时使用最多的方式。

GNU Toolchain for the Cortex-R/M是基于GCC开发的,免费软件,适用于Cortex-R/M作为内核的MCU。

ST公司STM32CubeIDE就是基于GNU工具链的。

一般它们是这个样子的:

arm-none-eabi-gcc
arm-none-eabi-g++
arm-none-eabi-ar
arm-none-eabi-as

...

2. 适用于Cortex-A内核的编译器#

ARM Compiler为收费软件,适用于ARM全系列内核。IAR为收费软件,主要支持Cortex-M核,也支持部分Cortex-A核。

GNU Toolchain for the Cortex-A是基于GCC开发的,免费软件,适用于以Cortex-A作为内核的应用处理器。

Android NDK是免费软件,适用于编译Android Native(C/C++)应用程序。

3. GNU工具链#

GNU工具链免费开源,在业界非常受欢迎。

针对ARM Cortex-M核进行开发时常用的是Keil和IAR,但是GNU工具链使用的也非常多,比如ST公司新推出的STM32CubeIDE。

但是针对ARM Cortex-A核进行开发时最常用的是GNU编译器,Android NDK使用的就是CNU工具链。

Cortex-A核一般用于复杂应用,通常都会使用Linux操作系统,所以Cortex-A核的编译器从用途上可分为两种:

  • 编译裸机程序的编译器,比如编译Uboot和Linux。
arm-none-eabi-gcc
  • 编译操作系统上应用程序的编译器,比如编译Linux应用程序。
arm-none-linux-gnueabihf-gcc

3.1 GNU for ARM编译器的命名规则#

arch [-vendor] [-os] [-(gnu)eabi] [-gcc]
参数 含义
arch 体系架构,如 arm , aarch64 , mips
vendo 工具链提供商,没有 vendor 时,用 none 代替;
os 目标操作系统,没有 os 支持时,也用 none 代替
eabi 嵌入式应用二进制接口(Embedded Application Binary Interface)

如果同时没有 vendor 和 os 支持,则只用一个 none 代替。

3.2 GNU For ARM的发布途径#

GNU For ARM的发布途径主要有四种:

4. Clang For ARM#

现在ARM Compiler 6已经使用Clang作为编译器前端了,在最新版的Keil中就能使用。

目前Android NDK也已经转投Clang。

4.1 Clang与GCC的关系#

编译器是一套软件,一般分为编译器前端和编译器后端。

  • 编译器前端:负责词法分析、语法分析、语义分析和生成中间代码。

  • 编译器后端:负责代码优化和生成目标程序。

我们通常说的GCC是一套完整的编译器软件,包括编译器前端和后端。而Clang只是一个编译器前端,Clang由苹果公司开发,据说效率要比GCC高很多,Clang通常使用LLVM作为编译器后端。