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无法捕获调试中断。
联系我们
CONTACT INFORMATION
Windway Technology Hong Kong Limited
Phone: +852 695 952 92
Email: kuang@windway.cn
Add:ROOM 06 BLK A 23/F HOVER IND BLDG ,26-38 KWAI CHEONG RD KWAI CHUNG N.T
广州市风标电子技术有限公司
咨询热线:020 - 8600 3016 | 技术支持:15817074644
销售热线:18928802261 | 19868005704
公司邮箱:sales@windway.cn公司地址:广东省广州市黄埔区科珠路203号广东软件园F座401