Rust in Everything
基于 probe-rs 0.32.0

ARM 调试架构

architecture/arm/ 是核心库里最大的目录,2.37 万行。本卷只讲 Cortex-M 这条线:ARM 调试接口 ADIv5(兼顾 ADIv6)、Armv6-M / v7-M / v8-M 内核、调试序列。Cortex-A / R(armv7ar.rs、armv8a.rs,合计约 6800 行)、ITM / TPIU 等 trace 组件不讲。访问主线的中段和调试主线的前半段都在这里。

四章按「从线上往上」排:

  1. DP、AP 与 SELECT:ADI 的模型,一个 DP 后面挂若干 AP;ArmCommunicationInterface 怎么在第一次访问某个 DP 时跑 setup / start 序列、怎么用一份 SELECT 缓存省掉重复的 bank 切换;ADIv6 的 64 位 AP 地址;0.30 去掉 typestate 的取舍。模拟目标上看 attach 时 DP 一侧的 3 个 SWJ 序列和 15 次寄存器访问。
  2. MEM-AP 与 ROM table:访问主线中段,写 TAR、读 DRW、按 1 KiB 切块;7 种 MEM-AP 变体共用一个 MemoryAp 枚举;每次 session.core(i) 都会重建 MEM-AP 状态(8 次访问);ROM table 怎么一层层找到 SCS、DWT、FPB、ITM。
  3. Cortex-M 内核:halt、寄存器、断点、单步:调试主线前半段,DHCSR、DFSR、DCRSR / DCRDR、DEMCR、FP_CTRL / FP_COMPn;halt、run(先单步一次)、step(关断点、屏蔽中断、停在 BKPT 上手动跳过)、set_hw_breakpoint 的两种 FPB 编码;Armv6-M、Armv8-M 的不同。
  4. 调试序列与 vendor:ArmDebugSequence 的 18 个钩子,Vendor 按芯片名选序列;STM32 写 DBGMCU_CR、nRF 读 CTRL-AP;Session::new 的 attach 顺序,用模拟目标记下完整的 142 次访问。
flowchart TB
  dpap["DP、AP 与 SELECT"] --> memap["MEM-AP 与 ROM table"]
  memap --> core["Cortex-M 内核"]
  seq["调试序列与 vendor"] -.-> dpap
  seq -.-> core
  core --> debug["08 调试信息"]

本部分的实验大多用自己写的模拟目标:它实现 RawDapAccess,背后是一个 SW-DP(DPIDR 0x1BA01477)、一个 AHB-AP(IDR 0x24770011)、一块稀疏内存,加上 DHCSR、DFSR、DCRSR / DCRDR、FP_CTRL、FP_COMPn 和一张 Cortex-M3 式的 ROM table;硬件断点比较器个数可以设,默认 6 个。probe-rs 自己的代码跑在上面,每次 DP / AP 访问记一行。模拟目标的寄存器值是照规范填的,不代表任何一颗具体芯片。

主要文件(行数含文件内测试):

文件行数管什么章
communication_interface.rs、dp/、ap/约 4 100DP / AP、SELECT、MEM-AP 寄存器1、2
memory/adi_memory_interface.rs、memory/romtable.rs1 756内存访问、ROM table2
core/armv6m.rs、armv7m.rs、armv8m.rs、cortex_m.rs、core/mod.rs3 892Cortex-M 内核3
sequences.rs1 180调试序列 trait 与默认实现4
traits.rs、traits/polyfill.rs2 433RawDapAccess、DapAccess,位级探针的 polyfill02 探针层

💬 关联讨论

发起讨论
加载中...