首发http://blog.csdn.net/chenbb8 转载请注明
PS:本技巧是在设置优化等级为low时候测试的,原因是测试用到的变量在high优化等级的时候,可能会被优化掉。谁知道怎么突破这个优化的请告诉我~~,不可以修改内存中的值哦。
在IAR中,将一个数组名添加到watch窗口,是可以点开数组查看到数组内容的。
比如有全局变量:
uint8_t TestReadTbl[31] = "123456789";
并在某个地方使用一下,防止优化:TestReadTbl[0] = TestReadTbl[0];
那么将TestReadTbl添加到watch窗口后,效果如下:
但今天在调试CC2451的主机程序的时候,仿真进入到一个原型为
static bool simpleBLEFindSvcUuid( uint16 uuid, uint8 *pData, uint8 dataLen )
的函数内部时,想查看pData指向子机广播数据的数组却甚是麻烦,如上图所示一样,只能显示出第一个字节的数据,就算将参数中的pData定义改成uint8 pData[31]效果也是一样。而将pData[0]-pData[31]一个一个的添加到watch窗口实在不是我等懒人的风格。
经过摸索后,找到了两种查看的方式。
方法一:定义一个包含数组的结构体类型kankan_t,然后通过它定义的变量来查看pData指向的缓冲区:
typedef struct{ uint8_t pRead[31];} *kankan_t;
kankan_t kankan;
kankan = (kankan_t)pData;
kankan->pRead[0] = kankan->pRead[0]; //在这个位置打断点,查看缓冲区值。
效果:
方法二:定义一个指向数组类型的指针,然后通过这个指针来查看pData指向的缓冲区:
uint8_t (*kankantbl)[31] = (uint8_t (*)[31])pData;
(*kankantbl)[0] = (*kankantbl)[0]; //在这个位置打断点,查看缓冲区值。
效果:
另外还做了一个宏,喜欢就拿去吧:
#define DEBUG_READ_BUFF_CHAR(WATCH, PDATA, LENG) \
uint8_t (*(WATCH))[(LENG)] = (uint8_t (*)[(LENG)])(PDATA)
#define DEBUG_READ_BREAK(WATCH) (*(WATCH))[0] = (*(WATCH))[0]
使用方法:
PS:如果优化等级是none,那么将DebugReadBreak宏合并到DebugReadBuff中也没问题。