12 个版本 (重大更新)

0.24.0 2024 年 5 月 22 日
0.23.0 2024 年 2 月 24 日
0.22.0 2024 年 1 月 3 日
0.21.1 2023 年 10 月 12 日
0.18.0 2023 年 3 月 31 日

#137 in 嵌入式开发

每月 38 次下载

MIT 许可证

2.5MB
50K SLoC

probe-rs

一个用 Rust 编写的现代嵌入式调试工具包

crates.io documentation Actions Status chat

该库的目标是提供一套工具,用于与各种嵌入式微控制器和调试探针进行交互。

类似的项目如 OpenOCD、PyOCD、Segger Toolset、ST Tooling 等。它们都实现了 GDB 协议,并在其之上实现自己的协议,以使 GDB 能够与调试探针通信。只有 Segger 提供了可以用于与 JLink 通信的封闭源代码 DLL。

本项目移除了 GDB 层,并提供了一个直接访问调试探针的接口,从而使得其他软件可以使用其调试功能。

本项目最终目标是拥有一个完整的库工具集,以使其他工具能够与嵌入式目标通信。

功能

截至 0.10.0 版本,此库可以

  • 连接到 DAPLink、STLink 或 JLink
  • 通过 SWD 或 JTAG 与 ARM 和 Risc-V 内核通信
  • 读取和写入目标任意内存
  • 停止、运行、单步、断点设置以及更多核心功能
  • 使用标准 CMSIS-Pack 固件算法将 ELF、BIN 和 IHEX 二进制文件下载到 ARM 内核
  • 提供关于目标状态(堆栈跟踪、堆栈帧等)的调试信息

要查看新增的功能,请参阅 变更日志

支持

如果您认为 probe-rs 让您的嵌入式之旅更加愉快,甚至为您带来了收入,请考虑在 GitHub Sponsors 上支持该项目,以获得更好的支持和更多功能。

工具

除了是一个库之外,probe-rs 还包括一套用于编程和调试的工具。

安装

推荐安装工具的方式是下载预编译版本,使用以下方法之一。请参阅https://probe.rs/docs/getting-started/installation/获取更详细的指南。

cargo-flash

cargo-flash工具可以用作cargo子命令,将编译好的Rust程序下载到目标设备上。它也可以用来下载由C/C++编译器生成的任意ELF文件。请参阅cargo-flash获取更多信息。

cargo-embed

如果您正在寻找更丰富的调试体验,请查看cargo-embed,它提供了对GDB、RTT和配置文件的支持。

编辑器和IDE

我们已经实现了Microsoft Debug Adapter Protocol (DAP)。这使得通过probe-rs进行嵌入式调试在支持该标准的现代代码编辑器中变得可行,如VSCode。DAP网站包括支持DAP的编辑器和IDE列表

VSCode

probe-rs网站提供了VSCode配置说明

使用示例

停止连接的芯片

use probe_rs::probe::{list::Lister, Probe};
use probe_rs::Permissions;

fn main() -> Result<(), probe_rs::Error> {
    // Get a list of all available debug probes.
    let lister = Lister::new();

    let probes = lister.list_all();

    // Use the first probe found.
    let mut probe = probes[0].open()?;

    // Attach to a chip.
    let mut session = probe.attach("nRF52840_xxAA", Permissions::default())?;

    // Select a core.
    let mut core = session.core(0)?;

    // Halt the attached core.
    core.halt(std::time::Duration::from_millis(10))?;

    Ok(())
}

从RAM读取

use probe_rs::{MemoryInterface, Permissions, Session};

fn main() -> Result<(), probe_rs::Error> {
    // Attach to a chip.
    let mut session = Session::auto_attach("nRF52840_xxAA", Permissions::default())?;

    // Select a core.
    let mut core = session.core(0)?;

    // Read a block of 50 32 bit words.
    let mut buff = [0u32; 50];
    core.read_32(0x2000_0000, &mut buff)?;

    // Read a single 32 bit word.
    let word = core.read_word_32(0x2000_0000)?;

    // Writing is just as simple.
    let buff = [0u32; 50];
    core.write_32(0x2000_0000, &buff)?;

    // of course we can also write 8bit words.
    let buff = [0u8; 50];
    core.write_8(0x2000_0000, &buff)?;

    Ok(())
}

常见问题解答

我需要帮助!

请不要犹豫,提交一个问题,在Matrix上提问,或通过电子邮件联系@Yatekii

项目页面上还有一个故障排除部分

我如何帮助?

请查看问题或如果您觉得需要,可以提出一个问题。

任何贡献都十分欢迎!

还可以查看CONTRIBUTING.md

我们的公司需要功能X,并愿意为其开发付费

请联系@Yatekii

构建

构建需要Rust和Cargo,可以使用rustup进行安装。在Linux上,您可以使用软件包管理器安装它们

# Ubuntu
> sudo apt install -y libudev-dev

# Fedora
> sudo dnf install -y libudev-devel

添加目标

目标文件是由target-gen生成的,使用这里提供的CMSIS包。生成的文件然后放置在probe-rs/targets中,以便包含在probe-rs项目中。

编写新的闪存算法

如果没有提供带有闪存算法的CMSIS-Pack,则必须自己编写目标定义和闪存算法。您可以使用我们为编写算法提供的模板。请遵循该存储库中的README.md中的说明。

致谢

在此库的早期阶段,我们从pyOCD代码中受益匪浅,以了解闪存是如何工作的。它始终是一个良好的参考,可以交叉检查ARM特定事情是如何工作的。因此,非常感谢pyOCD背后的团队!

许可

根据以下任一许可获得许可

贡献

除非您明确声明,否则您根据Apache-2.0许可证定义提交的任何有意包含在工作中的贡献,将按上述方式双重授权,不附加任何额外条款或条件。

依赖项

~25–41MB
~559K SLoC