3. CoreSight架构入门

CoreSight 是 ARM 定义的一套片上调试与追踪基础设施规范。它并不是单一模块,而是一组通过专用总线互连的调试组件集合。理解 CoreSight 的关键,不在于记住每个组件名称,而在于弄清“外部调试器如何沿着一条可枚举的路径,从芯片外部一路走到目标内核或追踪源”。这条路径的骨架就是 DP、AP、ROM Table 与组件发现机制。

DP 与 AP:访问入口与地址空间切换

调试器通过 JTAG 或 SWD 接口连接芯片时,最先接触到的 CoreSight 组件是 DP(Debug Port,调试端口)。DP 是外部调试接口与片上调试总线之间的桥接点,负责链路管理、状态控制和事务转发。常见实现有 JTAG-DP 与 SWD-DP。DP 本身并不直接访问内存或内核寄存器,它提供的是“通道”,真正的访问目标由 AP 决定。

AP(Access Port,访问端口)挂在 DP 之下,是具体地址空间的访问代理。一个 DP 可以连接多个 AP,每个 AP 对应一类可访问资源。工程中最常见的是 MEM-AP,它把调试事务转换为对某段系统地址空间的读写,从而访问内存、外设寄存器或 CoreSight 组件寄存器。此外还有 JTAG-AP 等类型,用于访问传统 JTAG 扫描链上的器件。可以这样理解:DP 决定“能不能连上”,AP 决定“连上后访问哪片空间”。

在 TRACE32 中,这一层通常由 SYStem.CONFIG 相关命令描述。例如配置 SWD 接口、指定 DP 与 AP 编号、设置 AP 对应的基地址。若 AP 选择错误,后续所有组件扫描都会失败或读到无效值,因此 AP 配置是拓扑识别的第一步。

ROM Table:组件发现的“目录页”

CoreSight 规定,每个 AP 所对应的地址空间起始处通常放置一个 ROM Table。ROM Table 是一张只读的组件目录,它不保存业务数据,而是记录“本区域内有哪些 CoreSight 组件、它们位于什么偏移地址、属于什么类型”。调试器读取 ROM Table 后,就能自动枚举出该 AP 下的组件清单,而不需要人工逐个猜测地址。

ROM Table 的条目结构包含组件基地址偏移、组件类型标识以及是否存在子 ROM Table 的标志。当某个条目指向另一个 ROM Table 时,就形成层级结构。因此组件发现本质上是一次递归遍历:从 AP 的 ROM Table 入口开始,逐条读取条目,遇到子表继续下钻,直到枚举完所有组件。每个 CoreSight 组件内部还有一组标准寄存器,其中 CIDR(Component ID)和 PIDR(Peripheral ID)用于标识厂商、组件类别和具体型号。调试器正是通过读取这些标识来确认“这个地址上到底是什么组件”。

ROM Table 的基地址通常由芯片设计固定,并在 TRACE32 配置中以 AP 基地址或 CoreSight 基地址的形式给出。若该地址配置错误,组件发现会读到全 0 或全 F,表现为“扫描不到任何组件”。

组件发现机制与拓扑识别

组件发现机制可以概括为“从 AP 出发,沿 ROM Table 递归枚举,再按组件类型建立连接关系”。枚举完成后,调试器得到的不只是组件列表,还包括组件之间的连接信息。例如,一个 Cortex-M 内核通常对应一个 AHB-AP 或 APB-AP,其 ROM Table 中会列出内核调试组件、断点单元、追踪单元等。对于多核系统,可能存在多个 AP,每个 AP 下各有自己的 ROM Table 子树。

拓扑识别则是在组件发现的基础上,进一步确定“谁连接谁、数据往哪走”。CoreSight 组件之间通过 ATB(AMBA Trace Bus)等追踪总线连接,追踪源(如 ETM)产生的数据经过 FIFO、复制器、格式化器,最终到达 TPIU 或 ETR 等汇点。调试器需要识别这条追踪路径,才能正确配置追踪数据流向。对于调试访问路径,则主要关注 AP 到内存/内核的访问关系;对于追踪路径,则关注 ATB 连接关系。两者共同构成完整的 CoreSight 拓扑。

CoreSight 组件发现与拓扑识别路径 外部调试器 TRACE32 / Probe JTAG / SWD 物理链路 DP 调试端口 AP MEM-AP / JTAG-AP ROM Table 组件目录入口 子 ROM Table 递归下钻 Cortex-M 内核 调试组件 ETM 追踪源 指令追踪 TPIU / ETR 追踪汇点 ATB 追踪总线 组件标识寄存器 CIDR:组件类别与厂商 PIDR:具体型号与版本 ROM 条目:偏移 + 类型 + 子表标志 读取全 0 / 全 F → 地址或 AP 配置错误 调试访问路径 追踪数据路径

在 TRACE32 中识别拓扑的实操思路

实际调试时,拓扑识别通常按以下顺序推进。首先确认接口与 DP 连接正常,TRACE32 能读到 DP 的 IDCODE 或状态寄存器。接着配置 AP,使调试器能够访问目标地址空间。然后读取 AP 基地址处的 ROM Table,执行组件扫描。TRACE32 的 SYStem.CONFIG 与 SYStem.DETECT 类命令会触发这一过程,并在系统窗口中列出发现的组件。

若组件列表为空,优先检查 AP 基地址是否正确、AP 是否被使能、目标是否处于复位或低功耗状态。若组件列表不完整,检查是否存在子 ROM Table 未被递归访问,或某些组件被时钟门控关闭。若追踪路径无法建立,则需检查 ATB 连接关系与追踪汇点配置,确认 ETM 到 TPIU/ETR 的路径是否被正确识别。

; 示例:TRACE32 中配置 AP 并触发组件发现(参数为示例值)
SYStem.CONFIG DEBUGPORT.TYPE SWD
SYStem.CONFIG AP 0
SYStem.CONFIG APBASE 0xE00FF000
SYStem.DETECT
; 观察系统窗口中的 CoreSight 组件树
; 若 ROM Table 读取失败,检查 APBASE 与 AP 编号

需要强调的是,上述地址与参数仅为教学示例,实际值必须依据芯片手册中的 CoreSight 基地址与 AP 分配确定。不同厂商、不同内核的 ROM Table 布局差异较大,但“DP → AP → ROM Table → 组件 → 拓扑”这一发现链条是共通的。掌握这条链条,就能在面对陌生芯片时,有章法地完成 CoreSight 拓扑识别,而不是盲目试错。