CPU主要有兩種標準的調試模式:Halt模式和監視模式。本文將重點介紹監視模式調試,幫助大家更好地理解和應用這一技術。
一、Halt模式與監視模式的區別
Halt模式是J-Link默認使用的調試模式。在Halt模式下,當遇到斷點或調試器發出停止請求時,CPU會停止并中斷程序執行。這種模式在調試過程中會導致一些問題,例如
1. 應用程序的部分需要保持運行,以確保與外部組件的通信不會中斷。
2. 例如,在藍牙應用程序中,需要在CPU處于調試模式時保持藍牙鏈路,否則通信將失敗,用戶應用程序的恢復或單步執行將不可能。
3. 當CPU進入調試模式時,某些外設也會停止。例如,用于電機控制應用程序的脈沖寬度調制(PWM)單元可能在未定義的/甚至危險的狀態下停止,導致連接到這些單元的外部硬件產生不希望的副作用。
而監視模式調試則可以有效解決這些問題。在監視模式下,CPU不會停止,而是捕獲一個特定的調試異常,并跳轉到定義的異常處理程序中。主要效果與Halt模式相同:用戶應用程序在特定點被中斷,但與停Halt模式不同的是,由于CPU執行了處理程序,它還可以在調試進入/退出時甚至幾乎無延遲地在調試模式下周期性地執行一些特定操作。這使得可以處理上述解釋的復雜調試情況。
二、啟用監視模式調試
要啟用監視模式調試,需要明確告訴J-Link軟件使用監視模式。具體操作取決于使用的IDE。以下為簡要步驟:
1. 修改IDE設置,啟用監視模式調試。
2. 確保J-Link能夠定位到有效的監視器,否則將默認回退到Halt模式調試。
可以使用以下 J-Link Script file啟用監控模式:
/********************************************************************** (c) SEGGER Microcontroller GmbH & Co. KG ** The Embedded Experts ** www.segger.com ***********************************************************************-------------------------- END-OF-HEADER -----------------------------File : EnableMonitorModeDebugging.JLinkScriptPurpose : Enable Monitor Mode DebuggingLiterature: [1] J-Link User Guide (UM08001_JLink.pdf), chapter "Monitor Mode Debugging"*//*********************************************************************** Constants (similar to defines)************************************************************************//*********************************************************************** Global functions************************************************************************//*********************************************************************** ConfigTargetSettings()** Function description* Called before InitTarget(). Mainly used to set some global DLL variables to customize the* normal connect procedure. For ARM CoreSight devices this may be specifying the base* address of some CoreSight components (ETM, …) that cannot be auto-detected by J-Link* due to erroneous ROM tables etc. May also be used to specify the device name in case* debugger does not pass it to the DLL.** Return value* >= 0: O.K.* < 0: Error** Notes* (1) May not, under absolutely NO circumstances, call any API functions that perform target* (2) Should only set some global DLL variables*/int ConfigTargetSettings(void) { JLINK_SYS_Report("ConfigTargetSettings(): Enable Monitor Mode Debugging"); JLINK_ExecCommand("SetMonModeDebug = 1");// JLINK_ExecCommand("SetMonModeVTableAddr = <Addr>"); // Needed in case of the monitor mode interrupts needs to be forwarded, see section "Forwarding of Monitor Interrupts" in the J-Link User Guide (UM08001) return 0;}/*************************** end of file ****************************/
三、監視模式的可用性與限制
并非所有CPU核心都支持監視模式調試。以下是一些支持監視模式的CPU核心及其限制:
1. Cortex-M3和Cortex-M4:支持監視模式調試,SEGGER提供的監視代碼可以輕松地鏈接到用戶應用程序中。
但有以下限制:
- 用戶特定的監視函數不得阻塞通用監視器超過100毫秒。
- 無法從IDE中操作堆棧指針寄存器(SP)。
- 在監視模式下,不能使用無限數量的閃存斷點功能。
- 無法調試監視器本身。
四、監視代碼簡介
執行J-Link的監視模式調試需要一個特定于CPU核心的監視代碼。此監視代碼在CPU處于調試模式時(即處于監視異常中)與J-Link進行通信。監視代碼需要像應用程序的正常部分一樣被編譯和鏈接。
不同核心的監視代碼可以通過SEGGER的下載頁面請求獲得。
以下為監視代碼的組成部分:
1. JLINK_MONITOR.c:包含在調試模式進入、退出和CPU處于調試模式時周期性調用的用戶特定函數。函數可以填充用戶特定代碼。所有函數不得阻塞通用監視器超過100毫秒。
2. JLINK_MONITOR.h:頭文件,用于填充JLINK_MONITOR_函數。
3. JLINK_MONITOR_ISR.s:通用監視器匯編文件,用戶無需修改。
五、調試中斷注意事項
在監視模式下調試中斷時,需要注意以下幾點:
1. 只有優先級低于調試/監視中斷的中斷可以被調試/單步執行。
2. 在優先級高于調試/監視中斷的中斷服務例程(ISRs)中設置斷點可能導致故障,因為當遇到斷點時,CPU無法捕獲調試中斷。