0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何利用ITM实现更快的跟踪?如何在代码中使用ITM呢?

麦克泰技术 来源:麦克泰技术 2024-01-26 11:27 次阅读

在大多数固件开发过程中,需要有某种形式的诊断日志/跟踪。如果在传统串口上使用简单的“printf”调用实现日志,每次日志调用的开销通常是多个毫秒,这种时间消耗将干扰应用程序的行为,在异常处理程序或快速控制循环等时间关键代码中是不可接受的。

为了解决这个问题,很多MCU,如ARM Cortex-M3, M4或M7内核的MCU,已经在处理器中内置了解决方案,即ITM - Instrumentation Trace Macrocell。

38705e40-bbf8-11ee-8b88-92fbcf53809c.png

ITM是一个硬件单元,可以传输两种类型的诊断数据:

1、由DWT单元生成的调试事件,例如异常事件和数据观察点事件。

2、软件插装(SWIT)事件,即代码记录的自定义数据。

使用ITM,只需将数据写入相应的内存映射寄存器,用户即可将任何类型的数据作为SWIT事件传输到主机PC。通过相应的调试器,传输只需几个时钟周期,ITM还支持硬件完成的时间戳。许多IDE允许用户在调试窗口中查看这些数据,或者将数据写入文件供以后分析。数据可以是字符形式的文本数据(来自printf输出),但也可以发送二进制数据,ITM每次写入最多支持32位数据。

ITM单元为SWIT事件提供了32个逻辑通道,每个通道都有一个相应的stimulus寄存器,用于接受输入。这些通道将诊断数据分成不同的类别。例如,ARM推荐通道0用于文本数据,通道31用于RTOS事件,而其他通道可以用于任何目的。所有ITM通道共享一个公共FIFO缓冲区,该缓冲区依次连接到一个或两个输出端口。如果使用完整跟踪端口和跟踪调试器,则ITM数据包含在指令跟踪(ETM)结果中,但也可以通过调试端口中常用的串行线输出(SWO)接口获得。大多数针对ARM MCU的调试器都支持SWO接口。

ITM FIFO缓冲区非常小,只有10个字节,因此如果使用低速的调试器,如果过于频繁地向ITM端口写入数据,可能会造成数据丢失。这可以在写入之前通过检查ITM FIFO是否有空闲空间来防止,在没有空间的情况下延迟写入(参见下面的“fputc”代码示例)。但是,如果调试器接收数据太慢,这种方式可能会对系统的时间产生重大影响。

避免数据丢失和阻塞的更好方法是使用快速调试器,如SEGGER J-Link,Keil ULINK等允许60-100 MHz的SWO采样率。

在代码中使用ITM

ITM stimulus寄存器位于地址0xE0000000(端口0)到0xE000007C(端口31)。要写入数据,需要做的就是在IDE中启用ITM跟踪,并将数据写入相应的寄存器。

如果使用的板级支持包包含ARM的CMSIS API,那么写入数据很简单:

#include"myMCU.h" // Includes CMSIS

ITM->PORT[0].u32 = mydata;

如果系统中没有使用CMSIS API,可以直接为ITM stimulus寄存器定义宏,如下所示:

#defineITM_PORT(n) (*((volatile unsigned long *)(0xE0000000+4*n)))

ITM_PORT(0) = mydata;

在使用ITM跟踪之前,需要使能ITM跟踪。基于Keil µVision的示例如下,该系统已配置为在所有32个ITM stimulus端口启用ITM跟踪。如果可能的话,在“Trace port”中选择Manchester模式,它允许比UART/NRZ模式更高的SWO时钟频率。

38779de0-bbf8-11ee-8b88-92fbcf53809c.png

为了让你的“printf”调用写入ITM端口0,需要像这样定义“fputc”函数:

struct __FILE { int handle; /* Add whatever needed */ };

FILE __stdout;

FILE __stdin;

int fputc(int ch, FILE *f)

{

if(DEMCR & TRCENA) // Only ifITM isavailable

{

while(ITM_PORT(0) == 0); // Blockuntil room inITM FIFO

ITM_PORT(0) = ch; // Writethe data

}

return(ch);

}

ITM是大多数ARM开发工具支持的重要调试技术,它在调试中有许多应用,并且易于入门!

Percepio Tracealyzer利用ITM的性能,实现RTOS实时数据跟踪。Tracealyzer允许用户跟踪和可视化RTOS任务,异常(ISR)和其他软件事件的执行,提供超过30个相互关联的视图,为基于RTOS的固件的运行时世界提供惊人的视觉洞察,加速开发,验证和调试。

388ebac0-bbf8-11ee-8b88-92fbcf53809c.png

