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 Clock2,重定向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
- 说明: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 Analyzerint value = -10000;
int main(void)
{
delay_init(168);
while(1)
{
value += 10;
delay_ms(500);
}
}
可以看到value随时间变化的曲线,如下图:
左上角setup可以设置图像纵坐标范围;Load、Save可以加载或保存Logic analyzer图像;使用鼠标滚轮在图像上滚动可以调整横坐标单位时间。Logic analyzer中可以添加多个变量进行观察。
- 确保Core Clock的值是准确的,否则Logic Analyzer图像会非常不准确
- 可以找到System Analyzer窗口,也可以用来观察变量值,当然还有其它复杂的用途。
3,中断记录
记录程序运行过程中中断进入次数、执行时间等。 在view中找到如下窗口Trace exceptions,运行程序即可看到。4,Event viewer
事件查看器,可以将操作系统任务切换以图形化的方式实时显示出来,理论上是很强大的调试工具,但后来发现这是专门给Keil自带的RTX系统使用的,故不再介绍,正寻求其它方法实现类似功能(下图是Event View效果图)