4 个版本 (重大更改)

0.7.0 2020 年 11 月 19 日
0.6.0 2020 年 3 月 30 日
0.5.0 2020 年 3 月 3 日
0.4.0 2020 年 1 月 15 日

#10 in #debug-probes

MIT/Apache

17KB
331

probe-rs

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

documentation Actions Status chat

此库的目的是提供一套工具来与各种嵌入式 MCU 和调试探针交互。

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

此项目消除了 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。

使用示例

停止连接的芯片

use probe_rs::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("nrf52")?;

    // 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, Session};

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

    // 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-dev libusb-1.0 libftdi1-dev

在 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 文档

添加目标

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

赞助商

Technokrat

致谢

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

许可证

许可协议如下

贡献

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

依赖关系

~2.5MB
~46K SLoC