前言
在调试程序,准备分析从设备返回的一段buffer.
才发现,MDK显示出的内存内容,居然没法直接保存成bin文件或直接能拷贝到文本中, 做的挫啊…
上网查,大家一般是用SAVE命令 + hex2bin, 将内存数据保存成bin文件。
我这,是能用SAVE命令保存MDK内存到hex. 但是hex转bin这有问题,找了几个版本的hex2bin都不好使。应该是MDK5生成的HEX格式版本比较新吧.
最后,我用J-Flash V6.46g + winhex搞定, 机智啊:)
J-Flash就是最好的hex2bin.
试验
保存MDK内存内容到hex
这步有官方资料的。
http://www.keil.com/support/man/docs/uv3/uv3_cm_save.htm
我这调试要从0x20005E2c地址开始保存303个字节,那我的命令就如下:
SAVE d:\USART1_RX_BUF 0x20005E2c, 0x20005F5B
输入命令的地方,就在MDK的命令行输入框中。
看一眼生成好的文件,确实是hex格式的。
将hex转bin
我找的几个hex2bin, 都无法正确将这个hex转成bin.
我直接用JFALSH, 这个是装JLINK驱动那会装上的.
用JFALSH载入这个hex文件,是可以正常打开的。调试器自带的工具就是好用。
用JFLASH自带的数据文件另存功能保存成bin
然后用winhex打开转好的bin文件,就可以用拷贝功能,将2进制内容拷贝出来,贴到工程中,供分析协议用。
最后得到2进制内容的数组,这时就可以干正经活了。
unsigned AnsiChar data[304] = {
0x01, 0x2F, 0x01, 0x01, 0x00, 0x01, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0x28, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x14, 0xFE, 0xFE, 0xFE,
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
0xFE, 0x14, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFE, 0xFE, 0xFE, 0xFE,
0x08, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x08, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE,
0xFE, 0xFE, 0x02, 0xFE, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x3D, 0x00
};
MDK细节方面做的真不好用, 除了MDK也没得用。
本来从设备内存地址拷贝内容,这都是IDE应该做的。