1 个不稳定版本
0.1.0 | 2024 年 5 月 22 日 |
---|
488 在 嵌入式开发 中排名 #488
644 次每月下载
用于 probe-rs-tools
10KB
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/。
使用 shell 脚本
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-installer.sh | sh
使用 powershell 脚本
irm https://github.com/probe-rs/probe-rs/releases/latest/download/probe-rs-installer.ps1 | iex
从源码安装
工具也可以从源码安装。在安装必要的 先决条件 后,可以使用以下命令安装最新开发版本:cargo install
cargo install probe-rs-tools --git https://github.com/probe-rs/probe-rs --locked
这将编译工具并将它们放置在 cargo bin
目录中。有关详细信息,请参阅 Cargo 手册。
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::{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 进行安装。在 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, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT) 由您选择。
贡献
除非您明确说明,否则您提交的任何贡献,根据Apache-2.0许可证的定义,将按照上述方式双重许可,不附加任何额外的条款或条件。
依赖项
~0.5–1MB
~25K SLoC