RTT、defmt 与 semihosting
固件要把日志交给主机,probe-rs 支持两条路:读固件 RAM 里的 RTT 缓冲区,或者在固件执行 BKPT 0xAB 时停核处理 semihosting 请求。两条路都只用调试端口,不需要串口。
- RTT 控制块与通道:
_SEGGER_RTT控制块和通道描述的布局,读写偏移各由谁写;命令行先找 ELF 符号,没有符号又没给--scan-region就不扫;扫描是整段读 RAM 找魔数;up 读、回写读指针,down 写;ReadPointerChanged;FakeProbe上为什么找不到。 - defmt 与 semihosting:defmt 帧在客户端用本机 ELF 解码,通道按名字识别,默认阻塞模式;semihosting 的识别、解码和处理;
hprintln!在 QEMU 和 probe-rs 下的区别。
flowchart TB fw["固件"] -->|"写环形缓冲区"| ram["目标 RAM:RTT 控制块"] fw -->|"BKPT 0xAB"| halt["核停下"] ram -->|"每轮轮询:读内存"| srv["RPC 服务端"] halt -->|"每轮轮询:status"| srv srv -->|"原始字节"| cli["客户端:defmt 解码、打印"]
| RTT | semihosting | |
|---|---|---|
| 固件一侧 | 往 RAM 里的缓冲区写,不停核 | BKPT 0xAB,核停到主机处理完 |
| 主机怎么发现 | 每轮轮询读通道的写偏移 | 每轮轮询读 DHCSR,看停没停、停在哪 |
| 一次的代价(模拟目标) | 空读 11 次 DP / AP 访问,其中 8 次是重建 Core | 识别一次 SYS_EXIT 37 次,外加停核、单步、放行 |
| 主机到固件 | down 通道 | SYS_READ 等 |
| 需要的固件支持 | 控制块(rtt-target、defmt-rtt) | 无,任何 Cortex-M 都能用 |
本部分的实验都在本卷的模拟 SWD 目标上做:往它的 RAM 里摆一个控制块让 probe-rs 去读;手工制造「刚执行了 BKPT 0xAB」的状态让 probe-rs 去解码。真实芯片上的吞吐、延迟和丢失率待实测。
💬 关联讨论
发起讨论加载中...