3. 目标系统软硬件准备
SystemView 的实时记录依赖一条稳定的“事件数据通道”:目标 MCU 上的 SEGGER 记录模块把事件写入 RAM 缓冲区,J-Link 通过调试接口按周期把缓冲区内容搬回主机,SystemView 再在 PC 端解析成时间线。这条链路上任何一环不满足条件,都会表现为“连不上”“采不到数据”“时间线断裂”或“程序跑飞”。因此动手打开 SystemView 之前,先把目标系统的软硬件条件逐项确认清楚,比事后排障省时得多。
一、MCU 支持条件:先看内核,再看记录模块
SystemView 的目标端记录模块(SEGGER RTT + SystemView Target Sources)以源码形式集成,对内核有明确要求。主流支持对象包括:ARM Cortex-M0/M0+/M3/M4/M7/M23/M33、Cortex-A/R(部分)、RISC-V(RV32/RV64)、以及部分 Renesas RX、Microchip PIC32 等。判断方法很直接:打开 SEGGER 安装目录下的 SystemView/Target/,查看是否存在对应内核的移植文件,例如 SEGGER_SYSVIEW_CortexM.c、SEGGER_SYSVIEW_RISCV.c。若目标内核不在列表中,需要自行实现 SEGGER_SYSVIEW_Conf.c 中的时间戳与中断记录接口,工作量明显上升。
除内核外,还要确认三件事:其一,MCU 是否具备可用的硬件周期计数器(Cortex-M 的 DWT->CYCCNT 或类似计数器),SystemView 用它生成高精度时间戳;其二,是否有至少一个空闲的定时器或 SysTick 可作为系统节拍源;其三,若使用 RTOS,需确认该 RTOS 已有官方或社区提供的 SystemView 适配层(FreeRTOS、embOS、Zephyr、ThreadX 等均有现成适配)。
二、调试接口要求:SWD 优先,引脚与速率要留余量
J-Link 与目标之间推荐使用 SWD(Serial Wire Debug),仅需 SWCLK、SWDIO、GND 三根线即可工作,比 JTAG 节省引脚,且在 Cortex-M 上带宽足够。若目标板只引出 JTAG,也可使用,但需注意 TDI/TDO/TMS/TCK 全部连接正确。接口确认要点:
- SWDIO 建议加 10 kΩ 上拉至目标 VDD,SWCLK 加 10 kΩ 下拉,避免上电瞬间误触发。
- 调试接口速率(J-Link 的 SWD speed)默认 4000 kHz,长排线或高干扰环境可降到 1000 kHz 甚至 500 kHz 提升稳定性。
- 若目标 MCU 有安全启动或读保护(RDP、Secure Boot),需先解除,否则 J-Link 无法访问 RAM 缓冲区。
- 低功耗场景下,若 MCU 进入深度睡眠会关闭调试时钟,需在 SystemView 配置中启用
SEGGER_SYSVIEW_Start()前后的调试保持,或临时禁用该低功耗模式。
三、RAM 与 ROM 开销:按事件速率估算缓冲区
SystemView 的 RAM 开销主要来自 RTT 上行缓冲区(_SEGGER_RTT.acUp[0])和 SystemView 内部事件队列。默认配置下,RTT 上行缓冲区约 1 KB,SystemView 事件缓冲区约 1 KB,合计约 2 KB。若事件密度高(例如 10 kHz 以上的任务切换 + 中断记录),建议把上行缓冲区扩大到 4~8 KB,避免 J-Link 读取不及时导致丢事件。ROM 开销方面,记录模块本身约 4~8 KB Flash,加上 RTOS 适配层通常不超过 12 KB。对于 Flash 只有 32 KB 的小容量 MCU,需要评估是否值得为性能分析预留这部分空间。
一个实用的估算方法是:先按默认 2 KB 缓冲区跑一次,观察 SystemView 界面是否出现 “Event lost” 提示;若出现,按 2 倍递增扩大缓冲区,直到提示消失。下表给出常见场景的参考值(示例参数,实际以目标工程为准):
| 场景 | 事件速率 | 建议上行缓冲区 | 建议事件缓冲区 |
|---|---|---|---|
| 低速任务切换 | < 1 kHz | 1 KB | 1 KB |
| 中等 RTOS 负载 | 1~5 kHz | 2 KB | 2 KB |
| 高频中断 + 多任务 | > 10 kHz | 4~8 KB | 4 KB |
四、J-Link 型号匹配:不是所有 J-Link 都能跑满速
SystemView 通过 J-Link 的 RTT 通道读取数据,因此 J-Link 型号直接影响最大可持续事件速率。J-Link EDU、J-Link BASE 支持 RTT,但在高事件速率下可能成为瓶颈;J-Link PLUS、J-Link ULTRA+、J-Link PRO 具备更高的 USB 吞吐和更快的 SWD 时钟,适合高频记录。若使用 J-Link OB(板载调试器),需确认其固件版本支持 RTT,且未被厂商裁剪。检查方法:在 J-Link Commander 中执行 ShowEmuList 和 RTT 命令,确认能识别到目标并打开 RTT 控制块。
五、目标板供电与连接检查:最后一步,也是最容易翻车的一步
连接检查按以下顺序进行,可覆盖绝大多数“连不上”问题:
- 确认目标板已上电,且 VDD 在 MCU 允许范围内(例如 3.3 V ± 5%)。
- 用万用表测量 J-Link 的 GND 与目标板 GND 是否导通,避免地电位差。
- 确认 J-Link 的 VTref 引脚接到目标板 VDD,J-Link 靠它判断目标电平。
- 在 J-Link Commander 中执行
connect,选择正确的设备型号和接口(SWD),确认能读到 IDCODE。 - 下载一个最小工程(仅初始化 RTT + SystemView),在 SystemView 中点击 Start Recording,观察是否出现时间线。
下面这张图把上述五类条件串成一条“从目标 MCU 到 SystemView 主机”的检查链,每个节点标注了关键确认项,可作为动手前的对照清单。
把这张检查链走一遍,通常能在几分钟内定位问题。若 J-Link Commander 能连上但 SystemView 无数据,优先检查 RTT 控制块是否被正确链接到 RAM(查看 map 文件中 _SEGGER_RTT 符号地址),以及 SEGGER_SYSVIEW_Conf() 是否在 main() 之前被调用。若时间线出现但频繁断裂,则回到 RAM 缓冲区大小和 SWD 速率两项,按前述方法调整。
完成以上确认后,目标系统就具备了运行 SystemView 的基本条件。接下来可以进入工程集成阶段,把记录模块加入目标代码并开始第一次记录。