打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ARM Cortex-M系列的调试架构CoreSight技术简介
userphoto

2018.01.25

关注

    前段时间写过一篇介绍Cortex-M4核的寄存器组的博客,算是对一些初入Cortex-M系列新手的一个知识扩展。今天继续说说关于Cortex-M那点事儿,注意这次介绍的不是其内核部分,而是ARM公司IP授权的一部分,即与内核并列的调试系统架构——CoreSight技术。

    CoreSight(内核景象)调试架构是ARM在推出Cortex之后推出来的,旨在丰富ARM产品的调试功能,功能是相当强大,呵呵。这里得插一句,可能对刚开始接触单片机做简单程序开发的人来说,调试这个概念只局限于把代码编译连接之后下到片子然后根据错误症状来判断问题再返回来重新修改,直到问题解决(我现在还偶尔这么干呢,嘿嘿,有的时候真有点懒),然而在一个系统程序相当复杂的情况下,一个功能强大的调试系统会让你解决问题事半功倍,这就是调试的好处。而像我们平时用到的设置断点、观察寄存器和内存区及监视变量等操作才真正算的上是一种调试,而Coresight的推出就是让调试更加强大,功能更加丰富,让你对单片机的调试游刃有余。

    CoreSight调试架构包含了很多调试组件即各种协议,很复杂,但是对于我们这些搞嵌入式软硬件开发的想去深入了解它没有必要,毕竟这个是开发调试软件的人干的活,咱们只是“知其然”就OK了(另外值得一提的是CoreSight技术支持JTAG协议和SW协议,其实更具体的说实际上是CoreSight是把JTAG和SW协议转换成通用的内部DAP协议,这里只是利用了JTAG和SW接口),否则开发了一年多的ARM到头来别人问到什么是CoreSight都不知道就傻眼了是吧,哈哈,所以也是我为什么在题目写了“简介”二字。下面就以图为主简单说说CoreSight架构,觉着无趣的就可以略过了,毕竟本篇就是一篇知识扩展。

 

    通过使用 CoreSight 系统 IP,嵌入式软件开发人员和 SoC 设计人员可以开发高性能的系统(软件和硬件),同时缩短开发时间和降低风险。ARM开发工具和 Keil开发工具以及全球超过 25 个其他调试和性能分析工具支持 CoreSight 产品组合(包含 ARM 嵌入式跟踪宏单元(ETM)),从而向产品开发团队保证其产品将得到广泛的支持,下图为CoreSight的一些优势:

    下图给出了Cortex-M系列的CoreSight技术的可选组件(CoreSight技术的组件是和压缩裁剪的,具体用到哪些由ARM公司更具内核的需要而定制,伸缩性较强),由于ARM官网还没有更新Cortex-M4,所以这里没有它的组件特性,不过M4和M3应该是一样一样的,呵呵:


ARM Cortex-M3调试框架

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

跟踪接口

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 控制的外部硬件捕捉仪来跟踪数据。

调试模式

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

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

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

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

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

1. 停机模式

1). 指令执行被停止

2). SysTick 定时器停止

3).支持单步操作

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

2.调试监视器模式

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

2) SysTick 定时器继续运行

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

4) 执行单步操作

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

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

使用DCRSRDCRDR来访问寄存器,只适用于停机模式。

跟踪系统:数据观察点与跟踪(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_CE55CoreSight 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中。

FPB8个比较器,分别是:

1)6个指令比较器

2) 2个字面值比较器

AHB 访问端口

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

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

3个寄存器,它们是:

1) 控制及状态字(CSW

2) 传输地址寄存器(TAR

3)数据读/写(DRW

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

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

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

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

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

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

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

AHBAP中还有其它的寄存器,它们提供附加的功能。例如,AHBAP中提供了4

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

ROM

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

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

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

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

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

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

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

上面就是真个CM3的调试框架。一般的CM3芯片都只带有 NIVC,DWT,FPB组件,不过它们对调试来说已经足够了。NIVC包含了控制单步执行和寄存器访问功能;DWT用来实现数据观察断点;FPB用来实 ROM/FLASH中的硬断点,如果只在RAM中调试的话,FPB也就没多大用处了(也许我还没碰到),应该也可以省略。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【精品博文】coresight(八)soc-400套件
佛祖保佑,永无 BUG,永不修改 | KEIL 调试系列总结篇
STM32 的ITM、DWT功能实现
ARM 调试工具
Debug命令详解 - WIN32 - linxh
第2章_4 32位编程结构
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服