再上一篇:第15章
上一篇:15.2 CoreSight 技术概览
主页
下一篇:15.4 调试事件
再下一篇:15.5 Cortex-M3 中的断点
文章列表

15.3 调试模式

《Cortex-M3 权威指南》,嵌入式处理器开发教程。

在 CM3中的调试操作模式分为两种。第一种称为“halt”(停机模式),在进入此模式时,处理 器完全停止程序的执行。第二种则称为“debug monitor exception”(调试监视器模式),此时 处理器执行相应的调试监视器异常服务例程,由它来执行调试任务,并且依然允许更高优先级的异 常抢占它。调试监视器的异常号为 12,优先级可编程。除了调试事件可以触发异常外,手工设置其 悬起位也可以触发本异常。

1. 停机模式

 指令执行被停止
 SysTick定时器停止
 支持单步操作
 中断可以在这期间悬起,并且可以在单步执行时响应。也可以掩蔽它们,使得单步时不受 干扰

2. 调试监视器模式

 处理器执行调试监视器异常的服务例程(异常号:12)
 SysTick定时器继续运行
 新来的中断按普通执行时的原则来抢占
 执行单步操作
 存储器的内容(如堆栈内存)会在调试监视器的响应始末得到更新,因为有自动入栈和出 栈的动作
之所以加入调试监视器模式,是考虑到了在某些电子系统运行的过程中,是不可以停机的。例 如,对于汽车引擎控制器以及电机控制器,就必须在处理调试动作的同时让处理器继续运行下去, 这样才能保证被测试的设备不会意外损坏(例如,不需要在调试过程中让电机停转——译者注)。 有了调试监视器,就可以停止并调试线程级的应用程序,也可以调试低优先级的中断服务例程。在 这同时,高优先级的中断和异常能够响应。
如果要进入停机模式,需要把 NVIC调试停机控制及状态寄存器(DHCSR)的 C_DEBUGEN位置 位。这个位只能由调试器来设置,没有调试器是不能把 CM3 停机的。在 C_DEBUGEN 置位后,就可 以设置 DHCSR.C_HALT位来喊停处理器。此 C_HALT位可以由软件置位。

DHCSR的位段定义比较特殊:读时是一种定义,写时又是另外一种定义。对于写操作,必须先 往[31:16]中写入一个“访问钥匙”值。而对于读操作,则无此钥匙,并且读回来的高半字包含了 状态位,如表 15.1所示。

表15.1 调试停机控制及状态寄存器DHCSR (地址:0xE000_EDF0)


位段 名称 类型 复位值 描述

31:15

KEY

W

-

调试钥匙。必须在任何写操作中把该位段写入

A05F,否则忽略写操作

25

S_RESET_ST

R

-

内核已经或即将复位,读后清零

24

S_RETIRE_ST

R

-

在上次读取以后指令已执行完成,读后清零

19

S_LOCKUP

R

-

1=内核进入了锁定状态

18

S_SLEEP

R

-

1=内核睡眠中

17

S_HALT

R

-

1=内核已停机

16

S_REGRDY

R

-

1=寄存器的访问已经完成

15:6

保留

-

-

5

C_SNAPSTALL

RW

0*

打断一个 stalled存储器访问

4

保留

-

-

3

C_MASKINTS

RW

0*

调试期间关中断,只有在停机后方可设置

2

C_STEP

RW

0*

让处理器单步执行,在 C_DEBUGEN=1时有效

1

C_HALT

RW

0*

喊停处理器,在 C_DEBUGEN=1时有效

0

C_DEBUGEN

RW

0*

使能停机模式的调试

*:DHCSR中的控制位是在上电复位时得到复位的。系统复位(例如,往NVIC应用程序中断及复位寄存器中写命令)

不会影响到它们

在正常情况下,只有调试器会操作 DHCSR,应用程序不要乱动它,以免使调试工具出现问题。 当使用调试监视器模式时,由另一个 NVIC中的寄存器来负责控制调试活动,它是 NVIC调试异
常及监视器控制寄存器(DEMCR),其定义如表 15.2所示。
表 15.2 调试及监视器控制寄存器DEMCR (地址:0xE000_EDFC)

位段

名称

类型

复位值

描述

24

TRCENA

RW

0*

跟踪系统使能位。在使用DWT,ETM,ITM和TPIU

前,必须先设置此位

23:20

保留

19

MON_REQ

RW

0

1=调试监视器异常不是由硬件调试事件触发,

而是由软件手工悬起的

18

MON_STEP

RW

0

让处理器单步执行,在 MON_EN=1时有效

17

MON_PEND

RW

0

悬起监视器异常请求,内核将在优先级允许时响应

16

MON_EN

RW

0

使能调试监视器异常

15:11

保留

10

VC_HARDERR

RW

0*

发生硬 fault时停机调试

9

VC_INTERR

RW

0*

指令/异常服务错误时停机调试

8

VC_BUSERR

RW

0*

发生总线 fault时停机调试

7

VC_STATERR

RW

0*

发生用法 fault时停机调试

6

VC_CHKERR

RW

0*

发生用法 fault 使能的检查错误时停机调试

(如未对齐,除数为零)

5

VC_NOCPERR

RW

0*

发生用法 fault之无处理器错误时停机调试

4

VC_MMERR

RW

0*

发生存储器管理 fault时停机调试

3:1

保留

0 VC_CORERESET RW 0* 发生内核复位时停机调试

*:DEMCR中的控制位是在上电复位时得到复位的。系统复位(例如,往NVIC应用程序中断及复位寄存器中写命令) 不会影响到它们

该寄存器不仅包含了调试监视器的控制位,还包含了跟踪系统的使能位(TRCENA)以及若干向 量抓捕(Vector Catch, VC)控制位。VC功能只有在停机模式下才能使用。如果某个异常(或者 内核复位)发生了,并且对应的 VC 位置位,则将自行产生一个停机请求,并且在执行完当前指令 后立即把处理器喊停。
虽然 TRCENA和 VC控制相关的位只有上电时才复位,但是其它用于控制监视器模式的位,则也 会因系统复位而复位。