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

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

IAR編譯器和MAXQ2000評估板入門

評論