原创 #pragrma data:

2009-11-21 11:17 2745 2 2 分类: MCU/ 嵌入式

#pragma data:code和#pragma data:data



前者表示:随后的数据将存贮在程序区,即FLASH区,此区只能存贮常量,比如表格之类。
后者表示:随后的数据将存贮在数据区,即RAM区,此区可存贮常量和变量。



########################################3#########################################


#pragma data:eeprom
之后会生成一个.eep文件,你需要把这个文件烧录到芯片的EEPROM里面,由编译器自己完成,然后你调用的时候,才能看到你初始化的值。

eeprom 只能存小于256的数,也就是unsigned char,如果需要存浮点数或者int型,需要自己分字节存然后组合。


#pragma data:eeprom
unsigned char table[]= {0x10,0x11,0x12, 0x13, 0x14, 0x15};

生成的.eep文件的内容为

:060001001011121314158A
:00000001FF


##########################################################################


ICC自带EEPROM操作函数的操作方法...通过调用函数EEPROMwrite往eeprom的指定地址写数据的


http://www.avrvi.com/avr_examples/eeprom.html


 


 


 



在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,1,2,3,4,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,1,2,3,4,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,2,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,2,3,4};


unsigned char code a[]="keil";


在IAR中引入"flash"关键字,用法如下:


flash unsigned char table[]={1,2,3,4,5};


flash unsigned char a[]="IAR";


在ICCAVR中的用法是


#pragma data:code


const unsigned char table[]={1,2,3};


const unsigned char a[]="ICCAVR";


#pragma data:data

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /3 下一条