新闻  |   论坛  |   博客  |   在线研讨会
ARM Cortex-M3调试框架
0750long | 2009-05-19 17:21:33    阅读:14100   发布文章

ARM Cortex-M3调试框架

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} st1\:*{behavior:url(#ieooui) }


CM3丰满的调试功能分为两类,每类中都有更具体的调试项目,如下所列:

1. 侵入式调试(这也是基本的调试机能)

a) 停机以及单步执行程序

b) 硬件断点

c) 断点指令(BKPT)

d) 数据观察点,作用于单一地址、一个范围的地址,以及数据的值。

e) 访问寄存器的值(既包括读,也包括写)

f) 调试监视器异常

g) 基于ROM 的调试(闪存地址重载(flash patching) )

2. 非侵入式调试(大多数人更少接触到的,高级的调试机能)

a) 在内核运行的时候访问存储器

b) 指令跟踪,需要通过可选的嵌入式跟踪宏单元(ETM)

c) 数据跟踪

d) 软件跟踪(通过ITM(指令跟踪单元))

e) 性能速写(profiling)(通过数据观察点以及跟踪模块)

可见,我们以前最常用的调试都属于侵入式调试。所谓“侵入式”,主要是强调这种调

试会打破程序的全速运行。非侵入式调试则是锦上添花的一类,它对于调试大型和多任务环

境下的软件系统尤其有力。

在CM3 处理器的内部,包含了一系列的调试组件。CM3 的调试系统基于ARM 亲手打造

且吐血推荐的“CoreSight(内核景象)”调试架构。该架构是一个专业设计的体系,它允许使用标准的方案来访问调试组件,收集跟踪信息,以及检测调试系统的配置。

 

 

从外部调试器到CM3 调试接口的连接,需要多级互联才能完成,如图下所示。

第一步,是通过DP 接口模块(通常是SWJ‐DP 或SW‐DP),先把外部信号转换成一个通用的32 位调试总线信号(图表中的DAP 总线)。SWJ‐DP 支持SW 与JTAG 两种协议,而SW‐DP则只支持SW。另外,在CoreSight 产品中还可以使用一种JTAG‐DP,它只支持JTAG 协议。DAP 总线上的地址是32 位的,其中高8 位用于选择访问哪一个设备,由此可见最多可以在DAP 总线上面挂256 个设备。在CM3 处理器的内部,只用掉了一个设备的地址,还剩下的255 个都可以用于连接访问端口(AP)到DAP 总线上。

 

主机到Cortex-M3的调试连接:

<!--[if !vml]-->点击看大图
<!--[endif]-->

 

 

 

跟踪接口

CoreSight 架构的另一个部分用于跟踪。在CM3 中有3 种跟踪源:

1. 指令跟踪:由ETM(嵌入式跟踪宏单元)产生

2. 数据跟踪:由DWT 产生

3. 调试消息:由ITM 产生,提供形如printf 的消息输入,送到调试器的GUI 中

在跟踪踪过程中,由跟踪源产生的数据被裹成数据包,然后被送到“高级跟踪总线(ATB)”

上进行传送。在CoreSight 的架构中,如果某SoC 含有多个跟踪源(例如,多核系统),则需要一种硬件水平的ATB 归并器(merger),把各ATB 数据流归并成一条(在CoreSight 架构中,这种硬件被名为ATB funnel)。归并后的数据流都送往TPIU(跟踪端口接口单元),TPIU 再把数据导出到片外的跟踪硬件设备。在数据送到了调试主机(PC)后,再由PC 端的调试软件还原为先前的多条数据流。

尽管在CM3 中拥有多个跟踪源,但CM3 内建了一个归并硬件,因此不需要再添加ATB

funel 模块了。跟踪输出接口可以直接连接到专为CM3 设计的TPIU 上,然后就可以供PC 控制的外部硬件捕捉仪来跟踪数据。

 

<!--[if !vml]-->点击看大图
<!--[endif]-->

 

 

调试模式

在CM3 中的调试操作模式分为两种。第一种称为“halt”(停机模式),在进入此模式时,

处理器完全停止程序的执行。第二种则称为“debug monitor exception”(调试监视器模式),

此时处理器执行相应的调试监视器异常服务例程,由它来执行调试任务,此时依然允许更高

优先级的异常抢占它。调试监视器的异常号为12,优先级可编程。除了调试事件可以触发

异常外,手工设置其悬起位也可以触发本异常。

1. 停机模式

1). 指令执行被停止

2). SysTick 定时器停止

3).支持单步操作

4).中断可以在这期间悬起,并且可以在单步执行时响应。也可以掩蔽它们,使得单步时不受干扰

 

下图为可能进入停机模式:

<!--[if !vml]-->点击看大图
<!--[endif]-->

2.调试监视器模式

1) 处理器执行调试监视器异常的服务例程(异常号:12)

2) SysTick 定时器继续运行

3)新来的中断按普通执行时的原则来抢占

4) 执行单步操作

5) 存储器的内容(如堆栈内存)会在调试监视器的响应前后更新,因为有自动入栈和出栈的动作

 

下图为可能进入调试监视器模式:

<!--[if !vml]-->点击看大图
<!--[endif]-->

 

 

Cortex-M3 中的断点

在大多数单片机中,用得最多的可能就是断点了。在CM3中,有两种断点机制:

1. 断点指令(用来实现软断点):断点指令的格式为BKPT #im8,它是一个16位的Thumb指令,编码为0xBExx——其低8位就是指令中#im8的值。当该指令执行时,会产生一个调试事件。使用BKPT时另一个要注意的是,当调试监视器异常返回后,它返回BKPT指令的地址,而不是在BKPT后面一条指令的地址。这是因为在正常情况下使用BKPT指令时,BKPT用于取代一条正常的指令,并且当命中了该断点而执行了调试动作后,指令内存被恢复为先前的指令,而剩下的部分没有受影响。

 

2. 基于由FPB地址比较器的断点:

 

 

 

调试时访问寄存器

与调试功能有关的,还有NVIC中另外两个寄存器。它们分别是:调试内核寄存器选择者

寄存器(DCRSR),以及调试内核寄存器数据寄存器(DCRDR)。调试器需要通过这两个寄存器来访问处理器的寄存器,并且只有在处理器停机时,才能使用这里的寄存器传送功能。

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

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来访问寄存器,只适用于停机模式。

 

 

Cortex-M3 的跟踪系统

<!--[if !vml]-->点击看大图
<!--[endif]-->

 

 

跟踪系统:数据观察点与跟踪(DWT)

本节的主角是DWT,它提供的调试功能包括:

1. 它包含了4 个比较器,可以配置成在发生比较匹配时,执行如下动作:

a) 硬件观察点(产生一个观察点调试事件,并且用它来调用调试模式,包括停机

模式和调试监视器模式

b) ETM 触发,可以触发ETM 发出一个数据包,并汇入指令跟踪数据流中

c) 程序计数器(PC)采样器事件触发

d) 数据地址采样器触发

e) 第一个比较器还能用于比较时钟周期计数器(CYCCNT),用于取代对数据地址

的比较

2. 作为计数器,对下列项目进行计数:

a) 时钟周期(CYCCNT)

b) 被折叠(Folded)的指令

c) 对加载/存储单元(LSU)的操作

d) 睡眠的时钟周期

e) 每指令周期数(CPI)

f) 中断的额外开销(overhead)

3. 以固定的周期采样PC 的值

4. 中断事件跟踪

当用于硬件观察点或ETM 触发时,比较器既可以比较数据地址,也可以比较程序计数

器PC。当用于其它功能时,则只能比较数据地址。

每一个比较器都有3 个寄存器

1)COMP 寄存器

2) MASK 寄存器

3) FUNCTION 控制寄存器

 

 

跟踪组件:指令跟踪宏单元(ITM)

ITM 有如下的功能:

1) 软件可以直接把控制台消息写到ITM stimulus 端口,从而把它们输出成跟踪数据。

2) DWT 可以产生跟踪数据包,并通过ITM 把它们输出。

3) ITM 可以产生时间戳数据包并插入到跟踪数据流中,用于帮助调试器求出各事件的

发生时间。

因为ITM 要使用跟踪端口来输出数据,所以芯片上必须有TPIU 单元,否则无法输出—

—在使用ITM 前要确认此事。如果不幸地没有TPIU,也还可以使用NVIC 调试寄存器,或者

使用最后一招——求助于UART 来输出控制台消息。

欲使用ITM,必须把DEMCR.TRCENA 位置位,否则ITM 处于除能状态,无法使用。

另外,在ITM 寄存器中还有一个锁。在编程ITM 之前,必须写入一个访问钥匙值

0xC5AC_CE55(CoreSight 的ACCESS)到这个解锁寄存器。否则,所有对ITM 寄存器的写操

作都被忽略。

最后,ITM 自己也是另一个控制寄存器(可能是说控制寄存器的名字也是“ITM”吧),

用于控制对各功能的独立使能。

控制寄存器中含了ATID 位段,作为ITM 在ATB 中的ID 值。这个ID 必须是唯一的——

每个跟踪源都必须有唯一的ID 值,从而使调试主机能从接收到的跟踪数据包中分离各跟踪

源的数据。

 

跟踪组件:跟踪端口接口单元(TPIU

如前所述,ITM, DWT 和ETM 的跟踪数据都在TPIU 处汇聚。TPIU 用于把这些跟踪数据

格式化并输出到片外,以供跟踪端口分析仪之类的设备接收使用。CM3 的TPIU 支持两种输

出模式:

1) 带时钟模式(Clocked mode),使用最多4位的并行数据输出端口

