利用IAR编译器分配MAXQ®微控制器上的闪存和SRAM存储器

出处:中华龙 发布于:2012-06-25 09:37:25

  摘要:通过调用读、写程序存储器,MAXQ器件提供特殊的固定用途ROM函数。然而,在MAXQ微控制器上无法直接存取储存在程序存储器中的数据。固定用途ROM函数起始地址集成在IAR Embedded Workbench?,以存取储存的数据。本应用笔记介绍如何利用IAR嵌入式工作台工具分配和存取MAXQ微控制器上的闪存和SRAM存储器。

  引言

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

图1. Harvard结构

图1. Harvard结构

  每个MAXQ器件采用以下存储器类型:

  1.闪存

  2.SRAM

  3.固定用途ROM

  MAXQ器件也可从闪存、固定用途ROM或SRAM执行程序代码。从某个存储器段执行程序代码时,其它两个存储器段可作为数据存储器(更多详细信息,请参阅从闪存执行程序和执行固定用途ROM函数部分)。这是因为程序和数据存储器总线不能同时存取同一存储器段。

  有人可能认为采用Harvard结构的MAXQ微控制器也不能在非易失闪存中储存数据。然而,MAXQ器件内嵌固定用途ROM函数,允许读、写非易失闪存数据。

  从闪存执行程序

  MAXQ器件中,从闪存执行应用程序时,数据存储器为SRAM (读和写)和固定用途ROM (只读)。从闪存执行代码时,数据存储器映射请参见表1,存储器映射参见图2.

表1. 从闪存执行应用代码时的数据存储器映射

  SRAM数据存储器在存储器映射中位于地址0x0000至0x07FF (字节寻址模式下)或地址0x0000至0x03FF (字寻址模式下)。

  固定用途ROM在存储器映射中位于地址0x8000至0x9FFFh (字节模式)或地址0x8000至0x8FFF (字寻址模式下)。

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

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

  执行固定用途ROM函数

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

表2. 执行固定用途ROM函数时的数据存储器映射

  1.SRAM数据存储器在存储器映射中位于地址0x0000至0x07FF (字节寻址模式下)或地址0x0000至0x03FF (字寻址模式下)。

  2.字节寻址模式下,CDA0 = 0时,闪存的低半部分在存储器映射中位于地址0x8000至0xFFFFh;CDA0 = 1时,闪存的高半部分在存储器映射中位于地址0x8000至0xFFFFh.字寻址模式下,闪存在存储器映射中位于地址0x8000至0xFFFF.

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

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

  闪存和SRAM中的存储器分配

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

  关键词说明

  pragma location

  #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项目选项窗口

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

  关键词举例

  例1

  下例中,FLASH_CONFIG为FlashMemoryMap结构变量。利用关键词#pragma location和#pragma required显式定义该结构变量的开始地址为"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嵌入式工作台IDE中查看存储器分配和初始化,进入View  Memory.在显示的编辑框中,在Go to框中键入0xEE00,然后从下拉框中选择Code,如图5所示。

图5. 存储器分配

图5. 存储器分配

  例2

  下例中,在地址0x0116创建DATA SRAMMemoryMap结构变量(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中调试时,为了查看该结构变量的内容,选择变量,点击右键,然后选择Add to Watch选项,参见图6.

图6. IAR查看窗口

图6. IAR查看窗口

  在Intel? HEX文件中查看分配的存储器

  可在IAR嵌入式工作台生成的Intel HEX文件中查看在代码存储器中为数据对象分配的存储器。请参见图7中的高亮部分。本例中,为数据对象分配的存储器为闪存中0xEE00至0xEE15.

图7. 释放模式下IAR生成的HEX文件

图7. 释放模式下IAR生成的HEX文件

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!