动手
前面各部分读的是 probe-rs 的源码。这一部分反过来,站到它的两头各写一小段代码,验证读源码时得出的两个结论:探针 trait 是公开的,所以可以在库外接一个「探针」;调试层只认 MemoryInterface,所以可以接一个不是 probe-rs 的后端。
- 写一个软件探针:约 400 行。目标一侧是 SW-DP、一个 MEM-AP、一块内存和 DHCSR / DCRSR / DCRDR / DFSR / FP_CTRL;线一侧把 SWD 位流解成包、按「AP 读是 posted」和 probe-rs 的采样相位回填;主机一侧先用自己写的 46 位包编码读
0x20000000、停核、读 PC(18 个包),再把同一个目标实现成RawSwdIo交给Probe::new(..).attach("STM32F103C8"),看 probe-rs 自己的 polyfill 和Session驱动它(attach 258 个包)。顺带测出 attach 的最低要求:不需要 ROM table,但 CTRL/STAT 必须回应上电请求,否则「A timeout occurred.」。 - 用 QEMU 的 GDB 服务端展开活固件:probe-rs 只有 GDB 服务端、没有客户端,和 QEMU 之间没有桥。写一个百来行的 GDB 远程协议客户端,读出 QEMU 里 STM32L475 固件的寄存器,用
CoreDump的公开字段造出DebugRegisters,再把客户端实现成MemoryInterface:probe-rs-debug 展开出 9 帧,一直到Reset,只发了 20 个读内存的包。RTT 控制块卡在Rtt::attach_at只收&mut Core、而Core不能在库外构造,只好手工解析。
flowchart TB host["主机:自己的编码 / probe-rs polyfill"] --> wire["线:SWD 位流"] wire --> sim["软件目标:DP、MEM-AP、调试寄存器"] qemu["QEMU:-gdb tcp"] --> rsp["自写 RSP 客户端"] rsp --> mi["impl MemoryInterface"] mi --> dbg["probe-rs-debug:unwind"] sim --> sess["probe-rs Session"]
两章的代码都只给思路和关键片段,用 2 空格缩进,依赖 probe-rs =0.32.0、probe-rs-debug =0.32.0,离线编译。完整工程、逐步的作业(给软件目标加上 WAIT 应答和 ROM table、让 QEMU 客户端支持写内存和断点、把它包成一个完整的探针驱动)放在对应的课程里。
💬 关联讨论
发起讨论加载中...