Board logo

标题: MAXQ构架上闪存和SRAM存储器的分配 [打印本页]

作者: forsuccess    时间: 2014-8-27 23:55     标题: MAXQ构架上闪存和SRAM存储器的分配

MAXQ架构是一种基于标准Harvard结构、功能强大的单周期RISC微控制器,程序和数据存储总线相互独立。这种组织形式要求每个存储器具有专用总线(图1),所以可同时读取指令和操作数。由于不存在单条数据总线的冲突问题,MAXQ指令的执行时间仅需要单个周期。

图1. Harvard结构

每个MAXQ器件采用以下存储器类型:
闪存
SRAM
固定用途ROM
MAXQ器件也可从闪存、固定用途ROM或SRAM执行程序代码。从某个存储器段执行程序代码时,其它两个存储器段可作为数据存储器(更多详细信息,请参阅从闪存执行程序和执行固定用途ROM函数部分)。这是因为程序和数据存储器总线不能同时存取同一存储器段。
有人可能认为采用Harvard结构的MAXQ微控制器也不能在非易失闪存中储存数据。然而,MAXQ器件内嵌固定用途ROM函数,允许读、写非易失闪存数据。
从闪存执行程序
MAXQ器件中,从闪存执行应用程序时,数据存储器为SRAM (读和写)和固定用途ROM (只读)。从闪存执行代码时,数据存储器映射请参见表1,存储器映射参见图2
SRAM数据存储器在存储器映射中位于地址0x0000至0x07FF (字节寻址模式下)或地址0x0000至0x03FF (字寻址模式下)。
固定用途ROM在存储器映射中位于地址0x8000至0x9FFFh (字节模式)或地址0x8000至0x8FFF (字寻址模式下)。
表1. 从闪存执行应用代码时的数据存储器映射
Addressing ModeSRAMUtility ROM
Start AddressEnd AddressStart AddressEnd Address
Byte Mode0x00000x07FF0x80000x9FFF
Word Mode0x00000x03FF0x80000x8FFF

图2. 从闪存执行应用代码时的存储器映射

执行固定用途ROM函数时,数据存储器为

SRAM

(读和写)和

闪存

(读和写)。从闪存执行应用程序且变量或数据对象位于闪存时,可通过固定用途ROM函数读或写这些变量或数据对象。通过跳转至执行固定用途ROM函数,即可将闪存作为数据进行存取。从固定用途ROM执行代码时,数据存储器映射请参见

表2

,存储器映射参见

图3


SRAM数据存储器在存储器映射中位于地址0x0000至0x07FF (字节寻址模式下)或地址0x0000至0x03FF (字寻址模式下)。
字节寻址模式下,CDA0 = 0时,闪存的低半部分在存储器映射中位于地址0x8000至0xFFFFh;CDA0 = 1时,闪存的高半部分在存储器映射中位于地址0x8000至0xFFFFh。字寻址模式下,闪存在存储器映射中位于地址0x8000至0xFFFF。
表2. 执行固定用途ROM函数时的数据存储器映射
Addressing ModeSRAMFlash Memory
Lower Half (CDA0 = 0)
Flash Memory
Upper Half (CDA0 = 1)
Flash Memory
Start AddressEnd AddressStart AddressEnd AddressStart AddressEnd AddressStart AddressEnd Address
Byte Mode0x00000x07FF0x80000xFFFF0x80000xFFFF
Word Mode0x00000x03FF0x80000xFFFF

图3. 执行固定用途ROM函数时的存储器映射

闪存和SRAM中的存储器分配
IAR嵌入式工作台IDE用于编程基于MAXQ核的微控制器。IAR™ C编译器(用于MAXQ微控制器)提供用于定义闪存或SRAM位置中数据对象或变量的选项。编译器具有特殊关键词pragma locationpragma required;通过使用关键词,可将存储器分配给绝对地址的数据对象或变量。必须用IAR关键词__no_initconst (标准C关键词)声明这些变量或数据对象。请参见下文中__no_initconstpragma locationpragma required的关键词说明。#pragma location

用于定义绝对地址的单个全局或静态变量或数据对象。变量或数据对象必须声明为

__no_init

const

。这对于必须位于固定地址的个体数据对象非常有用,例如变量、带有外部或内部接口的数据对象或增加的硬件表项。


pragma required
#pragma required确保链接输出中包括某个符号所需的另一个符号。该指令必须放在紧邻第二个符号的前边。如果符号在应用中不可见,使用该指令。例如,如果仅通过某个变量所在的段对其进行间接引用,必须使用#pragma required
__no_init
正常情况下,应用程序启动时,IAR运行时环境将全部全局和静态变量初始化为0。IAR C编译器支持声明不初始化的变量,使用__no_init类型限定符。声明为__no_init的变量在启动时被禁止。不可能为__no_init对象赋予初始值。
例如:__no_init char MaximChar @ 0x0200;
本例中,声明为__no_init的变量被放在默认数据存储器(SRAM)的一个绝对地址。
const
const关键词意味着对象为只读。这类限定符用于表示直接或通过指针存取的数据对象,不可写。当const随关键词#pragma location#pragma required一起使用时,IAR分配#pragma location定义的位置的存储器。这对于配置从外部接口进行存取的参数非常有用。这样的闪存数据只能由固定用途ROM函数读或写。
IAR默认存储器模型中,不可存取绝对地址的常量。利用选项Place constants in CODE (在IAR Project Option General Option Target 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,第二个初始化为规定值,第三个不初始化。全部三个变量均在闪存中。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0