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次下载
2.5MB
52K SLoC
probe-rs
一个使用Rust编写的现代嵌入式调试工具包
该库的目标是提供一套工具,用于与各种嵌入式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-debugger 和 vscode。
使用示例
停止连接的芯片
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(《LICENSE-APACHE》或 https://apache.ac.cn/licenses/LICENSE-2.0》)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
贡献
除非您明确说明,否则您有意提交以供包含在此作品中的任何贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。
依赖关系
约 20–33MB
~533K SLoC