【原创】跟我学IARforARM之EventLog的应用
IAR Embedded Workbench 是瑞典 IAR Systems 公司为微处理器开发的一个集成开发环境(下面简称IAR EW),支持ARM,AVR,MSP430等芯片内核平台。
EWARM 中包含一个全软件的模拟程序(simulator)。用户不需要任何硬件支持就可以模拟各种ARM 内核、外部设备甚至中断的软件运行环境。从中可以了解和评估IAR EWARM 的功能和使用方法。本文将以实际操作的方式介绍其中的EventLog的应用方法。
一、EventLog的作用
IARforARM提供了4个Timer的EventLog,一方面可以用来测试程序执行时间,另一方面用来在程序运行过程中输出一些变量值。当发生BUG的时候,这是一种非常好的调查手段。
二、EventLog的设置方法
实例1:用EventLog测试程序执行时间
首先,include必须的头文件:
然后,假设要测试Log_Init()函数的执行时间,则我们可以这样改造:
//第一个参数表示TimerID,第二个参数是数值标识
ITM_EVENT8_WITH_PC(1,0x10);
Log_Init(); //调用Log_Init()函数
ITM_EVENT8_WITH_PC(1,0x11);
接着打开IAR->I-jet/JTAGjet->EventLog界面:
image001.png (4.05 KB, 下载次数: 0)
下载附件
2016-11-29 19:34 上传
把上面的Disabled改成Enabled。
最后单击IAR->GO运行程序,得到类似如下结果:
image002.png (4.23 KB, 下载次数: 0)
下载附件
2016-11-29 19:34 上传
由上图可以看出,Log_Init()函数执行时间大概是18.5毫秒。
在时间敏感的系统中,这个时间测试对于定位问题是非常关键的。
实例2:用EventLog监视变量的值
前面的例子介绍的是测量某段程序的执行时间,本例是监视变量在运行过程中的值。
首先,include必须的头文件:
然后,假设要在Log_Init()函数中监视变量g_DbgPrintLvl和g_DbgPrintOutput的值,则我们可以这样改造:
//第一个参数表示Timer ID,第二个参数是变量值
ITM_EVENT8_WITH_PC(1,g_DbgPrintLvl);
ITM_EVENT8_WITH_PC(2,g_DbgPrintOutput);
g_DbgPrintLvl = DBG_PRINT_LVL;
g_DbgPrintOutput = DEBUG_PRINT_OUTPUT;
ITM_EVENT8_WITH_PC(3,g_DbgPrintLvl);
ITM_EVENT8_WITH_PC(4,g_DbgPrintOutput);
然后,单击IAR->GO运行程序,得到类似如下结果:
image003.png (5.29 KB, 下载次数: 0)
下载附件
2016-11-29 19:34 上传
通过上图可以很清楚的看到在设置前,g_DbgPrintLvl=0,g_DbgPrintOutput=0,而设置后g_DbgPrintLvl=2,g_DbgPrintOutput=1。
虽然也可以通过printf打印运行时变量的值,但是printf会用到IO,输出速度慢,在时间敏感的系统是不能使用prinf来调试的。因此,当发生问题的时候,上述方法就是非常好的调试手段。
以上看似非常简单的例子,但是在发生问题的时候却是非常有效的调查手段,特别是对于多线程、多中断的复杂程序环境时,非常有用。