本帖最后由 ALTIUM2 于 2017-3-3 07:44 编辑
【我要创作】MDK小技巧,调试高效率!
在我们嵌入式设计中,经常会和UI打交道,自然我们会用到一些大数据的常量,例如图片,字模,代码等。
以前我们会外挂一个flash来存储这些数据,只要烧录一次就行,以后直接读取就行。 现在随着CORTEX-M的大容量,我们会舍去。但是调试会变得很痛苦,太慢了……。
(小技巧)
A:MDK中指定变量存储地址(写数据) 使用头文件absacc.h中的 __at宏,将变量定位到绝对地址: 例如:
1:使用__at宏
int testbuf[1024] __at(0x00580000);
unsigned char testbuf[1024] __at(0x00580000)={0,};
2:没有用__at宏,也可以这样
unsigned char testbuf[1024] __attribute__ ((at(0x00580000)))={0,};
B:MDK中访问绝对存储地址(读数据) 可以用指针的方式来访问 unsigned char *pMemory = (unsigned char*)(0x005800); unsigned char temp; unsigned int cnt; temp = *(pMemory + cnt);
#define baseAddr 0x00580000 unsigned int i; unsigned char temp; unsigned int *ptr32 = (unsigned int*)baseAddr; temp = ptr32;
C:注意事项(重要) 绝对地址虽然指定数据的存储地址,但是自己选址的时候一定要小心越界,调试时注意存储数据的安全等等。 带来的好处也很明显,调试速度更快,避免了大量重复数据的烧写,提高调试效率。
D:实例分析 1.MDK中烧录的选择 可以选择“Erase Sector”擦出扇区选项,用多少擦除多少,也可以通过指定“start”"szie"指定地址的方式 来保证你存储区域的数据的安全。
2.存储选址,以FRDM-K64中的 mk64fn1m0vll12 芯片为例子,1M的flash
上图说明该IC分为两个512K大小的数据块,每个sector(扇区)为4KB
上图说明的两个Bank的详细地址
如果我想存储一个300K的数据我就可以存到BANK1,从0x0008000开始存储,将BANK0作为我的应用程序,当然保证不能越界了。然后我只要烧录一次,下次就可以取消这部分数据的烧录,从而提高调试速度。
希望这个小技巧能够让你在MDK调试中更加方便,更高效。
|