再上一篇:第16章
上一篇:16.2 跟踪组件:数据观察点与跟踪(DWT)
主页
下一篇:16.4 跟踪组件:嵌入式跟踪宏单元
再下一篇:16.5 跟踪组件:跟踪端口接口单元(TPIU)
文章列表

16.3 跟踪组件:仪器化跟踪宏单元(ITM)

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

ITM有如下的功能:

 软件可以直接把控制台消息写到 ITM stimulus端口,从而把它们输出成跟踪数据。
 DWT可以产生跟踪数据包,并通过 ITM把它们输出。
 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值,从而使调试主机能从接收到的跟踪数据包中分离出各跟踪源的数据。

16.3.1 基于 ITM的软件跟踪

ITM 的一个主要用途,就是支持调试消息的输出(例如,printf 格式的输出)ITM 包含了 32 个刺激(stimulus)端口,允许不同的软件把数据输出到不同的端口,从而让调试主机可以把它们 的消息分离开。通过编程“跟踪使能寄存器”,每个端口都可以独立地使能/除能,还可以允许或禁 止用户进程对它执行写操作。

与基于 UART的文字输出不同,使用 ITM输出不会对应用程序造成很大的延迟。在 ITM内部有 一个 FIFO,它使写入的输出消息得到缓冲。不过,为了安全起见,最好还是在写入前检查该 FIFO 被填满的程度。
输出的消息被送往 TPIU,然后可以通过“跟踪端口接口”或者“串行线接口”来收集它们。在 最终的代码中也无需移除产生调试消息的代码,而是可以把 TRCENA位清零,这样 ITM就被除能,
调试消息也不会输出,你也可以在一个“live”系统中开启消息输出。另外,通过设置跟踪使能寄 存器,可以限定允许使用的端口。

16.3.2 基于 ITM和 DWT的硬件跟踪

ITM也能用于输出硬件跟踪数据,这些数据由 DWT产生,ITM则担任跟踪数据包的归并单元, 如图 16.2所示。欲使用 DWT跟踪,需要在 ITM控制寄存器中置位 DWTEN位,剩下的 DWT跟踪设置 在 DWT中完成。


图 16.2 在 ITM 和 TPIU 上的数据包归并模式图

16.3.3 ITM时间戳

ITM 还附带了一个时间戳的功能:当一个新的跟踪数据包进入了 ITM 的 FIFO 时,ITM 就会把 一个差分的时间戳数据包插入到跟踪数据流中。跟踪捕获设备在得到了这些时间戳后,就可以找出 各跟踪数据之间的时间相关信息。另外,在时间戳计数器溢出时也会发生时间戳数据包。