新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > IAR for AVR 學(xué)習(xí)筆記(5)--SRAM操作

IAR for AVR 學(xué)習(xí)筆記(5)--SRAM操作

作者: 時間:2016-11-13 來源:網(wǎng)絡(luò) 收藏
SARM數(shù)據(jù)類型的具體操作方法

SARM空間是AVR單片機(jī)最重要的部分,所有的操作必須依賴該部分來完成。變量在SARM空間的存儲模式有tiny ,small large 三種,也就是對應(yīng)于__tiny, __near __far三中存儲屬性。一旦選擇為哪種存儲模式,對應(yīng)的數(shù)據(jù)默認(rèn)屬性也就確定了,但可以采用__tiny, __near __far關(guān)鍵字來更改。
對于程序中的局部變量,編譯器會自動處理的,我們也不可能加什么儲存屬性,但IAR提供了強(qiáng)大的外部變量定義。

本文引用地址:http://butianyuan.cn/article/201611/316460.htm

5.1.定義變量在工作寄存器
IAR編譯器內(nèi)部使用了部分工作寄存器,留給用戶的只有R4-R15供12個寄存器供用戶使用,要使用工作寄存器必須在工程選項(xiàng)里打開鎖定選項(xiàng)。
例:
定義兩個變量使用工作寄存器R14,R15。
#i nclude
__regvar __no_init char g @ 15;
__regvar __no_init char P @ 14;
void main(void)
{
g++;
P++;
}
在工程選項(xiàng)里c/c++ complier>code里打開要使用的寄存器R14-R15。


編譯結(jié)果就如下,看看是不是直接使用了寄存器做為數(shù)據(jù)應(yīng)用
// 4 void main(void)
main:
CFI Block cfiBlock0 Using cfiCommon0
CFI Function main
// 5 { g++;
REQUIRE ?Register_R14_is_global_regvar
REQUIRE ?Register_R15_is_global_regvar
INC R15
// 6 P++; }
INC R14
RET
注意:定義在寄存器里變量不能帶有初始值。最好不要使用超過9個寄存器變量,不然可能引起潛在的危險,因?yàn)榻斓臅r候沒有鎖定任何寄存器。

5.2.定義變量的絕對地址.沒有特性的變量是隨機(jī)分配的,要給變量分配地址必須加以特性修飾注意在定義地址的時候千萬不要和片內(nèi)寄存器地址重合了。
5.2.1定義沒有存儲特性的絕對地址變量必須加__no_init 或者const對象特性
__no_init char t @ 0x65;//定義在I/O地址以外
const char t @ 0x65;//定義只讀變量的地址
例:
#i nclude
__no_init char u @ 0x65 ;
void main(void)
{u++;}
對應(yīng)匯編:
void main(void)
main:
{u++;}
00000000 E6E5 LDI R30, 101
00000002 E0F0 LDI R31, 0
00000004 8100 LD R16, Z
00000006 9503 INC R16
00000008 8300 ST Z, R16
0000000A 9508 RET
5.2.2帶存儲特性的關(guān)鍵字定義變量的絕對地址__io,__ext_io定義變量在i/o空間
#i nclude
__io char u @ 0x65 ;
void main(void)
{u++;}
對應(yīng)匯編:
void main(void)
main:
{u++;}
00000000 91000065 LDS R16, 101
00000004 9503 INC R16
00000006 93000065 STS 101, R16
0000000A 9508 RET
從5.2.1和5.2.2對比,發(fā)現(xiàn)用5.2.2方法定義代碼小多了。


5.3.關(guān)鍵字volatile保證從最原始的位置讀取變量。在IAR編譯器里,除了__no_init和__root定義的變量外,其他的類型的變量都包含有volatile和__no_init特性



關(guān)鍵詞: IARAVRSRAM操

評論


技術(shù)專區(qū)

關(guān)閉