J-Link调试的监视模式
来源: | 作者:风标电子工程师 | 发布时间: 2024-05-30 | 3 次浏览 | 🔊 点击朗读正文 ❚❚ | 分享到:

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-M3Cortex-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无法捕获调试中断。