ICCAVR 中存储空间的分配
在Keil中为了节省数据存储器的空间,通过“code”关键字来定义一个数组或字符串将被存储在程序存储器中: ??? ????uchar?code?buffer[]={0,1,2,3,4,5}; ????uchar?code?string[]="ARMoric"?; ??? 而这类代码移值到ICCAVR上时是不能编译通过的。我们可以通过"const"?限定词来实现对存储器的分配: ?? ????#pragma?data:code ????const?unsigned?char?buffer[]={0,5}; ????const?unsigned?char?string[]="ARMoric"; ????#pragma?data:data ?? ???注意: ?《1》使用ICCAVR6.31时,#pragma?data?:code??;#pragma?data:data?;??这些语法时在"data:cod"、"data:data"字符串中间不能加空格,否则编译不能通过。 ?《2》const?在ICCAVR是一个扩展关键词,它与ANSIC标准有冲突,移值到其它的编译器使用时也需要修改相关的地方。 ????????????????? ???在ICCAVR中对数组和字符串的五种不同空间分配: ??? const?unsigned?char?buffer[]={0,5};??//buffer数组?被分配在程序存储区中 const?unsigned?char?string[]="ARMoric"?;???????//stringp字符串被分配在程序存储区中 const?unsigned?char?*pt???????//指针变量pt被分配在数据存储区中,指向程序存储区中的字符类型数据 unsigned?char?*const?pt??????//指针变量pt被分配在程序存储区中,指向数据存储区中的字符类型数据 ?const?unsigned?char?*const?pt??//指针变量pt被分配在程序存储区,指向程序存储区中的字符类型数据 ?unsigned?char?*pt????//指针变量pt被分配在数据存储区中,指向数据存储区中的数据 ? 如何将ICCAVR程序中的数组存入FLASH中下面是ICCAVR中对字符串和常数表格分配可能出现的五种情况: const?int?table[]={1,3};//table表格只分配进程序存储器中 const?char?string[]="iccavr";//字符串数组只分配进程序存储器中 const?char?*prt1?//指针prt1位于数据存储器空间指向程序存储器空间的字符型数据 char?*const?prt2?//指针prt2位于程序存储器空间指向数据存储器空间的字符型数据 const?char?*const?prt3?//指针prt3位于程序存储器空间指向程序存储器空间的字符型数据 实际使用中常使用前三种 在KEIL中的用法 unsigned?char?code?table[]={1,4}; unsigned?char?code?a[]="keil"; 在IAR中引入"flash"关键字,用法如下: flash?unsigned?char?table[]={1,5}; flash?unsigned?char?a[]="IAR"; 在ICCAVR中的用法是 #pragma?data:code const?unsigned?char?table[]={1,3}; const?unsigned?char?a[]="ICCAVR"; #pragma?data:data 转载后记:我用的是iccavr?7的破解版,套用上面的方法不行,提示为内存初始化错误,我试着将“#pragma?data:code”和“#pragma?data:data”对调位置,结果编译正确,即将上文的 #pragma?data:code const?unsigned?char?table[]={1,3}; const?unsigned?char?a[]="ICCAVR"; #pragma?data:data 改为: #pragma?data:data const?unsigned?char?table[]={1,3}; const?unsigned?char?a[]="ICCAVR"; #pragma?data:code 不知道为什么这样,只是给路过的朋友提个醒。 后来发现ICCAVR7.22不用这么改也好用的。 ? 大家要注意的是: 写入flash里面的数据调用的时候,需要注意调用的声明。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |