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 次下载
2.5MB
50K SLoC
probe-rs
一个用 Rust 编写的现代嵌入式调试工具包
该库的目标是提供一套工具,用于与各种嵌入式微控制器和调试探针进行交互。
类似的项目如 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 License,版本2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可(LICENSE-MIT 或 http://opensource.org/licenses/MIT)任选其一。
贡献
除非您明确声明,否则您根据Apache-2.0许可证定义提交的任何有意包含在工作中的贡献,将按上述方式双重授权,不附加任何额外条款或条件。
依赖项
~25–41MB
~559K SLoC