关于gcc:在Linux上为裸机ARM准备GNU工具链

Preparing GNU toolchain for bare metal ARM on Linux

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

首先,每个隐式使用Linux OS的人都有gcc,binutils和gdb,那么为什么要下载其他文件呢? 其次,所有教程都告诉我使用以下方式配置gcc:*。/ configure --target = arm-elf。 它甚至做什么? 只是强迫我使用arm-elf-gcc而不是gcc在命令行中调用gcc还是改变了我的gcc的某些内部选项?

到目前为止,我已经准备了makefile,但是我仍然不确定编译器选项。 我没有更改任何gcc配置选项,而是使用以下标志调用编译器:

1
CFLAGS = -Wall -std=c99 -march=armv7-m -mtune=cortex-m0

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


海湾合作委员会及其目标

GCC始终配置为发出特定目标的二进制文件。因此,通常在Linux上已经可用的gcc具有目标" i486-linux-gnu"。您不能使用此编译器交叉编译为ARM目标。

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

正在安装

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

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

交叉编译

  • 在您的Makefile中,必须确保使用了交叉编译器。您可以在Makefile中使用$(CC),并按以下方式分配它:
1
2
TOOLCHAIN = arm-none-eabi-
CC = $(TOOLCHAIN)gcc
  • Cortex-M0的编译器标志为-mcpu=cortex-m0 -mthumb -mfloat-abi=soft,按惯例已分配给CFLAGS
1
CFLAGS += -mcpu=cortex-m0 -mthumb -mfloat-abi=soft

然后,一个(简单的)规则将.c编译为.o

1
2
%.o: %.c
    $(CC) $(CFLAGS) -o $@ -c $<

使用arm-elf-前缀的教程已过时。当前使用arm-none-eabi-