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 kHz1 KB1 KB
中等 RTOS 负载1~5 kHz2 KB2 KB
高频中断 + 多任务> 10 kHz4~8 KB4 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 控制块。

若手头只有 J-Link EDU 或 BASE,仍可正常使用 SystemView,但建议把 SWD 速率降到 1000~2000 kHz,并适当扩大 RTT 缓冲区,以换取稳定性。

五、目标板供电与连接检查:最后一步,也是最容易翻车的一步

连接检查按以下顺序进行,可覆盖绝大多数“连不上”问题:

  1. 确认目标板已上电,且 VDD 在 MCU 允许范围内(例如 3.3 V ± 5%)。
  2. 用万用表测量 J-Link 的 GND 与目标板 GND 是否导通,避免地电位差。
  3. 确认 J-Link 的 VTref 引脚接到目标板 VDD,J-Link 靠它判断目标电平。
  4. 在 J-Link Commander 中执行 connect,选择正确的设备型号和接口(SWD),确认能读到 IDCODE。
  5. 下载一个最小工程(仅初始化 RTT + SystemView),在 SystemView 中点击 Start Recording,观察是否出现时间线。

下面这张图把上述五类条件串成一条“从目标 MCU 到 SystemView 主机”的检查链,每个节点标注了关键确认项,可作为动手前的对照清单。

SystemView 目标系统准备检查链 从 MCU 内核到主机记录,逐级确认,缺一不可 ① MCU 支持条件 Cortex-M / RISC-V 等 DWT->CYCCNT 可用 RTOS 适配层存在 ② 调试接口 SWD:SWCLK/SWDIO/GND 上拉/下拉电阻 解除读保护 ③ RAM / ROM 开销 RTT 上行缓冲区 ≥ 1 KB 事件缓冲区 ≥ 1 KB Flash 约 4~12 KB ④ J-Link 型号 EDU/BASE/PLUS/ULTRA+ 固件支持 RTT SWD 速率匹配 ⑤ 目标板供电与连接检查 VDD 正常 · GND 共地 · VTref 接目标 VDD · J-Link Commander connect 成功 下载最小 RTT 工程 → SystemView Start Recording → 出现时间线 ✓ 条件满足:可开始记录 时间线连续 · 无 Event lost · 程序正常运行 常见失败点 未共地 · VTref 悬空 · 读保护未解除

把这张检查链走一遍,通常能在几分钟内定位问题。若 J-Link Commander 能连上但 SystemView 无数据,优先检查 RTT 控制块是否被正确链接到 RAM(查看 map 文件中 _SEGGER_RTT 符号地址),以及 SEGGER_SYSVIEW_Conf() 是否在 main() 之前被调用。若时间线出现但频繁断裂,则回到 RAM 缓冲区大小和 SWD 速率两项,按前述方法调整。

不要跳过供电与共地检查。很多“J-Link 连不上”的案例最终原因是目标板与调试器未共地,或 VTref 未接,导致 J-Link 无法识别目标电平。先量电压,再谈配置。

完成以上确认后,目标系统就具备了运行 SystemView 的基本条件。接下来可以进入工程集成阶段,把记录模块加入目标代码并开始第一次记录。