ITM调试使用说明(测试)

 

ITM,(Instrumentation Trace Macrocell,指令跟踪宏单元) ,是一种针对MCU进行跟踪调试的方法,与打断点(Breakpoint)不同,ITM方法不需要暂停程序运行,可以在程序全速运行的过程中实时输出变量的数值以便观察,即Trace功能。本文仅介绍几个基本的ITM调试功能。

  • 实现printf、scanf函数通过stdout、stdin与程序交互
  • Logic analyzer使用
  • Trace exceptions(异常追踪)
  • Event viewer(事件查看器)

一,硬件准备:

四线制下载线基础上增加一路,将J-Link/ST-Link SWO/JTO/PA10接口与开发板PB3接口连接。如果使用的是J-Link配套下载线连接,此步骤略过。

二,软件准备(以下均以Keil 5.29为例):

1,配置Trace:

target->Debug->Setting->Trace,勾选 Enable,修改Core Clock

1.png

2,重定向printf、scanf函数,使其与stdout stdin关联:

下载

Retarget.c文件,并添加到工程中。原版文件在 Keil安装目录->ARM->Startup下,可自行查看

三,使用

1,printf scanf

经过重定向后,printf与scanf分别与屏幕、键盘联系,依此与程序交互。可以用来打印局部变量的值(当然Call Stack-Locals窗口也可以,不过需要打断点),或者打印标记,监视程序运行,相当于使用串口助手。 文件中包含头文件 stdio.h,在程序中加入此函数
while(1)
{
  scanf("%d", &value);
  printf("value = %d\n", value);
  value ++;
  delay_ms(500);
}
进入debug模式,选择view-> Serial Windows -> Debug (printf) Viewer

3.png

运行程序,在Debug(printf)Viewer中输入数字(注意:无回显),以回车结尾,如输入: 15

4.png

右键点击窗口,可选择以 .txt格式保存打印结果
  • 说明:scanf使用过程中会出现bug,比如有时被直接跳过,具体原因待探究,谨慎使用
  • 说明:printf scanf 实际与ITM_SendChar和ITM_ReciveChar相联系,仍可以在程序中使用ITM_SendChar和ITM_ReciveChar,使用方法与putchar、getchar类似。

2,Logic analyzer

正点原子教程开篇提到的Logic Analyzer,当时一直不知道怎么用。Logic analyzer可以将全局变量的值以曲线形式绘制出来。 打开View->Analysis Windows->Logic Analyzer

5.png

选中全局变量,右键点击

6.png

int value = -10000;
int main(void)
{
  delay_init(168);

  while(1)
  {	
    value += 10;
    delay_ms(500);
  }
}
可以看到value随时间变化的曲线,如下图: 左上角setup可以设置图像纵坐标范围;Load、Save可以加载或保存Logic analyzer图像;使用鼠标滚轮在图像上滚动可以调整横坐标单位时间。Logic analyzer中可以添加多个变量进行观察。

8.png

  • 确保Core Clock的值是准确的,否则Logic Analyzer图像会非常不准确
  • 可以找到System Analyzer窗口,也可以用来观察变量值,当然还有其它复杂的用途。

3,中断记录

记录程序运行过程中中断进入次数、执行时间等。 在view中找到如下窗口Trace exceptions,运行程序即可看到。

9.png

10.png

4,Event viewer

事件查看器,可以将操作系统任务切换以图形化的方式实时显示出来,理论上是很强大的调试工具,但后来发现这是专门给Keil自带的RTX系统使用的,故不再介绍,正寻求其它方法实现类似功能(下图是Event View效果图)

10.png

四,参考资料

STM32调试之 ITM-简书
Keil debugging
Keil Jlink
Keil ITM

如有问题及时反馈,邮箱:<yuqi0618@foxmail.com>