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架構處理器。
-
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
軟件
+關注
關注
69文章
4921瀏覽量
87396 -
C++
+關注
關注
22文章
2108瀏覽量
73618 -
調試器
+關注
關注
1文章
303瀏覽量
23716
原文標題:如何使用Ozone的快照功能
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論