在Keil中為了節(jié)省數(shù)據(jù)存儲器的空間,通過“code”關(guān)鍵字來定義一個數(shù)組或字符串將被存儲在程序存儲器中:
ucharcodebuffer[]={0,1,2,3,4,5};
ucharcodestring[]="ARMorIC";
而這類代碼移值到ICCAVR上時是不能編譯通過的。我們可以通過"const"限定詞來實(shí)現(xiàn)對存儲器的分配:
#pragmadata:code
constunsignedcharbuffer[]={0,1,2,3,4,5};
constunsignedcharstring[]="ARMoric";
#pragmadata:data
注意:
《1》使用ICCAVR6.31時,#pragmadata:code;#pragmadata:data;這些語法時在"data:cod"、"data:data"字符串中間不能加空格,否則編譯不能通過。
《2》const在ICCAVR是一個擴(kuò)展關(guān)鍵詞,它與ANSIC標(biāo)準(zhǔn)有沖突,移值到其它的編譯器使用時也需要修改相關(guān)的地方。
在ICCAVR中對數(shù)組和字符串的五種不同空間分配:
constunsignedcharbuffer[]={0,1,2,3,4,5};//buffer數(shù)組被分配在程序存儲區(qū)中
constunsignedcharstring[]="ARMoric";//stringp字符串被分配在程序存儲區(qū)中
constunsignedchar*pt//指針變量pt被分配在數(shù)據(jù)存儲區(qū)中,指向程序存儲區(qū)中的字符類型數(shù)據(jù)
unsignedchar*constpt//指針變量pt被分配在程序存儲區(qū)中,指向數(shù)據(jù)存儲區(qū)中的字符類型數(shù)據(jù)
constunsignedchar*constpt//指針變量pt被分配在程序存儲區(qū),指向程序存儲區(qū)中的字符類型數(shù)據(jù)
unsignedchar*pt//指針變量pt被分配在數(shù)據(jù)存儲區(qū)中,指向數(shù)據(jù)存儲區(qū)中的數(shù)據(jù)
如何將ICCAVR程序中的數(shù)組存入FLASH中下面是ICCAVR中對字符串和常數(shù)表格分配可能出現(xiàn)的五種情況:
constinttable[]={1,2,3};//table表格只分配進(jìn)程序存儲器中
constcharstring[]="iccavr";//字符串?dāng)?shù)組只分配進(jìn)程序存儲器中
constchar*prt1//指針prt1位于數(shù)據(jù)存儲器空間指向程序存儲器空間的字符型數(shù)據(jù)
char*constprt2//指針prt2位于程序存儲器空間指向數(shù)據(jù)存儲器空間的字符型數(shù)據(jù)
constchar*constprt3//指針prt3位于程序存儲器空間指向程序存儲器空間的字符型數(shù)據(jù)
實(shí)際使用中常使用前三種
在KEIL中的用法
unsignedcharcodetable[]={1,2,3,4};
unsignedcharcodea[]="keil";
在IAR中引入"flash"關(guān)鍵字,用法如下:
flashunsignedchartable[]={1,2,3,4,5};
flashunsignedchara[]="IAR";
在ICCAVR中的用法是
#pragmadata:code
constunsignedchartable[]={1,2,3};
constunsignedchara[]="ICCAVR";
#pragmadata:data