{arm,thumb}*-none-eabi(hf)?

层级:2

  • arm(eb)?v7r-none-eabi(hf)?
  • armv7a-none-eabi
  • thumbv6m-none-eabi
  • thumbv7m-none-eabi
  • thumbv7em-none-eabi(hf)?
  • thumbv8m.base-none-eabi
  • thumbv8m.main-none-eabi(hf)?

层级:3

32 位 ARM CPU 的裸机目标。

如果目标具有 *hf 变体,则该变体使用硬件浮点 ABI 并根据该处理器系列中可用的 FPU 启用一些最小浮点功能集。

要求

这些目标是交叉编译的,并使用静态链接。

默认情况下,将使用 Rust 附带的 lld 链接器;但是,您可能希望使用 GNU 链接器。这可以在 Windows/Mac/Linux 上从 Arm 开发者网站 获得,或者可能从您的操作系统包管理器获得。要使用它,请将以下内容添加到您的 .cargo/config.toml

[target.<your-target>]
linker = "arm-none-eabi-ld"

GNU 链接器也可以通过将 arm-none-eabi-gcc 指定为链接器来使用。这在使用 GCC 的链接时优化时是必需的。

这些目标不提供链接器脚本,因此您需要根据您使用的特定设备自行提供。传递 -Clink-arg=-Tyour_script.ld 作为 rustc 参数,以使链接器在链接期间使用 your_script.ld

名为 thumb* 而不是 arm* 的目标默认情况下生成 Thumb 模式代码。M 剖析处理器 (thumbv*m*-* 目标) 仅支持 Thumb 模式代码。对于 arm* 目标,可以使用 -C target-feature=+thumb-mode 启用 Thumb 模式代码生成。使用不稳定的 #![feature(arm_target_feature)],属性 #[target_feature(enable = "thumb-mode")] 可以应用于单个 unsafe 函数,以使这些函数被编译为 Thumb 模式代码。

构建 Rust 程序

对于此系列中的层级 3 目标,rust 不提供预编译的工件。

只需使用 build-std nightly cargo 功能来构建 core 库。您可以将其作为命令行参数传递给 cargo,或者您的 .cargo/config.toml 文件可能包含以下行

[unstable]
build-std = ["core"]

大多数 core 应该按预期工作,并注意以下几点

  • 如果目标不是 *hf,则浮点运算将在软件中模拟。
  • 整数除法也将在某些目标上在软件中模拟,具体取决于 CPU。
  • ARMv7 之前的架构没有原子指令。

alloc 也受支持,只要您提供自己的全局分配器。

Rust 程序输出为 ELF 文件。

测试

这是一个交叉编译的目标,您需要在测试期间对其进行模拟。

您需要的确切模拟器取决于您要运行代码的特定设备。

交叉编译工具链和 C 代码

该目标支持使用 arm-none-eabi 目标三元组和合适的 -march-mcpu 标志编译的 C 代码。

可以使用 gccclang,但请注意,gcc 默认情况下对 arm-none* 目标使用 -fshort-enums,而 clang 则不使用。rustc 匹配 gcc 行为,即 Rust 中 #[repr(C)] enum 的大小可以小到 1 字节,而不是 4 字节,因为它们在 arm-linux 目标上。