再上一篇:15.4 调试事件
上一篇:15.5 Cortex-M3 中的断点
主页
下一篇:15.7 内核的其它调试特性
再下一篇:第16章
文章列表

15.6 调试时访问寄存器

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

在NVIC中,还有两个寄存器与与调试功能有关。它们分别是:调试内核寄存器选择者寄存器
(DCRSR),以及调试内核寄存器数据寄存器(DCRDR),如表15.3和表15.4所示。调试器需要通过 这两个寄存器来访问处理器的寄存器,并且只有在处理器停机时,才能使用这里的寄存器传送功能。
表 15.3 调试内核寄存器选择者寄存器DCRSR(地址:0xE000_EDF4)

位段

名称

类型

复位值

描述

16

REGWnR

W

-

1=写寄存器

0=读寄存器

15:5

保留

-

-

-

4:0

REGSEL

W

-

00000= R0

00001=R1

01111=R15

10000=xPSR

10001=MSP

10010=PSP

10100=特殊功能寄存器组

[31:24]: CONTROL [23:16]: FAULTMASK [15:8]:BASEPRI [7:0]: PRIMASK

表 15.4 调试内核寄存器数据寄存器DCRDR(地址:0xE000_EDF8)

位段

名称

类型

复位值

描述

31:0

DATA

R/W

-

读回来的寄存器的值,或欲写入寄存器的值,寄


存器由 DCRSR选择 欲使用这两个寄存器来读取内核的寄存器的内容,则必须按如下的顺序做:

1. 确定处理器已停机

2. 往DCRSR写数据,其中位16要为0,表示这是要读数据

3. 查询,直到DHCSR.S_REGRDY=1

4. 读取DCRDR以获取寄存器的内容 寄存器写操作的顺序与上面的类似:

1. 确定处理器已停机

2. 往DCRDR中写数据

3. 往DCRSR写数据,其中位16要为1,表示这是要写数据

4. 查询,直到DHCSR.S_REGRDY=1 使用DCRSR和DCRDR来访问寄存器,只适用于停机模式。如果选择了调试监视器模式,则对于自动 入栈的寄存器,可以从堆栈中读写它们;对于其它寄存器,就可以直接在服务例程中访问。

如果有合适的函数库和调试器的支持,还可以使用DCRDR来做半主机(semihosting)。比如说, 当应用程序执行了printf语句时,文字的输出可以通过一系列的putc()调用来完成。在实现putc() 时,可以让它把输出的字符和状态写到DCRDR中,然后触发调试模式。接下来,调试器可以检测到 内核停机状态,并且读取被输出的字符。然而,这种形式的半主机需要喊停内核。更正点的半主机 是使用ITM,它则没有此限制。