18个版本 (重大更新)

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.6.0 2020年3月30日

1676嵌入式开发

Download history 102/week @ 2024-04-08 94/week @ 2024-04-15 111/week @ 2024-04-22 120/week @ 2024-04-29 103/week @ 2024-05-06 153/week @ 2024-05-13 59/week @ 2024-05-20 8/week @ 2024-05-27 6/week @ 2024-06-03 10/week @ 2024-06-10 4/week @ 2024-06-24 102/week @ 2024-07-22

每月103 次下载
用于 postform_rtt

MIT/Apache

2.5MB
51K 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,则必须自己编写目标定义和闪存算法。您可以使用我们的模板来编写算法。请按照该repo中的README.md中的说明操作。

致谢

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

许可证

根据以下任一许可证授权

贡献

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

依赖项

~12-22MB
~309K SLoC