【原创】跟我学IARforARM之DataLog的应用
IAR Embedded Workbench 是瑞典 IAR Systems 公司为微处理器开发的一个集成开发环境(下面简称IAR EW),支持ARM,AVR,MSP430等芯片内核平台。
EWARM 中包含一个全软件的模拟程序(simulator)。用户不需要任何硬件支持就可以模拟各种ARM 内核、外部设备甚至中断的软件运行环境。从中可以了解和评估IAR EWARM 的功能和使用方法。本文将以实际操作的方式介绍其中的DataLog的应用方法。
一、DataLog的作用
DataLog可以用来监视哪些程序对某块地址空间进行了读、写操作。当发生BUG的时候,这是一种非常好的调查手段。
二、DataLog的设置方法
实例1:定位对全局变量的读写操作的DataLog
首先,定义一个全局变量:
unsigned char g_DbgPrintLvl;
然后,在某个函数中对这个全局变量赋值:
g_DbgPrintLvl = DBG_PRINT_LVL;
接着进行编译,从*.map文件中找到该全局变量的地址:
g_DbgPrintLvl 0x9041f49b 0x1 Data Gb logcom.o [1]
接着,通过IAR->View->Memory菜单,打开Memory界面,输入0x9041F49B的地址:
image001.png (4.06 KB, 下载次数: 0)
下载附件
2016-11-29 19:28 上传
在该地址上右击->Set Data Log Breakpoint,然后单击IAR->View->Breakpoint查看断点,选择双击刚才设置的断点,可以进行编辑。
image002.png (24.81 KB, 下载次数: 0)
下载附件
2016-11-29 19:28 上传
接着打开IAR->I-jet/JTAGjet->DataLog界面:
image003.png (3.7 KB, 下载次数: 0)
下载附件
2016-11-29 19:28 上传
把上面的Disabled改成Enabled。
最后单击IAR->GO运行程序,得到类似如下结果:
image004.png (8.59 KB, 下载次数: 0)
下载附件
2016-11-29 19:28 上传
由上图可以看出有一系列的PC对0x9041F49B的地址进行W或R操作,那么如何知道是哪个程序呢?这个很简单,只要打开*.map文件,查找与PC值相近的文件,然后打开该文件的*.lst文件,查看里面的PC就知道是哪个函数执行的操作了。比如:上面的PC=0x000092FC进行了W 0x02的操作。
查看*.map文件,与上述PC相近的文件是logcom.o:
Log_Init 0x000092f1 0x110 Code Gb logcom.o [1]
因此,打开logcom.lst文件:
从偏移量0x0000000C的地方可以看出对g_DbgPrintLvl进行了写入操作。
image005.png (14.35 KB, 下载次数: 0)
下载附件
2016-11-29 19:28 上传
实例2:定位对全局变量的读写操作的Data Breakpoint
前面的例子介绍的是对某个变量读写操作时记录下PC值的LOG,本例是直接让CPU停在读写操作的地方。
在0x9041F49B地址上右击->Set Data Breakpoint,然后,单击IAR->GO运行程序,得到类似如下结果:
image006.png (29.69 KB, 下载次数: 0)
下载附件
2016-11-29 19:28 上传
与DataLog不同的是,程序直接停在对0x9041F49B地址进行读写操作之后的指令上。
以上看似非常简单的例子,但是在发生问题的时候却是非常有效的调查手段,特别是对于多线程、多中断的复杂程序环境时,非常有用。