#debug-probes #probe #mcu #probe-rs #interface

probe-rs-cli-util

基于probe-rs的CLI应用程序的辅助库

13个版本 (重大更新)

0.18.0 2023年3月31日
0.16.0 2023年1月29日
0.13.0 2022年7月12日
0.12.0 2021年11月24日
0.10.1 2020年11月20日

#1756 in 嵌入式开发

每月42次下载

MIT/Apache

2.5MB
52K SLoC

probe-rs

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

crates.io documentation Actions Status chat

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

类似的项目如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上支持该项目,以获得更好的支持和更多功能。

下载文件

cargo-flash 工具可以用作 cargo 子命令,将编译后的 Rust 程序下载到目标设备上。它也可以用于下载来自 C/C++ 编译器的任意 ELF 文件。更多信息请查看 cargo-flash

使用 probe-rs 进行更好的调试

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

VSCode

我们实现了 Microsoft DAP 协议。这使得通过 probe-rs 进行嵌入式调试在现代支持该协议的代码编辑器(如 VSCode)中成为可能。更多信息请查看 probe-rs-debuggervscode

使用示例

停止连接的芯片

use probe_rs::{Permissions, Probe};

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

    // Use the first probe found.
    let 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(300))?;

    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 安装。probe-rs 还依赖于 libusb 和 libftdi。在 Linux 上,您可以使用您的包管理器安装它们

# Ubuntu
> sudo apt install -y libusb-1.0-0-dev libftdi1-dev libudev-dev libssl-dev

# Fedora
> sudo dnf install -y libusbx-devel libftdi-devel libudev-devel openssl-devel

在 Windows 上,您可以使用 vcpkg

# dynamic linking 64-bit
> vcpkg install libftdi1:x64-windows libusb:x64-windows
> set VCPKGRS_DYNAMIC=1

# static linking 64-bit
> vcpkg install libftdi1:x64-windows-static-md libusb:x64-windows-static-md

有关使用 rust 配置 vcpkg 的更多信息,请参阅 vcpkg crate 文档

添加目标

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

编写新的闪存算法

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

致谢

在此库的早期阶段,我们从 pyOCD 代码中受益匪浅,了解了闪存工作原理。它始终是交叉检查 ARM 特定事物的好参考。因此,向 pyOCD 背后的团队表示衷心的感谢!

许可证

根据以下任一项许可证授权

贡献

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

依赖关系

约 20–33MB
~533K SLoC