工具

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

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

  • Rust 1.31、1.31-beta 或更新的工具链,外加 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),与你的操作系统无关;(b)像 objdump 这样的工具支持 rustc 支持的所有架构 -- 从 ARM 到 x86_64 -- 因为它们都共享相同的 LLVM 后端。

qemu-system-arm

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

嵌入式 Rust 调试工具

概述

在 Rust 中调试嵌入式系统需要专门的工具,包括管理调试过程的软件、用于检查和控制程序执行的调试器,以及促进主机和嵌入式设备之间交互的硬件探针。本文档概述了诸如 Probe-rs 和 OpenOCD 之类的基本软件工具,它们简化并支持调试过程,以及诸如 GDB 和 Probe-rs Visual Studio Code 扩展之类的主要调试器。此外,它还涵盖了关键的硬件探针,例如 Rusty-probe、ST-Link、J-Link 和 MCU-Link,这些探针对于有效调试和编程嵌入式设备至关重要。

驱动调试工具的软件

Probe-rs

Probe-rs 是一款现代的、专注于 Rust 的软件,旨在与嵌入式系统中的调试器配合使用。与 OpenOCD 不同,Probe-rs 的构建考虑了简单性,旨在减少在其他调试解决方案中常见的配置负担。它支持各种探针和目标,为与嵌入式硬件交互提供了一个高级接口。Probe-rs 直接与 Rust 工具集成,并通过其扩展与 Visual Studio Code 集成,使开发人员可以简化其调试工作流程。

OpenOCD (Open On-Chip Debugger)

OpenOCD 是一种开源软件工具,用于调试、测试和编程嵌入式系统。它提供了主机系统和嵌入式硬件之间的接口,支持各种传输层,例如 JTAG 和 SWD(串行线调试)。OpenOCD 与 GDB 集成,GDB 是一个调试器。OpenOCD 得到广泛支持,拥有大量的文档和一个大型社区,但可能需要复杂的配置,尤其是在自定义嵌入式设置的情况下。

调试器

调试器允许开发人员检查和控制程序的执行,以便识别和纠正错误或 bug。它提供了诸如设置断点、逐行单步执行代码以及检查变量和内存状态值之类的功能。调试器对于彻底的软件开发和维护至关重要,使开发人员能够确保他们的代码在各种条件下按预期运行。

调试器知道如何

  • 与内存映射寄存器交互。
  • 设置断点/观察点。
  • 读取和写入内存映射寄存器。
  • 检测到 MCU 何时因调试事件而暂停。
  • 在遇到调试事件后继续 MCU 执行。
  • 擦除并写入微控制器的 FLASH。

Probe-rs Visual Studio Code 扩展

Probe-rs 有一个 Visual Studio Code 扩展,可提供无缝的调试体验,而无需进行大量设置。通过这种连接,开发人员可以使用 Rust 特有的功能,如漂亮的打印和详细的错误消息,确保他们的调试过程与 Rust 生态系统保持一致。

GDB (GNU Debugger)

GDB 是一种多功能的调试工具,允许开发人员在程序运行时或崩溃后检查程序的状态。对于嵌入式 Rust,GDB 通过 OpenOCD 或其他调试服务器连接到目标系统,以与嵌入式代码交互。GDB 是高度可配置的,支持远程调试、变量检查和条件断点等功能。它可以在各种平台上使用,并且广泛支持 Rust 特有的调试需求,例如漂亮的打印以及与 IDE 的集成。

探针

硬件探针是一种在嵌入式系统的开发和调试中使用的设备,用于促进主机计算机和目标嵌入式设备之间的通信。它通常支持 JTAG 或 SWD 之类的协议,使其能够对嵌入式系统上的微控制器或微处理器进行编程、调试和分析。硬件探针对于开发人员设置断点、单步执行代码以及检查内存和处理器寄存器至关重要,从而使他们能够实时诊断和修复问题。

Rusty-probe

Rusty-probe 是一款开源的基于 USB 的硬件调试探针,旨在与 probe-rs 配合使用。Rusty-Probe 和 probe-rs 的结合为开发嵌入式 Rust 应用程序的开发人员提供了一种易于使用、经济高效的解决方案。

ST-Link 是 STMicroelectronics 开发的流行的调试和编程探针,主要用于其 STM32 和 STM8 微控制器系列。它支持通过 JTAG 或 SWD(串行线调试)接口进行调试和编程。ST-Link 因其直接支持 STMicroelectronics 广泛的开发板以及集成到主要 IDE 中而得到广泛使用,使其成为使用 STM 微控制器的开发人员的便捷选择。

J-Link 由 SEGGER Microcontroller 开发,是一款强大而通用的调试器,支持各种 CPU 内核和设备,而不仅仅是 ARM,例如 RISC-V。J-Link 以其高性能和可靠性而闻名,支持各种通信接口,包括 JTAG、SWD 和细间距 JTAG 接口。它因其高级功能(例如闪存中的无限断点)以及与众多开发环境的兼容性而受到青睐。

MCU-Link 是 NXP Semiconductors 提供的调试探针,也可作为编程器使用。它支持各种 ARM Cortex 微控制器,并与 MCUXpresso IDE 之类的开发工具无缝集成。MCU-Link 特别以其多功能性和经济实惠而著称,使其成为业余爱好者、教育工作者和专业开发人员都可以使用的选项。