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