SARM空間是AVR單片機(jī)最重要的部分,所有的操作必須依賴該部分來完成。變量在SARM空間的存儲(chǔ)模式有tiny,small,large 三種,也就是對(duì)應(yīng)于__tiny, __near,__far三中存儲(chǔ)屬性。一旦選擇為哪種存儲(chǔ)模式,對(duì)應(yīng)的數(shù)據(jù)默認(rèn)屬性也就確定了,但可以采用__tiny, __near,__far關(guān)鍵字來更改。
對(duì)于程序中的局部變量,編譯器會(huì)自動(dòng)處理的,我們也不可能加什么儲(chǔ)存屬性,但I(xiàn)AR提供了強(qiáng)大的外部變量定義。
IAR編譯器內(nèi)部使用了部分工作寄存器,留給用戶的只有R4-R15供12個(gè)寄存器供用戶使用,要使用工作寄存器必須在工程選項(xiàng)里打開鎖定選項(xiàng)。
例:
定義兩個(gè)變量使用工作寄存器R14,R15。
#include__regvar__no_initcharg@15;__regvar__no_initcharP@14;voidmain(void){g++;P++;}
在工程選項(xiàng)里c/c++ complier>code里打開要使用的寄存器R14-R15。
編譯結(jié)果就如下,看看是不是直接使用了寄存器做為數(shù)據(jù)應(yīng)用
//4voidmain(void)main:CFIBlockcfiBlock0UsingcfiCommon0CFIFunctionmain//5{g++;REQUIRE?Register_R14_is_global_regvarREQUIRE?Register_R15_is_global_regvarINCR15//6P++;}INCR14RET
注意:定義在寄存器里變量不能帶有初始值。最好不要使用超過9個(gè)寄存器變量,不然可能引起潛在的危險(xiǎn),因?yàn)榻斓臅r(shí)候沒有鎖定任何寄存器。
定義變量的絕對(duì)地址.沒有特性的變量是隨機(jī)分配的,要給變量分配地址必須加以特性修飾注意在定義地址的時(shí)候千萬不要和片內(nèi)寄存器地址重合了。
定義沒有存儲(chǔ)特性的絕對(duì)地址變量必須加__no_init 或者const對(duì)象特性
__no_init char t @ 0x65;//定義在I/O地址以外
const char t @ 0x65;//定義只讀變量的地址
例:
#include
__no_initcharu@0x65;voidmain(void){u++;}
對(duì)應(yīng)匯編:
voidmain(void)main:{u++;}