2) 串行线观察器(SWV)模式,使用单一位的SWV输出(不适用于早期版本的CM3)

在带时钟模式下,在数据输出端口上实际被使用的位数是可编程的。这取决于两点。其

一,是芯片的封装;其二,是在应用中,提供给跟踪输出使用的信号引脚的数量。在具体的

芯片中,通过检查TPIU的寄存器,可以判断跟踪端口的最大尺寸。此外,跟踪数据输出的速

度也是可编程的。

在SWV模式下,则使用SWV协议。它减少了所需的输出信号数,但是跟踪输出的最大的

带宽也减少了。

欲使用TPIU,需要先把DECMR.TRCENA置位,还要编程“协议选择寄存器”和“跟踪端

口尺寸寄存器”,这个工作由跟踪捕捉软件完成。

 

 

闪存地址重载及断点单元(FPB)

FPB有两项功能:

1. 硬件断点支持。产生一个断点事件,从而使处理器进入调试模式(停机或调试监视

器异常)

2. 把代码地址空间中的指令或字面值(literal data)重载到SRAM中。

FPB有8个比较器,分别是:

1)6个指令比较器

2) 2个字面值比较器

 

 

AHB 访问端口

AHB‐AP位于CM3的存储器系统和调试接口模块(SWJ‐DP/SW_DP)之间,充当一个总线

桥的角色。对于大多数基本的在调试主机和CM3系统之间的数据传输,需要使用AHB‐AP中的

3个寄存器,它们是:

1) 控制及状态字(CSW)

2) 传输地址寄存器(TAR)

3)数据读/写(DRW)

AHB‐AP的连接方法如下图所示:

<!--[if !vml]-->点击看大图
<!--[endif]-->

 

 

CSW寄存器可以控制传送方向(读/写)、传送大小以及传送类型等。TAR寄存器则指令

传送地址,而DRW寄存器则容纳了被传送的数据(在访问该寄存器时就启动了传送)。DRW

中的数据与总线上实际显示的是一致的,所以对于半字和字节传送,必须由调试硬件把得到

的数据适当移位,以对齐到LSB。例如,如欲在地址0x1002上执行一次半字传送,则需要把

数据放到DRW的[31:16]上。AHB‐AP可以产生非对齐传送,但是它不会根据地址偏移来自动

对目标数据做圆圈移位,必须由调试软件堵上这个窟窿:要么手工圆圈移位,要么把未对齐

访问分解为若干个对齐的访问。

在AHB‐AP中还有其它的寄存器,它们提供附加的功能。例如,AHB‐AP中提供了4个

bannked寄存器和地址自动增量的功能,用于加快在小范围连续地址中数据访问的速度。

 

 

ROM表

CM3的调试系统还包含了ROM表,用于自动检测在某CM3芯片中包含了哪些调试组件。尽管作为v7‐M的第一个践行者,CM3拥有一个预定义的存储器映射并且包含了标准的调试组件,但是新的Cortex‐M器件可以包含不同的调试组件,并且芯片厂商在实现CM3时也可以对调试组件加以修改。为使调试工具能检测到调试系统中具体包含的组件,就提供了这张ROM表,它记录了NVIC和各个调试功能块的地址。

ROM表位于0xE00F_F000。通过分析ROM表中的内容,可以计算出系统和调试组件在存

储器系统中的位置。在检测到了调试组件后,调试器可以接下来查看它们的ID寄存器,从而

判定系统中哪些组件是可用的。

在CM3的ROM表中,第一条目的内容应当是:NVIC的入口地址相对于ROM表入口地址的

偏移量。(ROM表首条目的缺省值是0xFFF0F003,其中位段[1:0]的作用比较特殊:它指示本条目对应的设备是存在的,并且在本条目的后面还有后续的条目(也就是说本条目不是最后一个条目)。这样,通过第一个条目,我们就知道系统中有NVIC,并且还有第2个条目,而且还能计算出NVIC的地址为0xE00F_F000+0xFFF0_F000=0xE000_E000)。

 

数值的最低两个位用于指示该设备是否存在(bit[1])以及后面还有没有其它的表项(bit[0])。在正常情况下,NVIC, DWT和FPB总是必须存在的,因此最后两位永远是1。然而,TPIU和ETM则可以被裁掉,并且可能被CoreSight家庭中其它的调试组件所取代。

 

 

上面就是真个CM3的调试框架。一般的CM3芯片都只带有 NIVC,DWT,FPB组件,不过它们对调试来说已经足够了。NIVC包含了控制单步执行和寄存器访问功能;DWT用来实现数据观察断点;FPB用来实 现ROM/FLASH中的硬断点,如果只在RAM中调试的话,FPB也就没多大用处了(也许我还没碰到),应该也可以省略。

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客