在 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-
正在使用中。
我想为裸机 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-
正在使用中。