Rust in Everything
基于 probe-rs 0.32.0

RTT、defmt 与 semihosting

固件要把日志交给主机,probe-rs 支持两条路:读固件 RAM 里的 RTT 缓冲区,或者在固件执行 BKPT 0xAB 时停核处理 semihosting 请求。两条路都只用调试端口,不需要串口。

  1. RTT 控制块与通道:_SEGGER_RTT 控制块和通道描述的布局,读写偏移各由谁写;命令行先找 ELF 符号,没有符号又没给 --scan-region 就不扫;扫描是整段读 RAM 找魔数;up 读、回写读指针,down 写;ReadPointerChanged;FakeProbe 上为什么找不到。
  2. 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 解码、打印"]
RTTsemihosting
固件一侧往 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 去解码。真实芯片上的吞吐、延迟和丢失率待实测。

💬 关联讨论

发起讨论
加载中...