工具

处理微控制器涉及使用多种不同的工具,因为我们将处理与您的笔记本电脑不同的架构,并且我们必须在远程设备上运行和调试程序。

我们将使用下面列出的所有工具。任何最新版本在没有指定最低版本的情况下都应该可以工作,但我们列出了我们测试过的版本。

  • Rust 1.31、1.31-beta 或更新的工具链 PLUS ARM Cortex-M 编译支持。
  • cargo-binutils ~0.1.4
  • qemu-system-arm。测试版本:3.0.0
  • OpenOCD >=0.8。测试版本:v0.9.0 和 v0.10.0
  • 具有 ARM 支持的 GDB。强烈建议使用 7.12 或更高版本。测试版本:7.10、7.11、7.12 和 8.1
  • cargo-generategit。这些工具是可选的,但将使您更容易遵循本书。

以下文本解释了我们为什么要使用这些工具。安装说明可以在下一页找到。

cargo-generategit

裸机程序是非标准 (no_std) Rust 程序,需要对链接过程进行一些调整才能使程序的内存布局正确。这需要一些额外的文件(如链接器脚本)和设置(如链接器标志)。我们已经为您打包了这些文件,因此您只需要填写缺少的信息(例如项目名称和目标硬件的特性)。

我们的模板与 cargo-generate 兼容:一个 Cargo 子命令,用于从模板创建新的 Cargo 项目。您也可以使用 gitcurlwget 或您的 Web 浏览器下载模板。

cargo-binutils

cargo-binutils 是一个 Cargo 子命令集合,它使您能够轻松使用 Rust 工具链附带的 LLVM 工具。这些工具包括 LLVM 版本的 objdumpnmsize,用于检查二进制文件。

与 GNU binutils 相比,使用这些工具的优势在于 (a) 安装 LLVM 工具与您的操作系统无关,只需一个命令(rustup component add llvm-tools-preview),以及 (b) objdump 等工具支持 rustc 支持的所有架构 - 从 ARM 到 x86_64 - 因为它们都共享相同的 LLVM 后端。

qemu-system-arm

QEMU 是一个模拟器。在这种情况下,我们使用可以完全模拟 ARM 系统的变体。我们使用 QEMU 在主机上运行嵌入式程序。感谢这一点,即使您没有硬件,您也可以遵循本书的某些部分!

GDB

调试器是嵌入式开发中非常重要的组成部分,因为您可能并不总是能够将日志信息记录到主机控制台。在某些情况下,您甚至可能没有 LED 在您的硬件上闪烁!

总的来说,LLDB 在调试方面与 GDB 一样好,但我们还没有找到 LLDB 中与 GDB 的 load 命令等效的命令,该命令将程序上传到目标硬件,因此目前我们建议您使用 GDB。

OpenOCD

GDB 无法直接与 STM32F3DISCOVERY 开发板上的 ST-Link 调试硬件通信。它需要一个翻译器,而 Open On-Chip Debugger,OpenOCD,就是那个翻译器。OpenOCD 是一个在您的笔记本电脑/PC 上运行的程序,它在 GDB 的基于 TCP/IP 的远程调试协议和 ST-Link 的基于 USB 的协议之间进行翻译。

OpenOCD 还作为其翻译的一部分执行其他重要工作,用于调试 STM32F3DISCOVERY 开发板上的基于 ARM Cortex-M 的微控制器

  • 它知道如何与 ARM CoreSight 调试外设使用的内存映射寄存器进行交互。正是这些 CoreSight 寄存器允许
    • 断点/观察点操作
    • 读取和写入 CPU 寄存器
    • 检测 CPU 何时因调试事件而停止
    • 在遇到调试事件后继续 CPU 执行
    • 等等。
  • 它还知道如何擦除和写入微控制器的 FLASH