Tracealyzer支持ARM Cortex-M3, M4和M7 MCU的ITM跟踪,实现FreeRTOS,µC/OS-III和SafeRTOS等RTOS的可视化分析。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    18288

    浏览量

    222176
  • ITM
    ITM
    +关注

    关注

    0

    文章

    6

    浏览量

    8862
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118796
  • Cortex-M3
    +关注

    关注

    9

    文章

    268

    浏览量

    59165
  • 调试器
    +关注

    关注

    1

    文章

    288

    浏览量

    23410

原文标题:如何利用ITM实现更快的跟踪?

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    M487JIDAE如何使用ITM功能实现printf打印?

    M487JIDAE如何使用ITM功能实现printf打印?
    发表于 01-16 08:03

    ITM-AP02/ITM-AP03/ITM-AP04三款经典AR9331无线AP模块

    设计模块,替很多客户分担了模块集成中的一些设计担忧;有应用高性能的AR9331芯片,开发设计三款经典无线模块,型号分别是:ITM-AP02/ITM-AP03/ITM-AP04;在市场上得到了广泛用户
    发表于 11-13 16:39

    【NUCLEO-F412ZG试用体验】ITM机制输出调试信息

    信息出机制:TIMCoreSight ITM 块是一个软件应用程序驱动的跟踪源。支持的代码将生成软件测量跟踪 (SWIT)。此外,该块还提供粗略的时间戳功能。该块的主要用途是: 支持
    发表于 11-30 21:40

    ARM调试CoreSight、ETM、PTM、ITM、HTM、ETB等常用术语解析

    使用 PTM 生成的信息重建全部或部分程序的执行情况。 ITM,测量跟踪宏单元CoreSight ITM 块是一个软件应用程序驱动的跟踪源。支持的
    发表于 05-11 13:53

    Tracealyzer利用CortexM的ITM实现跟踪

    事件,达到1175KB/s的传输速率。使用ARM-ITM流模式下文将以IAR EWARM 8.40、I-jet调试器和Tracealyzer 4.35为例说明如何配置和使用ITM实现流模式跟踪
    发表于 12-05 15:34

    ITM调试

    折腾了许久,终于把 ITM 调试搞定了。首先看看效果图:是的,你没有看错,以上所有的窗口都是由MDK支持的。这也是为什么我执着于ITM调试的原因了,因为这种调试手段实在是太方便了啊。相信很多朋友在
    发表于 08-11 08:14

    如何使用ITM机制实现调试stm32单片机实现printf与scanf?

    如何使用ITM机制实现调试stm32单片机实现printf与scanf?
    发表于 12-02 06:53

    何在SWV ITM data console窗口看到printf打印的内容?

    何在SWV ITM data console窗口看到printf打印的内容?
    发表于 12-02 06:28

    如何使用ITM调试不适用于STM32CubeIDE中的SWV?

    不是更新全局变量并通过查看 SWV 数据跟踪时间线图表或 CubeMonitor 中的图表来观察执行顺序?关于为什么我可以使用 Nucleo-F446RE 使除 ITM 之外的所有东西都为我工作的任何
    发表于 12-26 07:19

    M487JIDAE如何使用ITM功能实现printf打印?

    M487JIDAE如何使用ITM功能实现printf打印?
    发表于 06-13 06:30

    M487JIDAE如何使用ITM功能实现printf打印?

    M487JIDAE如何使用ITM功能实现printf打印?
    发表于 08-28 08:15

    ITM公司采用Broadcom蓝牙技术

    ITM公司采用Broadcom蓝牙技术 Broadcom宣布,领先的蓝牙车载套件设备原始设计制造商(ODM)ITM公司已经决定在其新的无线车载套件产品系列中采用Broadcom的蓝牙技术。这些
    发表于 12-22 09:19 598次阅读

    基于ITM-DOPA-B-01无线连结的参考设计

    查看ITM-DOPA-B-01的参考设计。 http://www.elecfans.com/soft/有成千上万的参考设计,可帮助您使项目栩栩如生。
    发表于 01-09 21:00 0次下载
    基于<b class='flag-5'>ITM</b>-DOPA-B-01无线连结的参考设计

    基于ITM-DYPA-B-01无线连结的参考设计

    查看ITM-DYPA-B-01的参考设计。 http://www.elecfans.com/soft/有成千上万的参考设计,可帮助您使项目栩栩如生。
    发表于 01-14 09:40 3次下载
    基于<b class='flag-5'>ITM</b>-DYPA-B-01无线连结的参考设计

    ITM和PTM、ETM有什么关系

    CoreSight ITM 块是一个软件应用程序驱动的跟踪源。支持的代码将生成软件测量跟踪 (SWIT)。此外,该块还提供粗略的时间戳功能。 ITM
    的头像 发表于 10-30 14:53 638次阅读