|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
GCC for ARM8 I2 ^5 ]! f( r2 L5 o
GCC 全称为 GNU Compiler Collection。 GCC 是几种主要编程语言的编译器的集成分发。 这些语言目前包括 C,C ++,Objective-C,Objective-C ++,Fortran,Ada,Go 和 BRIG(HSAIL)。 m8 [$ `7 v; I- Z) y" L4 ]
GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如 Fortran、Pascal、Objective-C、Java、Ada、Go 以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。 更名之后,原来的针对于 C 语言的编译器名字还叫 gcc,针对 C++ 的编译器叫做 g++ 。/ Q9 G. U' {" _) Z
GCC for ARM 则是基于 GCC 开发的,用来编译生成 ARM 内核可执行文件的编译套件,俗称 ARM 交叉编译套件。 相比于以上两个巨贵的编译器,GCC for ARM 因为是基于开源的 GCC 的,因此是免费的。目前主要由三大主流工具商提供,第一是 ARM,第二是 Codesourcery,第三是 Linora。目前我们用的针对 ARM 芯片的集成开发环境(IDE),除了 IAR 和 ARM 自己的 Keil、DS 等都是使用 GCC for ARM 的编译器!
- L, X- ]8 c8 m3 D' D# X1 ]) C* e9 g0 z1 g
首先,看看 ARM 交叉编译工具链的命名规则:arch [-vendor] [-os] [-(gnu)eabi] [-gcc]. s6 m' Y! s) L2 d- q
' z8 Q& z5 J7 S2 b0 Y D
- arch: 体系架构,如 ARM,MIPS
- vendor: 工具链提供商,没有 vendor 时,用 none 代替;
- os: 目标操作系统,没有 os 支持时,也用 none 代替
- eabi: 嵌入式应用二进制接口(Embedded Application Binary InteRFace)6 D o% X! D8 m+ g- P8 n0 c
& F4 B) m5 k" V$ c/ M
如果同时没有 vendor 和 os 支持,则只用一个 none 代替。例如 arm-none-eabi 中的 none 表示既没有 vendor 也没有 os 支持。 前面说过,GCC for ARM 则是基于 GCC 开发的。因此,其和 GCC 一样是一套命令行工具的集合,理论上可以将它集成到其他任何集成开发环境中,从而不直接使用命令行。GCC for ARM 中的各命令行工具与 GCC 中的各命令行工具都是对应的,功能基本一致,仅仅是名字有些改变!' Y2 i$ D( E& n* Z' C
3 t' x1 s7 E5 X6 E% G' M$ A1 O. fCodesourcery Toolchain* y) W2 g3 G$ m# e
Codesourcery推出的产品叫 Sourcery G++ Lite Edition,其中基于 command-line 的编译器是免费的,在官网上可以下载,而其中包含的 IDE 和 debug 工具是收费的。Codesourcery 公司(目前已经被mentor收购)基于GCC推出的ARM交叉编译工具。可用于交叉编译 ARM mcu 芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。9 O( U% ^$ x/ \
目前 CodeSourcery 已经由明导国际(Mentor Graphics)收购,所以原本的网站风格已经全部变为 Mentor 样式,这货被收之后,不知道怎么下载其编译工具链。。。) C. c, y |; D1 t6 I
& w% r1 v \: B+ p7 ~, T/ @
- arm-none-linux-gnueabi-gcc: 用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。
- arm-none-elf-gcc: 用于交叉编译ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。; x0 ]+ ]2 n6 r4 M c
: x" q9 G8 M! B+ F/ ZLinaro Toolchain, n$ K$ |: w. X/ r: n$ D
Linaro 是在 2010 年台北国际计算机展( COMPUTEX )期间,ARM、Freescale、Samsung ,ST-Ericsson、德州仪器(TI)与IBM等6家大厂,宣布合资成立的非赢利 Linux 基础架构软件研发商。其基于 GCC 推出的 ARM 交叉编译工具如下图所示:
0 f, b$ T$ m: Y I9 p- Q3 S8 t1 Y C
! j8 N* w- X3 n- ^* k- t- Y+ e# a+ }, a5 o
9 z, C/ E: d9 A0 W3 {/ U2 T+ g2 ^( p, J从上图不难看出,Linaro 提供的交叉编译环境,仅针对于Cortex-A 内核,其他 ARM 内核则需要去 ARM 官网下载!
) o& |; g2 v$ \2 @+ e2 u" S
4 e2 P8 c) z o g' S) a- aarch64-linux-gnu: 针对于目标平台是 Linux 系统,用于交叉编译 ARMv8 64位目标中的裸机程序、u-boot、Linux kernel、filesystem 和 App 应用程序。
- arm-linux-gnueabihf: 针对于目标平台是 Linux 系统,用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和 App 应用程序。
- arm-eabi-gcc: 用于编译 ARM 架构的裸机系统,包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application
- aarch64-elf: 用于编译 ARM v8 64位 架构的裸机系统,包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application
; \8 e0 s0 J1 [
/ Y ^) L5 U- a; M 正如官网的说明,官方发布的编译好二进制可执行编译器文件,仅在 Linux 系统( Ubuntu LTS)进行了测试。 目前,官方没有提供其他平台的可执行程序!/ V# h @& O; e1 V1 r. @: Q
3 }3 W3 E* i( F* U( X3 [. \7 q4 k' L. E+ F$ ]
ARM Toolchain
/ w7 T4 E0 @7 c$ C. c0 ~6 q( v, h/ z$ q. s7 j& A
ARM 除了有自己的专用编译器之外,还维护了一套基于 GCC 的交叉编译工具链。估计是为了能更有效的占有市场吧!绝大多数第三方的 IDE 都是使用这一套交叉编译工具链。$ F, P4 _7 B8 I# b( I* a5 a
3 c2 c! w% w4 u1 U7 r! P6 R
arm-none-eabi" y' u. z$ q: n% S7 Z! r& j }3 P
/ x4 ]6 |$ p7 p, n+ F; x 用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),所以不支持那些跟操作系统关系密切的函数,比如fork,它使用的是 newlib 这个专用于嵌入式系统的C库。
; S. x, Q& s4 F7 ? 作为维持和增强 GCC 编译器支持 ARM 架构的持续承诺的一部分,ARM 正在维护一个 GNU 工具链,其 GCC 源分支针对嵌入式 ARM 处理器,即 Cortex-R / Cortex-M处理器系列,覆盖 Cortex-M0 ,Cortex-M3,Cortex-M4,Cortex-M0 +,Cortex-M7,Armv8-M基线和主线,Cortex-R4,Cortex-R5,Cortex-R7和Cortex-R8。
& N, K( e. |; T% s 作为其中的一部分,ARM 定期发布来自 ARM 嵌入式分支的预构建和测试二进制文件。 这些改进可以免费集成到第三方工具链中,也可以由最终用户直接下载。整套工具链包含以下组件:# `/ e/ _. E4 P* I. w7 F1 P- M
- C$ S4 Q' W6 K! k5 c# C. m
- gcc : gcc-8-branch revision 267074
# y. g9 k0 f, j# Xsvn://gcc.gnu.org/svn/gcc/branches/gcc-8-branch - binutils : 2.31 with mainline backports
6 c9 e; {7 V6 j, i, ]# m9 \% cgit://sourceware.org/git/binutils-gdb.git commit fe554d200d1befdc3bddc9e14f8593ea3446c351 - newlib and newlib-nano :, s. V7 [( |0 u) R9 h$ @7 c9 ^
git://sourceware.org/git/newlib-cygwin.git commit df6915f029ac9acd2b479ea898388cbd7dda4974 - gdb : 8.2 without target sim support
( p; R5 n/ d' j }git://sourceware.org/git/binutils-gdb.git commit fe554d200d1befdc3bddc9e14f8593ea3446c351+ w B3 \0 b$ W0 Q' V0 H g
4 B2 z, X& h) M9 _% C
目前由 ARM 来维护开发。使用 launchpad 来维护该项目源码。但是根据之前的公告,launchpad 上不发布编译好的程序和源码包("As previously announced all new binary and source packages will not be released on Launchpad henceforth, they can be found on:
0 s1 L/ |% b; O" _& ehttps://developer.arm.com/open-source/gnu-toolchain/gnu-rm."),只能从 ARM 官网:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads 进行下载。下面是,版本发布时间线:' A$ `! I$ R9 F" A$ O' }, {
s7 [8 X4 D" I0 e+ l
2 t" e, U; o2 i v% o! K
) x9 K& L: o/ U. }, q/ `7 K f
! m1 s9 u a; L1 T+ x& ?这是目前,我们编写 ARM 裸机程序时,使用最多的交采编译工具链! 安装/解压 之后,目录如下图所示:
3 W$ F9 J1 j9 H- a* D6 X1 @% @ a/ m+ @% G# Q# Q
: a- j; ~7 f! `+ U
: t# S- S2 L* n2 c/ f: t4 ^. i5 S+ c编译器工具中的各工具,与标准的GCC没有太多区别,主要就是针对的平台变了。各工具的功能是一样的!比如:arm-none-eabi-gcc.exe 是C 语言编译器、arm-none-eabi-g++.exe 是 C++ 编译器、arm-none-eabi-ld.exe 是连接器、arm-none-eabi-gdb.exe 是调试器等等。0 N" e* m8 I$ E0 ]: U
- B0 ^7 _, O$ j1 f- Y7 v
, W6 \4 ?5 L; {) @Cortex-A 专用
z9 F, @7 H: m! A: u5 R# \6 t4 s* y2 O6 ?/ ^, {
以上交叉编译工具链只支持 ARM Cortex-M/R等系列的核,ARM 官网还提供了针对于 ARM Cortex-A 系列内核的交叉编译工具链,可以从以下地址下载
+ b6 h4 d8 f" P) w2 h+ u+ O4 shttps://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads。 具体如下所示:7 N" q, E) k/ y8 f* q T
% [0 q$ ?! ^3 E4 ~* h/ U4 k) f3 f
# Z6 E" ]) I" [% Z3 e
* V& T, A' g5 f8 G7 l6 k5 T7 t, k: a4 X7 q& D- a" u
需要注意的是,上图中红框全称的就是编译工具链的名字。以 gcc-arm-8.3-2019.03-i686-mingw32-arm-eabi 为例,解压后如下图所示:$ e# ]% q. o. W/ @
' @ d- p( {1 M
! m/ [! n- D0 L8 n+ ], Q& m' o
4 Z; F( p$ t: g1 P各命令行工具与标准 GCC 也没啥区别!; x4 P" t. Z% @" g
再一个需要注意的是,上图中的 i686-mingw32 host 指定是运行平台为 Windows 7 32/64 bits or later;x86_64 host 指定是运行平台为 Ubuntu 14.04 LTS x86_64 or later or RHEL 6 x86_64。也就是说,仅支持 Windows 和 Linux 平台! 整套工具包含以下组件:6 C' z( q; z& m3 C
' _% o$ F4 K: }5 h$ ]* x" h
. Q: `1 ]2 F* j' K* P) Q5 X. P( P" K+ _8 Z, o0 c
再再一个需要注意的是,编译器的目标平台。
- i* g4 k/ y; K( d1 T/ h& \! O- O" c! ?9 I' g4 x' w
- AArch32 bare-metal target:32位纯裸机平台
- AArch64 ELF bare-metal target:64位纯裸机平台
- AArch64 ELF bare-metal, big-endian target:64位纯裸机平台(大端模式)
- AArch64 GNU/Linux target:64位 Linux 平台
- AArch64 GNU/Linux big-endian target:64位 Linux 平台(大端模式)
- AArch32 target with soft float:32位带软件模式浮点运算
- AArch32 target with hard float:32位带硬件模式浮点运算
/ v7 A4 G& P4 Q. L. ~2 W: m" ]
6 a- z, {6 \+ R# @0 R/ ]: }
" ^7 s& a' m7 [( u; B2 b
) J& a1 s4 c- ]; A
- s* U- S0 b0 i9 o |
|