引言
CAN Bus(Controller Area Network),控制器區(qū)域網(wǎng),起源于80年代,由國際標(biāo)準(zhǔn)化組織(ISO)所發(fā)布,因?yàn)槔秒p線差動(dòng)(two-wired differential),使其即使在電器條件惡劣環(huán)境下,也可正常運(yùn)作的一種傳輸總線。又因雙線溝通的特性,大幅縮減了其應(yīng)用線路的使用量,也降低傳統(tǒng)線路復(fù)雜易造成錯(cuò)誤的發(fā)生機(jī)會(huì)。

圖1. Harvard結(jié)構(gòu)
每個(gè)MAXQ器件采用以下存儲(chǔ)器類型:
1.閃存
2.SRAM
3.固定用途ROM
MAXQ器件也可從閃存、固定用途ROM或SRAM執(zhí)行程序代碼。從某個(gè)存儲(chǔ)器段執(zhí)行程序代碼時(shí),其它兩個(gè)存儲(chǔ)器段可作為數(shù)據(jù)存儲(chǔ)器(更多詳細(xì)信息,請(qǐng)參閱從閃存執(zhí)行程序和執(zhí)行固定用途ROM函數(shù)部分)。這是因?yàn)槌绦蚝蛿?shù)據(jù)存儲(chǔ)器總線不能同時(shí)存取同一存儲(chǔ)器段。
有人可能認(rèn)為采用Harvard結(jié)構(gòu)的MAXQ微控制器也不能在非易失閃存中儲(chǔ)存數(shù)據(jù)。然而,MAXQ器件內(nèi)嵌固定用途ROM函數(shù),允許讀、寫非易失閃存數(shù)據(jù)。
從閃存執(zhí)行程序
MAXQ器件中,從閃存執(zhí)行應(yīng)用程序時(shí),數(shù)據(jù)存儲(chǔ)器為SRAM (讀和寫)和固定用途ROM (只讀)。從閃存執(zhí)行代碼時(shí),數(shù)據(jù)存儲(chǔ)器映射請(qǐng)參見表1,存儲(chǔ)器映射參見圖2.

SRAM數(shù)據(jù)存儲(chǔ)器在存儲(chǔ)器映射中位于地址0x0000至0x07FF (字節(jié)尋址模式下)或地址0x0000至0x03FF (字尋址模式下)。
固定用途ROM在存儲(chǔ)器映射中位于地址0x8000至0x9FFFh (字節(jié)模式)或地址0x8000至0x8FFF (字尋址模式下)。

圖2. 從閃存執(zhí)行應(yīng)用代碼時(shí)的存儲(chǔ)器映射
執(zhí)行固定用途ROM函數(shù)
執(zhí)行固定用途ROM函數(shù)時(shí),數(shù)據(jù)存儲(chǔ)器為SRAM (讀和寫)和閃存(讀和寫)。從閃存執(zhí)行應(yīng)用程序且變量或數(shù)據(jù)對(duì)象位于閃存時(shí),可通過固定用途ROM函數(shù)讀或?qū)戇@些變量或數(shù)據(jù)對(duì)象。通過跳轉(zhuǎn)至執(zhí)行固定用途ROM函數(shù),即可將閃存作為數(shù)據(jù)進(jìn)行存取。從固定用途ROM執(zhí)行代碼時(shí),數(shù)據(jù)存儲(chǔ)器映射請(qǐng)參見表2,存儲(chǔ)器映射參見圖3.

1.SRAM數(shù)據(jù)存儲(chǔ)器在存儲(chǔ)器映射中位于地址0x0000至0x07FF (字節(jié)尋址模式下)或地址0x0000至0x03FF (字尋址模式下)。
2.字節(jié)尋址模式下,CDA0 = 0時(shí),閃存的低半部分在存儲(chǔ)器映射中位于地址0x8000至0xFFFFh;CDA0 = 1時(shí),閃存的高半部分在存儲(chǔ)器映射中位于地址0x8000至0xFFFFh.字尋址模式下,閃存在存儲(chǔ)器映射中位于地址0x8000至0xFFFF.

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

