在Linux上为裸机ARM准备GNU工具链

Al *_*ndy 0 linux gcc arm gnu

我想为裸机ARM准备GNU工具链,以便与Geany IDE一起使用.有一些像这样的教程:构建裸机的GNU ARM工具链,但我不明白几个步骤.

首先,每个使用Linux操作系统的人都隐式拥有gcc,binutils和gdb,为什么要下载其他人呢?其次所有教程告诉我用这样的东西配置gcc:*./configure --target = arm-elf.它甚至做了什么?难道它只是强迫我使用调用命令行GCC ARM-ELF-GCC,而不是海湾合作委员会或它改变我的gcc内部的一些选项?

到目前为止,我已经准备好了makefile,但我仍然不确定编译器选项.我没有更改任何gcc配置选项,我用这样的标志调用编译器:

CFLAGS = -Wall -std=c99 -march=armv7-m -mtune=cortex-m0
Run Code Online (Sandbox Code Playgroud)

我可以通过使用适当的参数调用gcc来准备工具链,还是需要在gcc配置中进行一些更改?

Ber*_*ium 5

海湾合作委员会及其目标

GCC始终配置为为特定目标发出二进制文件.所以通常gcc在Linux上已经可用的目标是"i486-linux-gnu".您无法使用此编译器交叉编译到ARM目标.

因此,您需要安装为该目标配置的另一个GCC; 那么GCC和其他程序通常都有一个指示目标的前缀:在你的情况下,前缀是arm-none-eabi,然后你用它调用那个GCC arm-none-eabi-gcc.您可以安装多个GCC,它们不进行交互(如果它们相互作用,您可能搞砸了某些东西 - 如果您手动执行,则始终安装在单独的目录中).

安装

  • 如果你的Linux发行版提供了一个包,你可以安装一个包(在Debian上这是"gcc-arm-none-eabi").
  • 您可以下载预编译的包:用于ARM嵌入式处理器的GNU工具.
  • 你可以尝试编译一个.如果你想要正确的多库,那不是很容易.

如果您的Linux发行版提供了一个> 4.8.0的软件包,那么您应该尝试一下.如果您想安装多个版本(并且能够轻松地在它们之间切换),第二个选项可能更好.当第二个选项可用时,我停止为ARM编译GCC.

交叉编译

  • 在Makefile中,您必须确保使用交叉编译器.您可以$(CC)在Makefile中使用,并将其指定为:
TOOLCHAIN = arm-none-eabi-
CC = $(TOOLCHAIN)gcc
Run Code Online (Sandbox Code Playgroud)
  • Cortex-M0的编译器标志-mcpu=cortex-m0 -mthumb -mfloat-abi=soft按惯例分配给CFLAGS
CFLAGS += -mcpu=cortex-m0 -mthumb -mfloat-abi=soft
Run Code Online (Sandbox Code Playgroud)

然后一个(简单的)规则编制.c.o的样子

%.o: %.c
    $(CC) $(CFLAGS) -o $@ -c $<
Run Code Online (Sandbox Code Playgroud)

使用arm-elf-前缀的教程已过时.目前arm-none-eabi-正在使用中.