|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
GCC for ARM( R, y5 ~) V7 z, n
GCC 全称为 GNU Compiler Collection。 GCC 是几种主要编程语言的编译器的集成分发。 这些语言目前包括 C,C ++,Objective-C,Objective-C ++,Fortran,Ada,Go 和 BRIG(HSAIL)。( ^. H8 m) P# o, a
GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如 Fortran、Pascal、Objective-C、Java、Ada、Go 以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。 更名之后,原来的针对于 C 语言的编译器名字还叫 gcc,针对 C++ 的编译器叫做 g++ 。+ b8 H# \, y0 _' [
GCC for ARM 则是基于 GCC 开发的,用来编译生成 ARM 内核可执行文件的编译套件,俗称 ARM 交叉编译套件。 相比于以上两个巨贵的编译器,GCC for ARM 因为是基于开源的 GCC 的,因此是免费的。目前主要由三大主流工具商提供,第一是 ARM,第二是 Codesourcery,第三是 Linora。目前我们用的针对 ARM 芯片的集成开发环境(IDE),除了 IAR 和 ARM 自己的 Keil、DS 等都是使用 GCC for ARM 的编译器!8 C6 [# [% E1 s
5 x, p' I4 Q% V: H! l首先,看看 ARM 交叉编译工具链的命名规则:arch [-vendor] [-os] [-(gnu)eabi] [-gcc]8 _/ z) L) v! O4 w- ?
2 I( ~3 O# I; x. b+ a
- arch: 体系架构,如 ARM,MIPS
- vendor: 工具链提供商,没有 vendor 时,用 none 代替;
- os: 目标操作系统,没有 os 支持时,也用 none 代替
- eabi: 嵌入式应用二进制接口(Embedded Application Binary InteRFace)
`9 |" M( N# ^+ i9 w4 }
6 s: ^ ^& V/ R/ d如果同时没有 vendor 和 os 支持,则只用一个 none 代替。例如 arm-none-eabi 中的 none 表示既没有 vendor 也没有 os 支持。 前面说过,GCC for ARM 则是基于 GCC 开发的。因此,其和 GCC 一样是一套命令行工具的集合,理论上可以将它集成到其他任何集成开发环境中,从而不直接使用命令行。GCC for ARM 中的各命令行工具与 GCC 中的各命令行工具都是对应的,功能基本一致,仅仅是名字有些改变!" r2 J j2 @: ?
: m" T8 k; U+ RCodesourcery Toolchain
% M5 C6 s6 N) R, p; Y Codesourcery推出的产品叫 Sourcery G++ Lite Edition,其中基于 command-line 的编译器是免费的,在官网上可以下载,而其中包含的 IDE 和 debug 工具是收费的。Codesourcery 公司(目前已经被mentor收购)基于GCC推出的ARM交叉编译工具。可用于交叉编译 ARM mcu 芯片,如 ARM7、ARM9、Cortex-M/R 芯片程序。
, ]0 k2 G. J/ U; d" S 目前 CodeSourcery 已经由明导国际(Mentor Graphics)收购,所以原本的网站风格已经全部变为 Mentor 样式,这货被收之后,不知道怎么下载其编译工具链。。。- n" c; V% S0 r. S/ a" u
7 R8 e7 Q9 p, Y$ n$ h& p" p- 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芯片程序。: }7 M5 c+ h9 J3 ~5 `- e+ {
& _% ]3 U$ S; |8 v0 E, X
Linaro Toolchain; ~* E, C3 c! t8 l
Linaro 是在 2010 年台北国际计算机展( COMPUTEX )期间,ARM、Freescale、Samsung ,ST-Ericsson、德州仪器(TI)与IBM等6家大厂,宣布合资成立的非赢利 Linux 基础架构软件研发商。其基于 GCC 推出的 ARM 交叉编译工具如下图所示:
: ~& T/ A* R) n3 _4 `4 z6 N7 G! c0 s7 r
5 ^$ t8 y+ ~) g) J v: V4 z# Z: F4 [8 w
. M2 {: _+ D1 m( m: W1 x从上图不难看出,Linaro 提供的交叉编译环境,仅针对于Cortex-A 内核,其他 ARM 内核则需要去 ARM 官网下载!
- I" d( b. D9 Y4 R2 C. x
/ _: m; `; ]0 y9 X* k0 [- 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
9 q- ~+ u9 ?' I* Z$ M: W0 N
" b5 I$ k0 W0 I 正如官网的说明,官方发布的编译好二进制可执行编译器文件,仅在 Linux 系统( Ubuntu LTS)进行了测试。 目前,官方没有提供其他平台的可执行程序!
) y7 B" g, q. Q4 O
6 Q: o6 x- K9 h/ M9 [' ]$ S, m: U A
ARM Toolchain
% z8 |& O3 K* v
! {5 l y& T1 l: N2 p. H- p% ? ARM 除了有自己的专用编译器之外,还维护了一套基于 GCC 的交叉编译工具链。估计是为了能更有效的占有市场吧!绝大多数第三方的 IDE 都是使用这一套交叉编译工具链。
+ n$ N5 M& ^: n, R6 v* {% w5 v% q/ N2 _. w4 n I
arm-none-eabi
0 F \6 X; u2 o0 ^3 {" c9 u
' G2 b3 ~8 c6 x5 g2 ?0 }6 y) B0 R 用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用 Application),所以不支持那些跟操作系统关系密切的函数,比如fork,它使用的是 newlib 这个专用于嵌入式系统的C库。; N/ V- a, h8 i" J
作为维持和增强 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。
" @5 B8 @/ ~' V% i9 x; w 作为其中的一部分,ARM 定期发布来自 ARM 嵌入式分支的预构建和测试二进制文件。 这些改进可以免费集成到第三方工具链中,也可以由最终用户直接下载。整套工具链包含以下组件:
# P3 h! M. f+ p% {. T7 D) j7 P* T0 K
- gcc : gcc-8-branch revision 267074
~8 l6 A2 K8 x) W% w$ dsvn://gcc.gnu.org/svn/gcc/branches/gcc-8-branch - binutils : 2.31 with mainline backports. ?' g/ n4 s/ q; h m; d
git://sourceware.org/git/binutils-gdb.git commit fe554d200d1befdc3bddc9e14f8593ea3446c351 - newlib and newlib-nano :
- b9 l% O4 I& i% lgit://sourceware.org/git/newlib-cygwin.git commit df6915f029ac9acd2b479ea898388cbd7dda4974 - gdb : 8.2 without target sim support
' Q, \5 G! u2 _ b& W) k/ Sgit://sourceware.org/git/binutils-gdb.git commit fe554d200d1befdc3bddc9e14f8593ea3446c351
. D+ X/ [& X. P7 `
& }7 U/ s a y" n3 \ 目前由 ARM 来维护开发。使用 launchpad 来维护该项目源码。但是根据之前的公告,launchpad 上不发布编译好的程序和源码包("As previously announced all new binary and source packages will not be released on Launchpad henceforth, they can be found on:% ?/ @1 W' T' F% n9 W0 w
https://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 进行下载。下面是,版本发布时间线:
4 K8 _0 t! h: |% u o. I" R; i
6 e$ e6 A8 B' o+ ]' p: f
6 y9 x% K* b/ T5 R2 X
9 h% s& L/ L. D) z3 p% |6 w2 e* ?( g) Z% r; Q- ?, Z; F
这是目前,我们编写 ARM 裸机程序时,使用最多的交采编译工具链! 安装/解压 之后,目录如下图所示:* k7 v7 _3 p# v) p, E
) M4 H8 D4 }# |, [" k
. e) ? Z' y) Z) X5 P! R3 n" `; Y
编译器工具中的各工具,与标准的GCC没有太多区别,主要就是针对的平台变了。各工具的功能是一样的!比如:arm-none-eabi-gcc.exe 是C 语言编译器、arm-none-eabi-g++.exe 是 C++ 编译器、arm-none-eabi-ld.exe 是连接器、arm-none-eabi-gdb.exe 是调试器等等。
, ?3 m4 v `) ~' q# s
5 L0 H; a5 G; Y+ R `9 q' Q) n% e" }' F, C7 |& `6 |: C
Cortex-A 专用
4 h! s6 e0 `+ N) u3 L
' V; s9 u4 j0 w, n4 T& f 以上交叉编译工具链只支持 ARM Cortex-M/R等系列的核,ARM 官网还提供了针对于 ARM Cortex-A 系列内核的交叉编译工具链,可以从以下地址下载
; O- Y% {) y( ~https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads。 具体如下所示:
9 `: ?$ A' k- H/ p z# W8 d* S$ c3 R& r4 G
3 p2 I+ Q3 Y% I+ U' S+ x; f. H% o% ~
; ^, C' Q& l1 u4 G" R* n: d
; ]5 [& P) T" T8 k9 ?; R" p需要注意的是,上图中红框全称的就是编译工具链的名字。以 gcc-arm-8.3-2019.03-i686-mingw32-arm-eabi 为例,解压后如下图所示:
, C/ q& \: c2 k+ ]& F6 q8 P* u3 Q9 _7 \/ @% h! }+ ^" B
1 Z: }6 B( Q4 K& h* s0 M( H2 C# w" g1 u, u1 I
各命令行工具与标准 GCC 也没啥区别!) U' r/ N5 w7 O; p
再一个需要注意的是,上图中的 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 T: {7 X# y, ?3 {, A, k
4 X8 {" a2 K0 f$ E: ?) i. g" k/ m2 z
8 }& f8 u4 o( i; \
' r; K9 |, {" I! \& e4 Z3 ^- I; C
再再一个需要注意的是,编译器的目标平台。" X# I8 w# `% b) j9 h4 ~
! H$ C2 _1 ]2 }" h* L8 q5 t- 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位带硬件模式浮点运算
7 _6 W& \, M2 k6 n* `) _
3 @ C& ~, A0 B) W. P4 t! M' `6 }3 y {
8 N9 ?" P: E6 M ^# P
" p2 b1 j4 } r, R. D5 t e& ^9 H
|
|