1. 课程导入与工程全景

在嵌入式实时系统的调试与验证中,很多问题并不是"程序跑不跑得起来",而是"程序在真实时序下到底怎么跑"。断点会打断系统运行、printf 会改变执行时序、逻辑分析仪又难以同时看到 C 代码与总线行为。TRACE32 的 Trace(跟踪)功能正是为填补这一空白而存在:它利用芯片内部的跟踪硬件,在不停止 CPU 的前提下,把程序执行流、函数调用、任务切换、总线访问等事件连续记录下来,再通过软件还原成可分析的时间线。本课程要建立的,就是围绕这条"采集—存储—还原—分析"链路的一套完整工程能力。

一、这门课要交付什么

本课程不是 TRACE32 菜单功能的罗列,而是以"工程交付物"为导向组织内容。学完之后,你应当能够独立完成以下四类交付物:

  • 可复现的采集配置:针对指定芯片与调试探头,给出 Trace 采集的完整配置,包括跟踪源选择(指令跟踪 / 数据跟踪 / 两者并行)、跟踪存储方式(片上 RAM、片上 AGBT/Aurora 高速输出、外部 Trace 存储器)、触发条件与过滤条件。
  • 可判读的跟踪数据:能够把采集到的原始跟踪流还原为函数调用序列、任务切换序列、中断响应序列,并给出关键时间指标。
  • 可定位的分析结论:针对典型问题(偶发死机、任务超时、中断延迟过大、栈溢出、总线异常访问),能从 Trace 数据中给出有证据支撑的结论,而不是"猜"。
  • 可复用的分析脚本:使用 TRACE32 的 PRACTICE 脚本(.cmm)把重复性的采集与统计动作固化下来,形成团队可共享的分析资产。

这四类交付物贯穿全部 30 章,每一章都会落到其中某一环上。判断自己是否真正掌握,标准不是"会点按钮",而是"换一块板子、换一个芯片,还能把这条链路重新搭起来并得到可信结论"。

二、角色分工:谁在什么位置做什么

Trace 工程通常不是一个人完成的,它横跨几个角色。理解分工,有助于你在实际项目中快速找到该找谁、该给谁什么。

角色核心职责典型产出
硬件/板级工程师确认跟踪引脚引出、Trace 连接器、时钟与参考时钟、外部 Trace 存储器供电与走线原理图跟踪部分、连接器定义、信号完整性报告
底层/BSP 工程师配置芯片跟踪单元(如 ETM/PTM、STM、ITM、Nexus)、时钟树、跟踪 RAM 区域、调试认证初始化代码、跟踪寄存器配置、可用的调试连接
应用/系统工程师提出要回答的问题、定义触发场景、解读任务与中断行为问题描述、复现步骤、分析结论
调试/验证工程师(本课程主要面向)搭建 TRACE32 采集环境、编写脚本、还原数据、输出分析报告采集配置、分析脚本、Trace 分析报告

需要强调的是:Trace 分析结论的可信度,取决于最弱的那一环。如果板级跟踪走线质量差,再好的分析脚本也只能得到丢帧的数据;如果 BSP 没有正确使能跟踪单元,TRACE32 界面上会直接显示无跟踪数据。因此本课程会反复强调"先确认链路,再谈分析"。

三、工具链组成

一条完整的 Trace 工程链路,由硬件与软件两部分构成,缺一不可。

硬件侧包括:目标芯片内部的跟踪宏单元(指令跟踪、数据跟踪、时间戳)、芯片的跟踪输出接口(并行 Trace 口、AGBT/Aurora 高速串行口、或仅片上 RAM)、调试探头(如 TRACE32 的 PowerTrace、CombiProbe 系列)、以及外部 Trace 存储器或采集卡。片上 RAM 方式成本低但深度有限,高速串行输出方式可记录长时间窗口但需要额外硬件。

软件侧包括:TRACE32 主程序与对应芯片的调试驱动、Trace 配置与显示窗口(Trace.List、Trace.Chart、Trace.Stat 等)、以及 PRACTICE 脚本环境。脚本是把"一次性调试"变成"可重复工程"的关键,本课程会从第 1 章开始逐步引入。

判断链路是否打通的最快方法:在 TRACE32 中执行一次短采集,观察 Trace.List 是否出现连续、时间戳单调递增的记录。若为空或时间戳跳变,问题在采集链路而非分析环节。

四、工程全景与学习路径

把上述内容串起来,就得到本课程的整体结构。下图给出从"问题"到"结论"的完整数据流,以及各环节对应的课程模块位置,可作为后续学习的路线图。

TRACE32 Trace 数据采集分析工程全景 问题输入 死机 / 超时 / 抖动 采集配置 跟踪源 / 触发 / 过滤 存储方式选择 目标芯片跟踪单元 ETM / PTM / STM / ITM 时间戳 + 数据跟踪 探头与跟踪存储 PowerTrace / 外部 RAM 片上 RAM / 高速串行 数据还原与显示 Trace.List 指令流 Trace.Chart 时间线 / Trace.Stat 统计 分析维度 函数调用 / 任务切换 中断延迟 / 总线访问 结论与报告 证据链 + 时间指标 可复现分析脚本 PRACTICE 脚本固化复用 学习路径(对应课程模块) 基础篇 跟踪原理 / 链路搭建 采集篇 触发 / 过滤 / 存储 分析篇 调用 / 任务 / 中断 脚本篇 PRACTICE 自动化 实战篇 综合案例复盘

图中上半部分是数据流:问题定义决定采集配置,采集配置作用于目标芯片的跟踪单元,跟踪数据经探头与存储介质进入 TRACE32,再被还原为可读的指令流与时间线,最终形成分析结论。下半部分是学习路径:基础篇建立原理与链路认知,采集篇解决"怎么采到",分析篇解决"怎么读懂",脚本篇解决"怎么复用",实战篇把前面所有能力合起来解决真实问题。

五、一个最小可运行的起点

为了让后续章节有共同的操作基础,这里给出一个最小采集流程的骨架。假设目标芯片支持片上跟踪 RAM,且调试探头已连接,可在 TRACE32 命令窗口执行类似如下序列(具体寄存器与地址随芯片不同,此处为示例结构):

SYStem.Up                      ; 建立调试连接
Trace.METHOD Onchip            ; 选择片上跟踪 RAM 方式
Trace.CONFIG.ON               ; 使能跟踪采集
Trace.Arm                      ; 准备采集
Go                            ; 目标运行
Break                         ; 触发或手动停止
Trace.List                    ; 查看还原后的指令流
Trace.Stat                    ; 查看函数/任务统计

执行后重点观察三件事:Trace.List 中记录是否连续、时间戳是否单调递增、函数名是否能正确解析。若函数名显示为地址而非符号,说明符号表未加载;若记录中断,说明跟踪存储溢出或链路丢帧。这两个现象分别指向软件配置与硬件链路,是后续排障章节的典型入口。

不要把"能打开 Trace 窗口"当作链路已通。真正的判据是:在已知触发条件下,采集到的记录能覆盖预期的时间窗口,且时间戳与代码中的延时、周期任务周期在量级上一致。任何一处对不上,都应先回到采集配置与硬件链路排查。