圖4. IAR項(xiàng)目選項(xiàng)窗口
例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
本例中,存儲(chǔ)器分配為閃存地址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
本例中,存儲(chǔ)器分配為閃存地址0xA002,不初始化。
上例中,有三個(gè)聲明為常量的對(duì)象,第一個(gè)初始化為0,第二個(gè)初始化為規(guī)定值,第三個(gè)不初始化。全部三個(gè)變量均在閃存中。
關(guān)鍵詞舉例
例1
下例中,F(xiàn)LASH_CONFIG為FlashMemoryMap結(jié)構(gòu)變量。利用關(guān)鍵詞#pragma location和#pragma required顯式定義該結(jié)構(gòu)變量的開始地址為"CONFIG_FLASH" (0xEE00)。
//Structure for Memory Map
typedef struct
{
unsigned char SYSTEM_CONFIG; //Address 0x00
unsigned char TEMP_CONFIG; //Address 0x01
unsigned char SLAVE_ADDR_A0; //Address 0x02
unsigned char NULL_A0_3; //Address 0x03
signed int INTERNAL_TEMP_THRES; //Address 0x04-5
signed int EXTERNAL_TEMP_THRES; //Address 0x06-7
signed int DS75_TEMP_THRES; //Address 0x08-9
}FlashMemoryMap;
#define CONFIG_FLASH = 0xEE00 //Flash Address
#pragma location = CONFIG_FLASH
const FlashMemoryMap FLASH_CONFIG = //Initialize data objects variable
{
0x00, // SYSTEM_CONFIG
0xFE, // TEMP_CONFIG
0xA0, // SLAVE_ADDR_A0
0x00, // NULL_A0_3
0x3200, // INTERNAL_TEMP_THRES
0x4200, // EXTERNAL_TEMP_THRES
0x5200 // DS75_TEMP_THRES
};
#pragma required = FLASH_CONFIG
為了在IAR嵌入式工作臺(tái)IDE中查看存儲(chǔ)器分配和初始化,進(jìn)入View Memory.在顯示的編輯框中,在Go to框中鍵入0xEE00,然后從下拉框中選擇Code,如圖5所示。

圖5. 存儲(chǔ)器分配
例2
下例中,在地址0x0116創(chuàng)建DATA SRAMMemoryMap結(jié)構(gòu)變量(DATA_MONITOR),該變量將被初始化(使用__no_init類型限定符)。
typedef struct
{
//Read Only
signed int INTERNAL_TEMP; //Address = OFFSET + 0x00-1
signed int EXTERNAL_TEMP; //Address = OFFSET + 0x02-3
signed int DS75_TEMP; //Address = OFFSET + 0x04-5
signed int VOLTAGE0; //Address = OFFSET + 0x06-7
signed int VOLTAGE1; //Address = OFFSET + 0x08-9
}SRAMMemoryMap;
#define CONFIG_SRAM 0x0116 //SRAM Address 0x0116
#pragma location = CONFIG_SRAM
__no_init SRAMMemoryMap DATA_MONITOR;
#pragma required = DATA_MONITOR
在IAR中調(diào)試時(shí),為了查看該結(jié)構(gòu)變量的內(nèi)容,選擇變量,點(diǎn)擊右鍵,然后選擇Add to Watch選項(xiàng),參見圖6.

圖6. IAR查看窗口
在Intel? HEX文件中查看分配的存儲(chǔ)器
可在IAR嵌入式工作臺(tái)生成的Intel HEX文件中查看在代碼存儲(chǔ)器中為數(shù)據(jù)對(duì)象分配的存儲(chǔ)器。請(qǐng)參見圖7中的高亮部分。本例中,為數(shù)據(jù)對(duì)象分配的存儲(chǔ)器為閃存中0xEE00至0xEE15.

圖7. 釋放模式下IAR生成的HEX文件
-
微控制器
+關(guān)注
關(guān)注
48文章
8427瀏覽量
164891 -
嵌入式
+關(guān)注
關(guān)注
5202文章
20516瀏覽量
335201 -
CAN
+關(guān)注
關(guān)注
59文章
3071瀏覽量
472897
發(fā)布評(píng)論請(qǐng)先 登錄
如何為嵌入式應(yīng)用選擇合適的微控制器
嵌入式相變存儲(chǔ)器在汽車微控制器中有什么優(yōu)點(diǎn)?
基于微控制器的現(xiàn)代嵌入式系統(tǒng)
嵌入式平臺(tái)上板載的微控制器是什么
嵌入式編程和微控制器應(yīng)用
采用MAXQ610評(píng)估套件(EV kit)和IAR嵌入式工作
采用MAXQ610評(píng)估套件(EV kit)和IAR嵌入式工作
MAXQ微控制器中JTAG接口引腳的復(fù)用
利用MAXQ1103微控制器產(chǎn)生RSA密鑰
MAXQ構(gòu)架上閃存和SRAM存儲(chǔ)器的分配
MAXQ1061加密控制器保護(hù)存儲(chǔ)安全
IAR編譯器和MAXQ2000評(píng)估板入門
使用IAR的嵌入式工作臺(tái)調(diào)用實(shí)用程序ROM函數(shù)用于MAXQ
如何利用IAR嵌入式工具分配和存取MAXQ微控制器的存儲(chǔ)數(shù)據(jù)
評(píng)論