[从0到1搭嵌入式工程]嵌入式编译工具链命名规则&四大架构&openwrt简介

对于固件应用开发来说,编译工具链都是sdk供应商提供的,不同的项目,就有了多种编译链,不同的编译链有什么区别呢?

例如 arm-linux-gnueabihf-xx,mipsel-openwrt-linux-xx 。

交叉编译工具链,从授权上,分为免费授权版和付费授权版。

免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是 Codesourcery,第三是Linora。

收费版有ARM原厂提供的armcc、IAR提供的编译器等等。

所以各个sdk厂商提供的工具链,最终也都是由这三个厂商开发的。在有一些工具链的打包名字中,有时候出现linora,就是linora这个厂商提供的工具链。

arch [-vendor] [-os] [-(gnu)eabi]

arch – 体系架构,如ARM,MIPS,对于MIPS可能还分大端模式mips或者小端模式mipsel;

vendor – [可选]工具链提供商,可能有的工具链会省去这个字段,一般可能是none、芯片提供商如histbv100或者是第三方提供商如buildroot(允许自行修改),但大都是软链接,最终指向仍然是最基础的工具链;

os – [可选]目标板中运行的系统,一般为linux,但对于一些专门用于裸板或者uboot的编译工具这个字段可能是bare-metal(裸板);

gnu – [可选]所使用的C库,gnu代指使用glibC,这个字段还可能是eglibc,uclibc;

再一个一个说,

CPU体系结构主要有四大系列, ARM、X86/Atom、MIPS、PowerPC。

里面只有x86是复杂指令集,其他都是精简指令集,X86是intel首先开发制造,我们用的PC。Atom是intel开发的精简指令集架构。ARM、MIPS、PowerPC,三大嵌入式CPU架构,ARM又有多个系列, arch可能出现arm/aarch64(arm 64位处理器)等, mips是大端模式, mipsel是小端模式。

eabi – 相对于x86上面的abi,嵌入式应用二进制接口(Embedded Application Binary Interface),如果没有“eabi”字段,说明用的是旧版本的oabi(Old Application Binary Interface)。

一般这个字段还有eabihf这个选项, 两者的区别见下文 。

[-(gnu)eabi]举几个例子:gnu 等价于:glibc+oabi , gnueabi 等价于:glibc+eabi, uclibc 等价于:uclibc+oabi。

arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc

两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,armel 和 armhf 这两种架构在对待浮点运算采取了不同的策略(有 fpu 的 arm 才能支持这两种浮点运算策略)。
其实这两个交叉编译器只不过是 gcc 的选项 -mfloat-abi 的默认值不同。gcc 的选项 -mfloat-abi 有三种值 soft、softfp、hard(其中后两者都要求 arm 里有 fpu 浮点运算单元,soft 与后两者是兼容的,但 softfp 和 hard 两种模式互不兼容):
soft: 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
softfp: armel架构(对应的编译器为 arm-linux-gnueabi-gcc )采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
hard: armhf架构(对应的编译器 arm-linux-gnueabihf-gcc )采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

实例

1、arm-none-eabi-gcc

(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),一般适合 ARM7、Cortex-M 和 Cortex-R 内核的芯片使用,所以不支持那些跟操作系统关系密切的函数,比如fork(2),他使用的是 newlib 这个专用于嵌入式系统的C库。

2、arm-none-linux-gnueabi-gcc

(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)

主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的 u-boot、Linux内核、linux应用等。arm-none-linux-gnueabi基于GCC,使用Glibc库,经过 Codesourcery 公司优化过推出的编译器。arm-none-linux-gnueabi-xxx 交叉编译工具的浮点运算非常优秀。一般ARM9、ARM11、Cortex-A 内核,带有 Linux 操作系统的会用到。

3、arm-eabi-gcc

Android ARM 编译器。

4、armcc

ARM 公司推出的编译工具,功能和 arm-none-eabi 类似,可以编译裸机程序(u-boot、kernel),但是不能编译 Linux 应用程序。armcc一般和ARM开发工具一起,Keil MDK、ADS、RVDS和DS-5中的编译器都是armcc,所以 armcc 编译器都是收费的(爱国版除外,呵呵~~)。

5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc

arm-none-uclinuxeabi 用于uCLinux,使用Glibc。

arm-none-symbianelf 用于symbian,没用过,不知道C库是什么 。

6、arm-linux-gnueabihf-gcc,mipsel-openwrt-linux-gcc, aarch64-gcc51_glibc222-linux-gnu-gcc

参考:http://www.cnblogs.com/wxishang1991/p/5322499.html


openWRT Linux系统简介

OpenWrt是一个开源项目,是针对嵌入式设备的Linux操作系统。多用于路由器、网关等设备上。整个openwrt linux系统已经提供了很多应用和网络组件,使得固件开发更为简单。(主流路由器固件有 dd-wrt,tomato,openwrt三类)。

猜你喜欢

转载自blog.csdn.net/bingyu880101/article/details/81033329