安装合适的交叉编译器
在PC上编写程序,使用编译器编译后就可以直接运行了,编译器会将我们编写的程序翻译成可以在本地电脑上运行的X86指令代码。早期的ARM处理器由于受内存、处理器能力限制,不可能和本地电脑一样,安装集成开发环境,因此嵌入式开发方式一般是:在本地电脑上编写好程序,使用编译器翻译成可以在ARM平台上运行的ARM指令,然后加载到ARM平台上运行。像这种编译在其他平台上运行的代码,我们一般称为交叉编译。
随着树莓派的普及,包括今年苹果M1 ARM芯片的问世,我们也可以在拥有ARM处理器的计算机上直接编写程序并运行,不需要交叉编译了。但目前来看,交叉编译方式仍然是嵌入式开发的主流方式。
GCC编译器
GCC早期是 GNU C Compiler的简称,是一个GNU开源工程软件,用来编译C语言。后来随着版本迭代,开始支持更多的平台和语言:
- 支持多种语言:C、C++、Java、Go等
- 支持多种平台:X86、ARM、MIPS、RISC-V等
GCC因此也就顺理成章,成了GNU Compiler Collection的简称,GCC作为一个编译器套件,由:编译器、链接器、binutils、glibc、头文件等组成。
安装交叉编译器
GCC编译器套件支持不同的CPU平台架构,包含多个命令,其中的 GNU C Compiler for ARM Architecture,ARM交叉编译器,对应的gcc-arm-linux-gnueabi命令用来编译ARM平台程序。在Ubuntu环境下,可以直接使用apt-get命令安装arm 交叉编译器:
# apt install gcc-arm-linux-gnueabi
# apt install gcc-arm-linux-gnueabihf
其中的gcc-arm-linux-gnueabi,即 GNU C compiler for armel architecture,是针对ARM软浮点编译的编译器,相当于 gcc -mfloat-abi softfp 命令。而gcc-arm-linux-gnueabihf,即 GNU C compiler for armhf architecture,是针对ARM硬浮点编译的编译器,相当于 gcc -mfloat-abi hard 指令。
交叉编译器版本
早期的arm处理器,因为在CPU内部没有专门的浮点运算硬件单元,所以对应的编译器遇到浮点运算的程序代码时,不会将它们翻译成使用FPU(floating point unit)计算的机器指令,而是将浮点运算翻译成在CPU的算术逻辑单元(ALU)上软件模拟的指令代码。后面的处理器开始逐渐集成FPU,对应的编译器版本也就有了三个:
- soft版:不使用FPU进行浮点运算,适合早期无FPU的ARM处理器
- softfp版:使用FPU进行浮点运算,但使用普通寄存器传参,编译器使用该版本,用来兼容没有FPU的处理器
- hard版:使用FPU进行浮点运算,使用浮点寄存器传参,性能最高,但中断负荷最大,适用于现在高性能的集成FPU的处理器
不同的芯片厂商,发布自己不同处理器、不同平台的SDK时,使用的编译器版本可能不一样,一般我们建议,使用原厂的编译环境就可以了。而对于内核的学习,为了保持兼容性,建议使用softfp就可以了。
# apt install gcc-arm-linux-gnueabi
编译器命名
不同的编译环境,大家经常也会看到不同的交叉编译器名字,我把经常遇到的给大家列举一下:
- arm-linux-gcc:针对 arm+MMU+Linux
- arm-elf-gcc:针对 arm+uclinux
- arm-none-gnueabi-gcc:针对ARM裸机环境的编译
- arm-none-linux-gnueabi-gcc:支持Linux和裸机环境的编译