MAXQ構(gòu)架上閃存和SRAM存儲器的分配
圖3. 執(zhí)行固定用途ROM函數(shù)時的存儲器映射
閃存和SRAM中的存儲器分配
IAR嵌入式工作臺IDE用于編程基于MAXQ核的微控制器。IAR? C編譯器(用于MAXQ微控制器)提供用于定義閃存或SRAM位置中數(shù)據(jù)對象或變量的選項。編譯器具有特殊關(guān)鍵詞pragma location和pragma required;通過使用關(guān)鍵詞,可將存儲器分配給絕對地址的數(shù)據(jù)對象或變量。必須用IAR關(guān)鍵詞__no_init或const(標(biāo)準(zhǔn)C關(guān)鍵詞)聲明這些變量或數(shù)據(jù)對象。請參見下文中__no_init、const、pragma location和pragma required的關(guān)鍵詞說明。
pragma location
#pragma location用于定義絕對地址的單個全局或靜態(tài)變量或數(shù)據(jù)對象。變量或數(shù)據(jù)對象必須聲明為__no_init或const。這對于必須位于固定地址的個體數(shù)據(jù)對象非常有用,例如變量、帶有外部或內(nèi)部接口的數(shù)據(jù)對象或增加的硬件表項。
pragma required
#pragma required確保鏈接輸出中包括某個符號所需的另一個符號。該指令必須放在緊鄰第二個符號的前邊。如果符號在應(yīng)用中不可見,使用該指令。例如,如果僅通過某個變量所在的段對其進行間接引用,必須使用#pragma required。
__no_init
正常情況下,應(yīng)用程序啟動時,IAR運行時環(huán)境將全部全局和靜態(tài)變量初始化為0。IAR C編譯器支持聲明不初始化的變量,使用__no_init類型限定符。聲明為__no_init的變量在啟動時被禁止。不可能為__no_init對象賦予初始值。
例如:__no_init char MaximChar @ 0x0200;
本例中,聲明為__no_init的變量被放在默認(rèn)數(shù)據(jù)存儲器(SRAM)的一個絕對地址。
const
const關(guān)鍵詞意味著對象為只讀。這類限定符用于表示直接或通過指針存取的數(shù)據(jù)對象,不可寫。當(dāng)const隨關(guān)鍵詞#pragma location和#pragma required一起使用時,IAR分配#pragma location定義的位置的存儲器。這對于配置從外部接口進行存取的參數(shù)非常有用。這樣的閃存數(shù)據(jù)只能由固定用途ROM函數(shù)讀或?qū)憽?/P>
IAR默認(rèn)存儲器模型中,不可存取絕對地址的常量。利用選項Place constants in CODE (在IAR ProjectOptionGeneral OptionTarget window)使其可存取,如圖4所示。
圖4. IAR項目選項窗口
例1
const int FLASH_DATA0;
//FLASH_DATA0 is initialized to 0x0000 and linker will allocate memory address.
例2
#pragma location = 0xA000
const int FLASH_DATA1 = 0x1234;
#pragma required = FLASH_DATA1
本例中,存儲器分配為閃存地址0xA000,初始化為0x1234。
例3
#pragma location = 0xA002
__no_init const int FLASH_DATA2 //Memory is allocated at the address 0xA002 (byte address)
#pragma required = FLASH_DATA2
本例中,存儲器分配為閃存地址0xA002,不初始化。
上例中,有三個聲明為常量的對象,第一個初始化為0,第二個初始化為規(guī)定值,第三個不初始化。全部三個變量均在閃存中。
評論