2. Ozone工程创建与目标连接

Ozone 的调试能力建立在“工程配置 + 目标连接”这两个基础之上。工程文件(.jdebug)保存了设备型号、调试探针、ELF 文件路径、调试信息加载方式以及目标接口参数;只有这些信息与目标板实际情况一致,Ozone 才能正确复位、下载、设置断点并读取变量。本节围绕新建工程、选择设备与调试探针、加载 ELF/调试信息、连接目标板并验证基本调试会话这条主线展开,重点说明每一步实际发生了什么、关键参数如何填写,以及如何判断会话是否真正建立成功。

一、新建工程与 .jdebug 文件

启动 Ozone 后选择 Create New Project,向导会依次询问设备、调试探针、目标接口和程序文件。完成后 Ozone 生成一个 .jdebug 工程文件,它本质上是一份调试会话的配置脚本,记录了后续每次连接所需的全部信息。工程文件可以随项目一起纳入版本管理,团队成员打开同一份 .jdebug 即可复现相同的调试环境,这也是 Ozone 相比手工命令行调试的优势之一。

新建时建议把工程文件放在与 ELF 输出目录相对固定的位置,例如工程根目录下的 debug/ 子目录,避免因绝对路径变化导致 ELF 找不到。若使用 CMake 或 Makefile 构建,可在构建后自动调用 Ozone 命令行加载工程,减少手工操作。

二、选择设备与调试探针

设备选择决定了 Ozone 使用哪一套目标描述:包括内核类型(Cortex-M0/M3/M4/M7/M33 等)、内存映射、外设寄存器定义以及复位行为。以常见的 STM32F407(Cortex-M4F)为例,在 Device 下拉框中选择 STM32F407VG,Ozone 会自动加载对应的寄存器描述文件,之后在寄存器窗口就能看到 RCC、GPIO、USART 等外设的具名位域,而不是一串裸地址。

调试探针选择要与实际硬件一致。SEGGER 生态中常见的是 J-Link 系列(J-Link BASE/PLUS/ULTRA+、J-Link EDU、板载 J-Link OB),此外 Ozone 也支持通过 J-Link 兼容层连接 CMSIS-DAP 等探针。选择探针后需要确认接口类型与速率:SWD 只需 SWCLK、SWDIO 两根信号线,占用引脚少,是 Cortex-M 的首选;JTAG 需要 TDI、TDO、TMS、TCK 及可选的 TRST,引脚多但兼容性更广。速率方面,STM32F407 在 4 MHz SWD 下通常稳定,长排线或高速板可先降到 1 MHz 建立连接,再逐步提高。

若目标板由探针供电,需在 Target Interface 中确认供电电压(通常 3.3 V)与目标一致;若目标板独立供电,则不要让探针同时供电,以免电源冲突。

三、加载 ELF 与调试信息

Ozone 本身不编译代码,它依赖外部工具链生成的 ELF 文件。ELF 中除了机器码,还包含 DWARF 调试信息:变量名与地址的映射、函数入口与行号、结构体布局、内联展开关系等。没有调试信息,Ozone 只能做汇编级单步,无法按源码行断点、无法查看具名变量。

在向导的 Program File 处选择 ELF,例如 build/Debug/firmware.elf。需要注意两点:一是 ELF 必须与目标板上实际烧录的镜像来自同一次构建,否则断点地址与源码行会错位;二是编译时需带 -g(GCC/Clang)或 /Zi(IAR),优化等级建议调试阶段用 -O0 或 -Og,避免变量被优化掉或语句被重排导致单步跳转异常。

# GCC 调试构建示例
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -g3 -O0 \
  -ffunction-sections -fdata-sections \
  -c main.c -o main.o
arm-none-eabi-gcc -T stm32f407.ld -Wl,--gc-sections \
  main.o -o firmware.elf

加载后可在 Ozone 的 Source 视图确认是否能看到源码与行号;若只显示反汇编,说明调试信息未正确加载或 ELF 路径错误。

四、连接目标板并验证调试会话

点击 Connect 后,Ozone 依次执行:复位目标、识别内核 ID、下载程序(若勾选 Download)、设置初始断点(通常是 main 或 Reset_Handler)。连接成功的标志包括:状态栏显示 Connected、Target 信息中内核型号正确、PC 停在预期入口、寄存器窗口可读、Memory 窗口能读取 Flash 与 RAM 内容。

若连接失败,常见原因与排查方向如下:探针未被识别(检查 USB 与驱动)、目标无供电(测量 VDD)、SWD 引脚被复用为 GPIO(检查启动配置或复位时序)、复位方式不匹配(Reset 类型可选 Normal、Core、Connect under reset)。对于引脚复用导致无法连接的情况,Connect under reset 往往能在内核执行用户代码前抢占总线,是常用的救砖手段。

Ozone 工程创建与目标连接关系图 主机侧(PC) Ozone IDE .jdebug 工程文件 ELF + DWARF 符号 / 行号 / 变量 firmware.elf 设备描述 STM32F407VG Cortex-M4F 寄存器 J-Link 驱动 USB 通信 SWD 4 MHz 调试探针 J-Link / J-Link OB SWCLK / SWDIO GND / VTref nRESET(可选) 接口:SWD / JTAG 目标板 MCU 内核 Cortex-M4F Debug Port (DAP) Flash / RAM 0x0800_0000 0x2000_0000 外设寄存器 RCC / GPIO / USART 具名位域可读 复位与启动 Reset_Handler → main USB SWD 连接成功判据:Connected 状态 · 内核识别正确 · PC 停在入口 · 寄存器/内存可读

五、验证基本调试会话的检查清单

连接建立后,建议按以下顺序做一次最小验证,确认调试链路完整可用。这份清单可直接作为每次换板或换工程后的自检项。

检查项操作预期结果
探针识别查看 Ozone 状态栏探针型号与序列号显示实际 J-Link 型号,无红色告警
内核识别打开 Target 信息面板显示 Cortex-M4,CPUID 与手册一致
程序下载勾选 Download 后 Connect进度完成,无校验错误
入口断点观察 PC 与调用栈停在 main 或 Reset_Handler
源码映射在 Source 视图查看行号显示 C 源码与行号,非纯反汇编
变量读取在 Watch 添加一个全局变量显示类型与当前值,非 <optimized out>
内存访问Memory 窗口读 0x08000000显示 Flash 首字节,与镜像一致
单步执行Step Over 一行源码PC 前进一行,行为符合预期

如果“变量读取”显示 <optimized out>,说明该变量被编译器优化,需降低优化等级或将其声明为 volatile;如果“源码映射”只显示反汇编,检查 ELF 是否带 -g 且路径与工程中一致。完成以上验证后,Ozone 与目标板之间的调试会话即视为可用,后续的断点、回溯、变量观察都建立在这一基础之上。

每次修改 ELF 后应重新加载并重新连接,避免 Ozone 仍使用旧符号表;若目标板已烧录新镜像而 Ozone 仍指向旧 ELF,断点位置会与实际代码错位,表现为“断点命中但源码行不对”。