调试与仿真
CytStudio 提供三条调试路径:J-Link、DAPLink(CMSIS-DAP) 与内置仿真(Virt-Simulator)。三者共用同一套调试界面——断点、单步、寄存器、内存、变量、调用栈、反汇编、FreeRTOS 仪表盘与波形面板,切换调试方式不需要重新学一套操作。
调试方式总览
| 调试方式 | 需要硬件 | 典型场景 |
|---|---|---|
| J-Link | J-Link 探针 + 目标板 | 真机全功能调试、高速采样、FreeRTOS 感知 |
| DAPLink(CMSIS-DAP) | DAPLink 探针 + 目标板 | 手边只有 DAPLink 时的真机调试与 FLM 烧录 |
| Virt-Simulator(仿真) | 不需要任何硬件 | 无开发板时验证逻辑、算法与中断流程 |
提示:三种方式可以在同一个工程里随时切换——先在仿真里把逻辑跑通,再插上探针到真机上复验,是推荐的开发节奏。
硬件调试:J-Link
前置准备
- 安装 SEGGER J-Link 软件包(见「帮助文档 → 安装调试探针」)
- 连接 J-Link 到目标板,确认目标板已上电
- 确认工程已配置好芯片型号与链接脚本
调试配置步骤
- 打开 工程 → 选项 → 调试配置
- 调试器类型选择 J-Link,接口选择 SWD 或 JTAG,并设置目标速度
- 需要下载后立即进入调试时,勾选 下载并调试;只想附加到正在运行的目标时使用 Attach(不复位)
- 点击 调试 → Debug(或
F5)进入调试会话
支持能力
- 逻辑断点、Flash / FPB 硬件断点、数据观察点,断点状态持久化到
.user文件,重编译后依然保留 - 单步执行:逐行进入、逐行跳过、逐指令
- 寄存器视图:CPU 寄存器(R0–R15、xPSR、MSP/PSP/CONTROL…)+ SVD / DDF 外设寄存器,位字段描述与变更高亮
- 内存视图:十六进制转储、列宽可配置、定期刷新与变更高亮
- 变量与监视窗口:DWARF 树惰性展开、结构体 / 联合体 / 数组 / 指针解析、C 表达式求值
- 调用栈与反汇编:帧精确回溯、源码 / 汇编混合视图、PC 高亮
- FreeRTOS 感知:任务发现、栈使用(高水位)、运行时统计、状态时间线、CPU 负载图
- 高速采样:多通道微秒级采样,实时波形显示
- Flash 操作:芯片 / 扇区擦除、下载、下载并运行;从 ELF 提取镜像(bin / Intel HEX)
硬件调试:DAPLink(CMSIS-DAP)
DAPLink 是 CMSIS-DAP 协议的开源实现,常见于开发板板载调试器与低成本独立探针。CytStudio 原生支持 CMSIS-DAP v1 / v2 传输,保留直连寄存器调试架构,不需要额外的 GDB 前端。
支持的传输方式
| 版本 | 传输 | 说明 |
|---|---|---|
| CMSIS-DAP v1 | USB HID | 早期探针与板载调试器常见 |
| CMSIS-DAP v2 | USB Bulk | 现代探针主流,需 USB Bulk 接口与 512 字节包 |
部分探针的产品名与实际协议版本不一致(例如产品名标注 v1、实际按 v2.1.0 协议走 Bulk)。CytStudio 会按接口特征自动识别,无需手工指定版本。
调试配置步骤
- 把 DAPLink 探针插入 USB,确认系统已识别设备
- 打开 工程 → 选项 → 调试配置,调试器类型选择 DAPLink
- 在 Device 中选中目标芯片——上方 Core 下拉框会自动同步为该芯片对应的内核,RAM 基址 / 容量也会随芯片自动刷新
- 设置 SWD 目标速度,点击 调试 → Debug 进入会话;也可直接用 下载 / 擦除 做单独烧录
烧录:使用内置 FLM
DAPLink 没有 J-Link 那样的内建 Flash 算法,烧录统一走 FLM:
- 调试配置中的 「使用内置 FLM」 勾选项可显式指定使用内置算法,算法选择更可控
- 该选项在 DAPLink 无内置算法时会自动锁定,避免误配
- FLM 引擎解析 Keil 风格
.flm的设备布局(基础地址、大小、扇区 / 页几何),在 RAM 内执行扇区擦除与页编程,支持跨页写入
诊断日志
DAPLink 会话会在调试日志中输出完整的连接过程,便于定位问题:
- 探针枚举与选中的接口 / 端点
- SWJ 时钟设置与端口上电过程
- 目标复位与 IDCODE 校验结果
- 会话头信息:驱动 / 芯片 / 接口 / 速度
内置仿真调试(Virt-Simulator)
不需要开发板、不需要探针,只要工程能编译产出固件,就能立刻进入调试会话。
工作原理
Virt-Simulator 基于 QEMU 做 Cortex-M 指令级仿真,通过内置的 GDB stub 与 QMP 通道接管运行控制与内存访问。仿真目标的烧录、复位、运行状态判定都由仿真器统一管理,因此 F5 之后的体验与真机调试保持一致。
机型自动选型
默认按 内核类型 + 固件链接地址 自动匹配机型,也可以在调试配置里手动指定:
| 覆盖范围 | 机型 |
|---|---|
| 通用内核 | Cortex-M0 / M0+ / M3 / M4 / M7 / M33 / M23 |
| 厂商兼容机型 | STM32F1 / F2 / F4、TI LM3S6965 |
开始仿真调试
- 打开 工程 → 选项 → 调试配置
- 调试器类型选择 Virt-Simulator(仿真)
- 确认机型选择方式(自动匹配 / 手动指定)
- 点击 调试 → Debug(或
F5):固件会被载入仿真的 Flash 区并停在入口,随后即可打断点、单步、看变量
目标 printf 与调试日志
仿真目标的串口输出会以 [目标串口] 前缀实时回灌到调试日志面板,因此 printf / SEGGER_RTT 风格的调试输出无需额外串口工具即可查看:
[目标串口] boot ok, sample=0x03F2
变量与波形
- 运行期读取内存与变量按通道分流:由目标状态与驱动决定走传输层、QMP 还是探针,仿真下读取不会把客户机按停
- 波形采样读取会为界面让路,长时间采样也不会拖卡界面
- 变量表、监视窗口与波形面板的用法与真机调试完全一致
与真机调试的差异
- 仿真覆盖内核指令与通用外设行为,厂商专有外设(如特定 ADC / CAN / 以太网控制器)不会完整还原,涉及外设时序的功能仍建议在真机复验
- 仿真没有真实时钟精度概念,性能相关的测量请以真机结果为准
- 高速采样(HighSpeedSampler)依赖探针与调试架构,仿真会话下按可用性自动启用或跳过
常见问题
Q: DAPLink 能找到设备但连不上目标?
- 确认目标板已上电,SWD 接线(SWCLK / SWDIO / GND,必要时接 nRESET)正常
- 打开调试日志,逐条查看枚举 → SWJ 时钟 → 上电 → 复位 → IDCODE 校验的哪一步失败
- 降低 SWD 目标速度后重试(长排线或干扰环境下尤其有效)
Q: 烧录提示“没有可用的 Flash 算法”?
DAPLink 依赖 FLM 算法:请在 CMSIS-Pack 管理器中安装该器件对应的 Pack,或在调试配置中勾选 「使用内置 FLM」。J-Link 无法识别的芯片也会自动回退到 FLM 烧录路径。
Q: 仿真下断点不生效?
- 确认固件已成功载入(调试日志会显示载入地址与结果)
- 断点地址需落在实际被执行的代码上;被优化掉的函数可能没有稳定的断点位置,可临时降低优化级别(
-O0)验证 - 若刚命中断点后点「继续」,程序应正常恢复运行;若异常,请把调试日志一并反馈
Q: 仿真运行中复位后调试会话退出?
复位流程已改为「先停止、后复位」,复位失败只记录告警,不会拆掉整个调试会话。如仍遇到退出,请附上调试日志反馈。
Q: 怎么在真机与仿真之间快速切换?
两者只是 调试配置 里的一项选择,改动后按 F5 重新进入调试即可,工程本身与其他配置无需调整。
文档持续更新中,如有疑问欢迎通过问题反馈提交!