Ozone是一个跨平台支持的代码调试软件,支持J-link和J-Trace调试器。可以加载SES、Keil、GCC、clang/LLVM等工具链编译生成的Elf/Dwarf可执行文件,进行C/C++源码调试和汇编指令调试。
Ozone新版本中增加了调试快照特性,可以保存整个系统状态,包括RAM、Flash、CPU寄存器、选定的外设、时间轴、代码概要(执行计数器)、数据图、功率图、终端日志、控制台日志等信息。
后续加载快照时,所有调试窗口展示快照创建时所显示的信息,包括调用栈call stack、符号、任务、内存和寄存器窗口。
高级目标系统状态,如时钟、IRQ和外设配置,可以精确地从快照中恢复。这意味着即使是复杂的多任务程序和带有外设IO的程序也可以从快照点恢复。
快照可以在目标离线模式下加载和观察。这意味着加载快照时不需要硬件,甚至不需要J-Link或J-Trace。
保存快照
通过快照对话框用户可以定义将哪些数据保存到快照中。该对话框提供了两个子对话框,允许定义组件的系统状态,即哪些内存区域,CPU,浮点和外设寄存器要保存。可以从Debug菜单或通过执行命令Debug.SaveSnapshot访问该对话框。
寄存器选择对话框的默认配置,以及存储到快照的默认目标寄存器集包含:所有基本的CPU寄存器,及FP寄存器。
内存选择对话框的默认配置,以及存储到快照的默认目标内存区域包括:在J-Link API的MCU数据库中为目标定义的FLASH和RAM区域;设置了可分配标志(A)的ELF程序数据段。
可以通过单击Restore Defaults按钮来恢复这些默认配置。Import按钮导入允许从SEGGER Embedded Studio内存映射文件中添加内存区域。Save to Project按钮将当前配置保存到项目的用户文件(jdebug.user)中。快照使用SEGGER的emCompress软件库进行压缩,磁盘格式是内部文档。
加载快照
可以从Debug菜单或通过执行命令Debug .LoadSnapshot访问加载快照对话框。
在加载快照之前,用户必须确保:
· 选择与快照目标设备匹配的目标设备
· 加载与保存快照时的程序映像相匹配的程序文件。
· 选择与快照跟踪源匹配的跟踪源。
· 图形化表达式列表与拍摄快照时的表达式列表相匹配。
当上述任何条件不适用时,将弹出一个警告对话框:
确保上述前提条件的一种简单方法是在打开用于创建快照的工程文件后加载快照。
系统恢复顺序
加载快照时,将按照它们在快照中出现的顺序恢复寄存器和内存区域。这个顺序与内存和寄存器选择对话框显示的顺序相同。当以目标在线模式加载快照时,非基本CPU寄存器不会立即写入目标。用户必须对系统、外设和内存映射寄存器应用于目标的具体方式进行编程。
快照编程
为了从快照中恢复高级系统状态,例如(时钟)外设,用户通常需要对恢复操作的精确顺序进行编程。为了支持这一点,Ozone提供了脚本函数OnSnapshotSave和OnSnapshotLoad和一个命令组Snapshot定制快照文件的读取和写入。
/*********************************************************************
* SNAPSHOT_Restore_System_Generic
* Function description
* Loads and applies generic system state from a snapshot
* Return Value
* 0: OK
* -1: error
* Notes
* (1) User function
***********************************************************************/
void OnSnapshotSave (void) {
Util.Log("OnSnapshotSave: saving system state...");
//
// Save Cortex-M specific system state
//
Snapshot.SaveReg("CPU.Peripherals.SCB.VTOR"); // Vector table offset register
Snapshot.SaveReg("CPU.Peripherals.DWT.DWT_CTRL"); // DWT unit status & control register (SYSTEMVIEW)
Snapshot.SaveReg("CPU.Peripherals.SYSTICK"); // System timer configuration (SYSTICK)
Snapshot.SaveReg("CPU.Peripherals.SCB.SHPR3"); // Cortex-M IRQ priorties 12-15 (SYSTICK)
Snapshot.SaveReg("CPU.Peripherals.SCB.CPACR"); // FPU and coprocessor control register
//
// Save system clock configuration
//
Snapshot.SaveReg("Peripherals.RCC.CR");
Snapshot.SaveReg("Peripherals.RCC.CFGR");
Snapshot.SaveReg("Peripherals.RCC.PLLCFGR");
//
// Save FLASH configuration
//
Snapshot.SaveReg("Peripherals.FLASH.ACR");
//
// Save LED configuration
//
Snapshot.SaveReg("Peripherals.RCC.AHB1RSTR"); // LED port reset register
Snapshot.SaveReg("Peripherals.RCC.AHB1ENR"); // LED port clock enable register
Snapshot.SaveReg("Peripherals.GPIO.GPIOA.MODER"); // LED port mode register
Snapshot.SaveReg("Peripherals.GPIO.GPIOA.ODR"); // LED port output data register
//
// Power configuration
//
Snapshot.SaveReg("Peripherals.PWR.CR");
//
// APB1 clock
//
Snapshot.SaveReg("Peripherals.RCC.APB1ENR");
Util.Log("OnSnapshotSave: system state saved.");
}
/*********************************************************************
* OnSnapshotLoad
* Function description
* Optional event handler, called upon loading a snapshot.
* Additional information
* This function is used to restore the target state in cases
* where values cannot simply be written to the target.
* Typical use: GPIO clock needs to be enabled, before
* GPIO is configured.
***********************************************************************/
void OnSnapshotLoad (void) {
Util.Log("OnSnapshotLoad: restoring system state...");
if (SNAPSHOT_Restore_System_Generic() != 0) {
Util.Log("OnSnapshotLoad : failed to restore generic system state");
return 0;
}
if (SNAPSHOT_Restore_SysClock() != 0) {
Util.Log("OnSnapshotLoad : failed to resore clock-specific system state");
return 0;
}
if (SNAPSHOT_Restore_OS() != 0) {
Util.Log("OnSnapshotLoad : failed to restore OS-specific system state");
return 0;
}
if (SNAPSHOT_Restore_Board() != 0) {
Util.Log("OnSnapshotLoad : failed to restore board-specific system state");
return 0;
}
Util.Log("OnSnapshotLoad: system state restored.");
}
快照脚本功能目前仅针对系统寄存器状态。当快照以在线模式加载时,CPU寄存器和内存数据自动写入目标,不依赖于脚本函数OnSnapshotLoad。更多可以在脚本函数OnSnapshotLoad和OnSnapshotSave中使用调试命令,可以参考Ozone用户手册。
快照存储不能以用户可读的格式轻松有效地存储的二进制调试会话数据。快照的典型应用场景如下:
· 快照允许客户脱离调试会话,并能够在稍后的时间点恢复会话。
· 快照允许更容易地重现和分析错误,可以由不同主机上的多方进行。
· 快照提高Ozone的教学和演示能力,用于培训课程和会议。
· 快照作为存档。
快照功能目前仅支持Cortex-M架构处理器。