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

Preparing GNU toolchain for bare metal ARM on Linux

我想为裸机 ARM 准备 GNU 工具链,以便与 Geany IDE 一起使用。有一些像这样的教程:Building the GNU ARM Toolchain for Bare Metal 但我不明白几个步骤。

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

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

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

我是否可以仅通过使用适当的参数调用 gcc 来准备工具链,或者我是否需要对 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")。
  • 您可以下载预编译包:GNU Tools for ARM Embedded Processors.
  • 你可以试着编译一个。如果你想要正确的多库,这并不容易。

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

交叉编译

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

然后将 .c 编译为 .o 的(简单)规则看起来像

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

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