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

在大多数固件开发过程中,需要有某种形式的诊断日志/跟踪。如果在传统串口上使用简单的“printf”调用实现日志,每次日志调用的开销通常是多个毫秒,这种时间消耗将干扰应用程序的行为,在异常处理程序或快速控制循环等时间关键代码中是不可接受的。
为了解决这个问题,很多mcu,如arm cortex-m3, m4或m7内核的mcu,已经在处理器中内置了解决方案,即itm - instrumentation trace macrocell。
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寄存器定义宏,如下所示:
#define itm_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时钟频率。
为了让你的“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 if itm is available
       {
            while (itm_port(0) == 0);  // block until room in itm fifo
            itm_port(0) = ch;          // write the data
       }
    return(ch);
}
itm是大多数arm开发工具支持的重要调试技术,它在调试中有许多应用,并且易于入门!
percepio tracealyzer利用itm的性能,实现rtos实时数据跟踪。tracealyzer允许用户跟踪和可视化rtos任务,异常(isr)和其他软件事件的执行,提供超过30个相互关联的视图,为基于rtos的固件的运行时世界提供惊人的视觉洞察,加速开发,验证和调试。
tracealyzer支持arm cortex-m3, m4和m7 mcu的itm跟踪,实现freertos,µc/os-iii和safertos等rtos的可视化分析。


创建并运行您的第一个网页UI测试用例
一加10 Pro超强技术加持,游戏全程88帧
安卓系统能用AirPodsPro吗
如何搭建智能焊接工业互联网平台(系统功能及优势)
传音控股位列“2023中国企业科创力排行”智能消费终端行业前三
如何利用ITM实现更快的跟踪?如何在代码中使用ITM呢?
基于DSP的稳定平台伺服系统的设计研究
掌门访谈 | 优博讯董事长郭颂:争做“数字中国”建设的标杆企业!
AR云(ARCloud)到底是什么
谈谈心电信号采集放大电路的简单设计方法
为什么退耦电容通常选0.1uF?
逆转!小米取代OPPO列第四,华为稳坐第四
3G手机银行:商业模式期待变革
手持式激光尘埃粒子计数器介绍
iPhone13配置 iPhone13大概多少钱
5G/50G PON技术的发展趋势
OLED与液晶技术两大阵营,何时会被取代?
FRAM铁电存储器在汽车应用方面的优势
人工智能和机器学习正在医疗领域扎根
SiC基芯片背面通孔刻蚀工艺研究的优势是什么