应用笔记 5262

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

By: Sanjay Jaroli

摘要 : 通过调用读、写程序存储器,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 (字寻址模式下)。
  2. 固定用途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. 从闪存执行应用代码时的存储器映射
图2. 从闪存执行应用代码时的存储器映射

执行固定用途ROM函数

执行固定用途ROM函数时,数据存储器为SRAM (读和写)和闪存(读和写)。从闪存执行应用程序且变量或数据对象位于闪存时,可通过固定用途ROM函数读或写这些变量或数据对象。通过跳转至执行固定用途ROM函数,即可将闪存作为数据进行存取。从固定用途ROM执行代码时,数据存储器映射请参见表2,存储器映射参见图3
  1. SRAM数据存储器在存储器映射中位于地址0x0000至0x07FF (字节寻址模式下)或地址0x0000至0x03FF (字寻址模式下)。
  2. 字节寻址模式下,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函数时的存储器映射
图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项目选项窗口
图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文件

示例代码

提供的示例代码中包含演示如何在闪存和SRAM中为变量分配存储器的文件,并演示如何读、写闪存中的变量。提供的文件有:
  1. main.c演示读、写闪存。
  2. memory.h演示在闪存和SRAM中创建数据对象及初始化。该文件使用__no_initconstpragma locationpragma required关键词。
  3. flash.c包括闪存读、写函数(C函数)。这些函数调用assembly.asm文件中定义的汇编函数。
  4. flash.h说明闪存读、写函数原型。这些函数在flash.cassembly.asm中定义。
  5. assembly.asm具有各种读、写闪存的汇编函数。全部函数提供固定用途ROM函数调用。
下一步
EE-Mail 订阅EE-Mail,接收关于您感兴趣的新文档的自动通知。
© , Maxim Integrated Products, Inc.
The content on this webpage is protected by copyright laws of the United States and of foreign countries. For requests to copy this content, contact us.
APP 5262:
应用笔记 5262,AN5262, AN 5262, APP5262, Appnote5262, Appnote 5262