【ARM Coresight 系列文章 9.1 -- ITM 仪器化跟踪宏单元详细介绍】

文章目录

    • 1.1 ITM 介绍
      • 1.1.1 ITM 功能介绍
      • 1.1.2 Cortex-M ITM 的地址范围
    • 1.2 ITM 使用
      • 1.2.1 ITM 寄存器介绍
      • 1.2.2 Cortex-M7 ITM 代码示例
      • 1.2.3 Cortex-M33 ITM 代码示例

1.1 ITM 介绍

在debug 调试阶段通常都是使用 printf(printk) 来进行进行 log 输出,然后定位问题。那么如果SoC 中没有集成uart 或者 集成uart 不能使用了,那么软降如何将 log 输出出来呢?这个时候就可以通过 ARM coresight 中带的 ITM (仪器化跟踪宏单元) 模块了,它可比UART专业多了——速度快而且能提供多条信道。通过把数据写到 ITM 的寄存器中,调试器能够通过跟踪接口来收集这些数据,并且显示或者处理它。此法不但容易使用,而且比 JTAG 的输出速度更快。

ITM 主要用于 Cortex-M 系列,如 Cortex-M3/M7/M33 等,当然 Cortex-A 系列中也有类似 ITM 组件的组件,它就是 STM,STM的功能比 ITM 更强大,详细内容见 STM 的系列文章:
ARM Coresight 系列文章 10 - ARM Coresight STM 介绍及使用
ARM Coresight 系列文章 10.1 - ARM Coresight STM 介绍及使用
ARM Coresight 系列文章 10.2 - ARM Coresight STM Trace packets
ARM Coresight 系列文章 10.3 - ARM Coresight STM 寄存器介绍 及STM DMA 传输介绍

1.1.1 ITM 功能介绍

ITM 有如下的功能:

  • 软件可以直接把控制台消息写到 ITM stimulus 端口,从而把它们输出成跟踪数据;
  • DWT 可以产生跟踪数据包,并通过 ITM 把它们输出;
  • ITM 可以产生时间戳数据包并插入到跟踪数据流中,用于帮助调试器求出各事件的发生时间。

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

以 Cortex-M3为例, 处理器里面除了处理核心外,还有了其它组件,其中就包含ITM模块,如下图:
【ARM Coresight 系列文章 9.1 -- ITM 仪器化跟踪宏单元详细介绍】_第1张图片
总线 对 ITM 的访问
还是以Cortex-M3为例,它私有外设总线有两条:AHB 私有外设总线APB 私有外设总线,其中 AHB 只用于 Coretex-M3 内部的 AHB 外设,如上图黑粗线连接所示,它们是: NVIC, FPB, DWT 和 ITM

软件可以控制该模块通过高级跟踪总线(ATB)把来自ITM 的跟踪数据输出到TPIU(类似 printf 风格的调试);还可以让 DWT 匹配命中事件通过 ITM 产生数据跟踪包,并把它输出到一个跟踪数据流中。

1.1.2 Cortex-M ITM 的地址范围

cortex-m 地址范围 用户级许可权限
Cortex-M3 ITM E000_0000 – E000_0FFF 可以读。对于写操作,除了用户级下允许时的 stimulus 端口外,全部忽略
Cortex-M7 ITM E000_0000 – E000_0FFF
Cortex-M33 ITM E000_0000 – E000_0FFF

1.2 ITM 使用

使用 ITM 之前需要注意以下几点:

  • 必须把 DEMCR.TRCENA 位置位,跟踪系统使能位,在使用 DWT, ETM, ITM 和 TPIU 前,必须先设置此位否则 ITM 处于除能状态,无法使用。
  • 在 ITM 寄存器中还有一个锁。在编程 ITM 之前,必须写入一个访问钥匙值 0xC5AC_CE55(CoreSight 的 ACCESS)到这个解锁寄存器 ITM_LAR 中,M33 中已经去掉这个寄存器了。否则,所有对 ITM 寄存器的写操作都被忽略。
  • ITM 自己也是另一个控制寄存器(可能是说控制寄存器的名字也是“ITM”吧),用于控制对各功能的独立使能。控制寄存器中含了 ATID 位段,作为 ITM 在 ATB 中的 ID 值。这个 ID 必须是唯一的——每个跟踪源都必须有唯一的 ID 值,从而使调试主机能从接收到的跟踪数据包中分离出各跟踪源的数据。

DEMCR 是NVIC 调试异常及监视器控制寄存器

1.2.1 ITM 寄存器介绍

Cortex-M33 ITM 为例:
【ARM Coresight 系列文章 9.1 -- ITM 仪器化跟踪宏单元详细介绍】_第2张图片【ARM Coresight 系列文章 9.1 -- ITM 仪器化跟踪宏单元详细介绍】_第3张图片

1.2.2 Cortex-M7 ITM 代码示例

当时在对ITM测试的时候使用 ITM port0,所以下面测试代码也是使用 ITM 的port 口输出 log,代码如下,测试时直接调用函数 swo_test_itm 即可。

#include 

/* Memory mapping of Core Hardware */
#define ITM_BASE            (0xE0000000UL)                            /*!< ITM Base Address */
#define DWT_BASE            (0xE0001000UL)                            /*!< DWT Base Address */
#define CoreDebug_BASE      (0xE000EDF0UL)                            /*!< Core Debug Base Address */

#define I

你可能感兴趣的:(arm开发,ITM,测试代码,ITM,使用代码,coresight,ITM,cortex-m7,ITM,cortex-m33,ITM)