Ozone是一個(gè)跨平臺(tái)支持的代碼調(diào)試軟件,支持J-link和J-Trace調(diào)試器。可以加載SES、Keil、GCC、clang/LLVM等工具鏈編譯生成的Elf/Dwarf可執(zhí)行文件,進(jìn)行C/C++源碼調(diào)試和匯編指令調(diào)試。
Ozone新版本中增加了調(diào)試快照特性,可以保存整個(gè)系統(tǒng)狀態(tài),包括RAM、Flash、CPU寄存器、選定的外設(shè)、時(shí)間軸、代碼概要(執(zhí)行計(jì)數(shù)器)、數(shù)據(jù)圖、功率圖、終端日志、控制臺(tái)日志等信息。
后續(xù)加載快照時(shí),所有調(diào)試窗口展示快照創(chuàng)建時(shí)所顯示的信息,包括調(diào)用棧call stack、符號(hào)、任務(wù)、內(nèi)存和寄存器窗口。
高級(jí)目標(biāo)系統(tǒng)狀態(tài),如時(shí)鐘、IRQ和外設(shè)配置,可以精確地從快照中恢復(fù)。這意味著即使是復(fù)雜的多任務(wù)程序和帶有外設(shè)IO的程序也可以從快照點(diǎn)恢復(fù)。
快照可以在目標(biāo)離線模式下加載和觀察。這意味著加載快照時(shí)不需要硬件,甚至不需要J-Link或J-Trace。
保存快照
通過(guò)快照對(duì)話框用戶可以定義將哪些數(shù)據(jù)保存到快照中。該對(duì)話框提供了兩個(gè)子對(duì)話框,允許定義組件的系統(tǒng)狀態(tài),即哪些內(nèi)存區(qū)域,CPU,浮點(diǎn)和外設(shè)寄存器要保存??梢詮腄ebug菜單或通過(guò)執(zhí)行命令Debug.SaveSnapshot訪問(wèn)該對(duì)話框。
寄存器選擇對(duì)話框的默認(rèn)配置,以及存儲(chǔ)到快照的默認(rèn)目標(biāo)寄存器集包含:所有基本的CPU寄存器,及FP寄存器。
內(nèi)存選擇對(duì)話框的默認(rèn)配置,以及存儲(chǔ)到快照的默認(rèn)目標(biāo)內(nèi)存區(qū)域包括:在J-Link API的MCU數(shù)據(jù)庫(kù)中為目標(biāo)定義的FLASH和RAM區(qū)域;設(shè)置了可分配標(biāo)志(A)的ELF程序數(shù)據(jù)段。
可以通過(guò)單擊Restore Defaults按鈕來(lái)恢復(fù)這些默認(rèn)配置。Import按鈕導(dǎo)入允許從SEGGER Embedded Studio內(nèi)存映射文件中添加內(nèi)存區(qū)域。Save to Project按鈕將當(dāng)前配置保存到項(xiàng)目的用戶文件(jdebug.user)中。快照使用SEGGER的emCompress軟件庫(kù)進(jìn)行壓縮,磁盤格式是內(nèi)部文檔。
加載快照
可以從Debug菜單或通過(guò)執(zhí)行命令Debug .LoadSnapshot訪問(wèn)加載快照對(duì)話框。
在加載快照之前,用戶必須確保:
選擇與快照目標(biāo)設(shè)備匹配的目標(biāo)設(shè)備
加載與保存快照時(shí)的程序映像相匹配的程序文件。
選擇與快照跟蹤源匹配的跟蹤源。
圖形化表達(dá)式列表與拍攝快照時(shí)的表達(dá)式列表相匹配。
當(dāng)上述任何條件不適用時(shí),將彈出一個(gè)警告對(duì)話框:
確保上述前提條件的一種簡(jiǎn)單方法是在打開用于創(chuàng)建快照的工程文件后加載快照。
系統(tǒng)恢復(fù)順序
加載快照時(shí),將按照它們?cè)诳煺罩谐霈F(xiàn)的順序恢復(fù)寄存器和內(nèi)存區(qū)域。這個(gè)順序與內(nèi)存和寄存器選擇對(duì)話框顯示的順序相同。當(dāng)以目標(biāo)在線模式加載快照時(shí),非基本CPU寄存器不會(huì)立即寫入目標(biāo)。用戶必須對(duì)系統(tǒng)、外設(shè)和內(nèi)存映射寄存器應(yīng)用于目標(biāo)的具體方式進(jìn)行編程。
快照編程
為了從快照中恢復(fù)高級(jí)系統(tǒng)狀態(tài),例如(時(shí)鐘)外設(shè),用戶通常需要對(duì)恢復(fù)操作的精確順序進(jìn)行編程。為了支持這一點(diǎn),Ozone提供了腳本函數(shù)OnSnapshotSave和OnSnapshotLoad和一個(gè)命令組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."); }
快照腳本功能目前僅針對(duì)系統(tǒng)寄存器狀態(tài)。當(dāng)快照以在線模式加載時(shí),CPU寄存器和內(nèi)存數(shù)據(jù)自動(dòng)寫入目標(biāo),不依賴于腳本函數(shù)OnSnapshotLoad。更多可以在腳本函數(shù)OnSnapshotLoad和OnSnapshotSave中使用調(diào)試命令,可以參考Ozone用戶手冊(cè)。
快照存儲(chǔ)不能以用戶可讀的格式輕松有效地存儲(chǔ)的二進(jìn)制調(diào)試會(huì)話數(shù)據(jù)。快照的典型應(yīng)用場(chǎng)景如下:
快照允許客戶脫離調(diào)試會(huì)話,并能夠在稍后的時(shí)間點(diǎn)恢復(fù)會(huì)話。
快照允許更容易地重現(xiàn)和分析錯(cuò)誤,可以由不同主機(jī)上的多方進(jìn)行。
快照提高Ozone的教學(xué)和演示能力,用于培訓(xùn)課程和會(huì)議。
快照作為存檔。
快照功能目前僅支持Cortex-M架構(gòu)處理器。
-
寄存器
+關(guān)注
關(guān)注
31文章
5286瀏覽量
119780 -
軟件
+關(guān)注
關(guān)注
69文章
4684瀏覽量
87067 -
C++
+關(guān)注
關(guān)注
21文章
2096瀏覽量
73447 -
調(diào)試器
+關(guān)注
關(guān)注
1文章
299瀏覽量
23663
原文標(biāo)題:如何使用Ozone的快照功能
文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論