MAXQ构架上闪存和SRAM存储器的分配

2013-05-25 20:40:20来源: 互联网

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 Mode SRAM Utility ROM
Start Address End Address Start Address End Address
Byte Mode 0x0000 0x07FF 0x8000 0x9FFF
Word Mode 0x0000 0x03FF 0x8000 0x8FFF


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

执行固定用途ROM函数

执行固定用途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 Mode SRAM Flash Memory
Lower Half (CDA0 = 0)
Flash Memory
Upper Half (CDA0 = 1)
Flash Memory
Start Address End Address Start Address End Address Start Address End Address Start Address End Address
Byte Mode 0x0000 0x07FF 0x8000 0xFFFF 0x8000 0xFFFF
Word Mode 0x0000 0x03FF 0x8000 0xFFFF


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

闪存和SRAM中的存储器分配

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

pragma location

#pragma location用于定义绝对地址的单个全局或静态变量或数据对象。变量或数据对象必须声明为__no_initconst。这对于必须位于固定地址的个体数据对象非常有用,例如变量、带有外部或内部接口的数据对象或增加的硬件表项。

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,第二个初始化为规定值,第三个不初始化。全部三个变量均在闪存中。

关键字:MAXQ  闪存  SRAM存储器

编辑:神话 引用地址:http://www.eeworld.com.cn/mndz/2013/0525/article_18598.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
MAXQ
闪存
SRAM存储器

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved