MAXQ器件提供特殊的實(shí)用ROM功能,調(diào)用ROM功能從程序存儲(chǔ)器讀寫數(shù)據(jù)。但是,存儲(chǔ)在程序存儲(chǔ)器中的數(shù)據(jù)不能直接在MAXQ微控制器上訪問。相反,實(shí)用程序ROM函數(shù)的起始地址集成在IAR嵌入式工作臺(tái)中,以訪問存儲(chǔ)的數(shù)據(jù)。本應(yīng)用筆記演示如何使用IAR嵌入式工作臺(tái)工具在MAXQ微控制器上分配和訪問閃存和SRAM存儲(chǔ)器。
介紹
MAXQ架構(gòu)描述了一個(gè)基于經(jīng)典哈佛架構(gòu)的強(qiáng)大單周期RISC微控制器,其中程序和數(shù)據(jù)存儲(chǔ)器總線是分開的。這種組織需要為每個(gè)存儲(chǔ)器提供專用總線(圖1),因此可以同時(shí)獲取指令和操作數(shù)。由于不存在對(duì)單個(gè)數(shù)據(jù)總線的爭(zhēng)用,MAXQ指令只能在一個(gè)周期內(nèi)執(zhí)行。
圖1.哈佛建筑。
每個(gè)MAXQ器件包含以下存儲(chǔ)器類型:
閃存
SRAM
實(shí)用ROM
MAXQ器件還可以從閃存、實(shí)用程序ROM或SRAM執(zhí)行程序代碼。從一個(gè)存儲(chǔ)器段執(zhí)行程序代碼時(shí),其他兩個(gè)存儲(chǔ)器段可用作數(shù)據(jù)存儲(chǔ)器(有關(guān)更多詳細(xì)信息,請(qǐng)參閱從閃存執(zhí)行程序和執(zhí)行實(shí)用程序ROM功能部分。這是因?yàn)槌绦蚝蛿?shù)據(jù)存儲(chǔ)器總線不能同時(shí)訪問同一存儲(chǔ)器段。
作為哈佛的機(jī)器,人們可能會(huì)認(rèn)為MAXQ微控制器禁止將數(shù)據(jù)元件存儲(chǔ)到非易失性閃存中。但是,MAXQ器件設(shè)計(jì)有內(nèi)置的實(shí)用程序ROM功能,允許在非易失性閃存中讀取和寫入數(shù)據(jù)。
從閃存執(zhí)行程序
在MAXQ器件中,當(dāng)應(yīng)用程序從閃存中執(zhí)行時(shí),數(shù)據(jù)存儲(chǔ)器是SRAM(讀寫)和實(shí)用程序ROM(只讀)。從閃存執(zhí)行代碼時(shí),請(qǐng)參閱表1了解數(shù)據(jù)存儲(chǔ)器映射,有關(guān)存儲(chǔ)器映射,請(qǐng)參閱圖2。
SRAM數(shù)據(jù)存儲(chǔ)器位于從地址0x0000到0x07FF(在字節(jié)尋址模式下)或從地址0x0000到0x03FF(在字尋址模式下)的存儲(chǔ)器映射中。
實(shí)用程序ROM位于從地址0x8000到0x9FFFh(字節(jié)模式)或從地址0x8000到0x8FFF(字尋址模式)的內(nèi)存映射中。
尋址模式 | SRAM | 實(shí)用ROM | ||
起始地址 | 結(jié)束地址 | 起始地址 | 結(jié)束地址 | |
字節(jié)模式 | 0x0000 | 0x07FF | 0x8000 | 0x9FFF |
字模式 | 0x0000 | 0x03FF | 0x8000 | 0x8FFF |
圖2.應(yīng)用程序從閃存執(zhí)行代碼時(shí)的內(nèi)存映射。
執(zhí)行實(shí)用程序 ROM 函數(shù)
執(zhí)行實(shí)用程序ROM功能時(shí),數(shù)據(jù)存儲(chǔ)器是SRAM(讀取和寫入)和閃存(讀取和寫入)。當(dāng)應(yīng)用程序從閃存執(zhí)行并在閃存中分配變量或數(shù)據(jù)對(duì)象時(shí),可以通過(guò)實(shí)用程序ROM函數(shù)讀取或?qū)懭脒@些變量或數(shù)據(jù)對(duì)象。通過(guò)將程序執(zhí)行跳轉(zhuǎn)到實(shí)用程序ROM功能,現(xiàn)在可以將閃存作為數(shù)據(jù)進(jìn)行訪問。從實(shí)用程序ROM執(zhí)行代碼時(shí),請(qǐng)參閱表2以獲取數(shù)據(jù)存儲(chǔ)器映射,有關(guān)存儲(chǔ)器映射,請(qǐng)參閱圖3。
SRAM數(shù)據(jù)存儲(chǔ)器位于從地址0x0000到0x07FF(在字節(jié)尋址模式下)或從地址0x0000到0x03FF(在字尋址模式下)的存儲(chǔ)器映射中。
在字節(jié)尋址模式下,當(dāng)CDA0 = 8000時(shí),閃存的下半部分位于從地址0x0到0xFFFFh的內(nèi)存映射中,當(dāng)CDA0 = 8000時(shí),閃存的上半部分位于從地址0x0到1xFFFFh的內(nèi)存映射中。在字尋址模式下,閃存位于從地址0x8000到0xFFFF的存儲(chǔ)器映射中。
尋址模式 | SRAM |
閃存下半部分 (CDA0 = 0) |
閃存上半部分 (CDA0 = 1) |
閃存 | ||||
起始地址 | 結(jié)束地址 | 起始地址 | 結(jié)束地址 | 起始地址 | 結(jié)束地址 | 起始地址 | 結(jié)束地址 | |
字節(jié)模式 | 0x0000 | 0x07FF | 0x8000 | 0xFFFF | 0x8000 | 0xFFFF | — | — |
字模式 | 0x0000 | 0x03FF | — | — | — | — | 0x8000 | 0xFFFF |
圖3.執(zhí)行實(shí)用程序 ROM 功能時(shí)的內(nèi)存映射。
閃存和SRAM中的內(nèi)存分配
IAR嵌入式工作臺(tái)IDE用于編程基于MAXQ內(nèi)核的微控制器。IAR? C編譯器(用于MAXQ微控制器)提供了在閃存或SRAM位置定義數(shù)據(jù)對(duì)象或變量的選項(xiàng)。編譯器具有特殊的關(guān)鍵字雜注位置和所需的雜注;通過(guò)使用這些關(guān)鍵字,可以將內(nèi)存分配給絕對(duì)地址處的數(shù)據(jù)對(duì)象或變量。這些變量或數(shù)據(jù)對(duì)象必須使用 IAR 關(guān)鍵字 __no_init 或 const(標(biāo)準(zhǔn) C 關(guān)鍵字)聲明。請(qǐng)參閱下面所需__no_init、常量、雜注位置和所需程序的關(guān)鍵字說(shuō)明。
關(guān)鍵字描述
雜注位置
#pragma location 關(guān)鍵字用于將單個(gè)全局或靜態(tài)變量或數(shù)據(jù)對(duì)象放置在絕對(duì)地址處。變量或數(shù)據(jù)對(duì)象必須聲明為 __no_init 或 const。這對(duì)于必須位于固定地址的單個(gè)數(shù)據(jù)對(duì)象非常有用,例如變量、具有外部或內(nèi)部接口的數(shù)據(jù)對(duì)象或填充硬件表。
需要編譯指示
所需的#pragma可確保鏈接輸出中包含另一個(gè)符號(hào)所需的符號(hào)。指令必須放在第二個(gè)符號(hào)之前。如果對(duì)符號(hào)的要求在應(yīng)用程序中不可見,請(qǐng)使用該指令。例如,如果變量?jī)H通過(guò)其所在的段間接引用,則必須使用必需#pragma。
__no_init
通常,IAR 運(yùn)行時(shí)環(huán)境會(huì)在應(yīng)用程序啟動(dòng)時(shí)將所有全局變量和靜態(tài)變量初始化為 0。IAR C 編譯器支持使用 __no_init 類型修飾符聲明不會(huì)初始化的變量。使用 __no_init 聲明的變量在啟動(dòng)時(shí)被禁止顯示。無(wú)法為__no_init對(duì)象指定初始值。
示例:__no_init字符馬克西姆查爾@0x0200;
在此示例中,聲明__no_init變量放置在默認(rèn)數(shù)據(jù)存儲(chǔ)器 (SRAM) 中的絕對(duì)地址。
常量
const 關(guān)鍵字表示對(duì)象是只讀的。這種類型的限定符用于指示直接或通過(guò)指針訪問的數(shù)據(jù)對(duì)象是不可寫的。當(dāng) const 與關(guān)鍵字 #pragma 位置一起使用并且需要#pragma時(shí),IAR 會(huì)在#pragma位置定義的位置分配內(nèi)存。這對(duì)于可從外部接口訪問的配置參數(shù)非常有用。此類閃存數(shù)據(jù)對(duì)象只能由實(shí)用程序ROM功能讀取或?qū)懭搿?/p>
放置在絕對(duì)地址的常量變量在 IAR 的默認(rèn)內(nèi)存模型中不可訪問。使用選項(xiàng)“在 CODE 中放置常量”(在 IAR 項(xiàng)目選項(xiàng)“常規(guī)選項(xiàng)
目標(biāo)”窗口中)使其可訪問,如圖 4 所示。
圖4.IAR 項(xiàng)目選項(xiàng)窗口。
例 1
const int FLASH_DATA0;
//FLASH_DATA0 初始化為 0x0000,鏈接器將分配內(nèi)存地址。
例 2
#pragma位置 = 0xA000
常量整數(shù) FLASH_DATA1 = 0x1234;
所需#pragma = 此處FLASH_DATA1
內(nèi)存在閃存地址 0xA000 處分配并初始化為 0x1234。
例 3
#pragma位置 = 0xA002
__no_init const int FLASH_DATA2 //內(nèi)存在地址0xA002(字節(jié)地址)
處分配#pragma所需的 = FLASH_DATA2
此處,內(nèi)存在閃存地址0xA002分配,無(wú)需初始化。
在上面的示例中,有三個(gè) const 聲明的對(duì)象,其中第一個(gè)初始化為零,第二個(gè)初始化為特定值,第三個(gè)未初始化。所有三個(gè)變量都放置在閃存中。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7872瀏覽量
153488 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7617瀏覽量
166076 -
編譯器
+關(guān)注
關(guān)注
1文章
1653瀏覽量
49773
發(fā)布評(píng)論請(qǐng)先 登錄
帶有紅外收發(fā)器的高性能16位RISC微控制器
MAXQ微控制器中JTAG接口引腳的復(fù)用
在應(yīng)用編程MAXQ微控制器中可分區(qū)擦除的程序和數(shù)據(jù)閃存

在MAXQ8913微控制器中從RAM執(zhí)行應(yīng)用程序

如何分配IAR編譯器上的MAX微控制器閃存和SRAM內(nèi)存

MAXQ構(gòu)架上閃存和SRAM存儲(chǔ)器的分配

快閃存儲(chǔ)器控制器選擇技巧
什么是微控制器?如何編程微控制器?
MAXQ微控制器上的多路復(fù)用JTAG接口引腳
在MAXQ2000數(shù)據(jù)存儲(chǔ)器中實(shí)現(xiàn)軟堆棧
從MAXQ8913微控制器上的RAM執(zhí)行應(yīng)用代碼

IAR編譯器和MAXQ2000評(píng)估板入門

評(píng)論