MAXQ器件提供特殊的实用ROM功能,调用ROM功能从程序存储器读写数据。但是,存储在程序存储器中的数据不能直接在MAXQ微控制器上访问。相反,实用程序ROM函数的起始地址集成在IAR嵌入式工作台中,以访问存储的数据。本应用笔记演示如何使用IAR嵌入式工作台工具在MAXQ微控制器上分配和访问闪存和SRAM存储器。
介绍
MAXQ架构描述了一个基于经典哈佛架构的强大单周期RISC微控制器,其中程序和数据存储器总线是分开的。这种组织需要为每个存储器提供专用总线(图1),因此可以同时获取指令和操作数。由于不存在对单个数据总线的争用,MAXQ指令只能在一个周期内执行。
图1.哈佛建筑。
每个MAXQ器件包含以下存储器类型:
闪存
SRAM
实用ROM
MAXQ器件还可以从闪存、实用程序ROM或SRAM执行程序代码。从一个存储器段执行程序代码时,其他两个存储器段可用作数据存储器(有关更多详细信息,请参阅从闪存执行程序和执行实用程序ROM功能部分。这是因为程序和数据存储器总线不能同时访问同一存储器段。
作为哈佛的机器,人们可能会认为MAXQ微控制器禁止将数据元件存储到非易失性闪存中。但是,MAXQ器件设计有内置的实用程序ROM功能,允许在非易失性闪存中读取和写入数据。
从闪存执行程序
在MAXQ器件中,当应用程序从闪存中执行时,数据存储器是SRAM(读写)和实用程序ROM(只读)。从闪存执行代码时,请参阅表1了解数据存储器映射,有关存储器映射,请参阅图2。
SRAM数据存储器位于从地址0x0000到0x07FF(在字节寻址模式下)或从地址0x0000到0x03FF(在字寻址模式下)的存储器映射中。
实用程序ROM位于从地址0x8000到0x9FFFh(字节模式)或从地址0x8000到0x8FFF(字寻址模式)的内存映射中。
寻址模式 | SRAM | 实用ROM | ||
起始地址 | 结束地址 | 起始地址 | 结束地址 | |
字节模式 | 0x0000 | 0x07FF | 0x8000 | 0x9FFF |
字模式 | 0x0000 | 0x03FF | 0x8000 | 0x8FFF |
图2.应用程序从闪存执行代码时的内存映射。
执行实用程序 ROM 函数
执行实用程序ROM功能时,数据存储器是SRAM(读取和写入)和闪存(读取和写入)。当应用程序从闪存执行并在闪存中分配变量或数据对象时,可以通过实用程序ROM函数读取或写入这些变量或数据对象。通过将程序执行跳转到实用程序ROM功能,现在可以将闪存作为数据进行访问。从实用程序ROM执行代码时,请参阅表2以获取数据存储器映射,有关存储器映射,请参阅图3。
SRAM数据存储器位于从地址0x0000到0x07FF(在字节寻址模式下)或从地址0x0000到0x03FF(在字寻址模式下)的存储器映射中。
在字节寻址模式下,当CDA0 = 8000时,闪存的下半部分位于从地址0x0到0xFFFFh的内存映射中,当CDA0 = 8000时,闪存的上半部分位于从地址0x0到1xFFFFh的内存映射中。在字寻址模式下,闪存位于从地址0x8000到0xFFFF的存储器映射中。
寻址模式 | SRAM |
闪存下半部分 (CDA0 = 0) |
闪存上半部分 (CDA0 = 1) |
闪存 | ||||
起始地址 | 结束地址 | 起始地址 | 结束地址 | 起始地址 | 结束地址 | 起始地址 | 结束地址 | |
字节模式 | 0x0000 | 0x07FF | 0x8000 | 0xFFFF | 0x8000 | 0xFFFF | — | — |
字模式 | 0x0000 | 0x03FF | — | — | — | — | 0x8000 | 0xFFFF |
图3.执行实用程序 ROM 功能时的内存映射。
闪存和SRAM中的内存分配
IAR嵌入式工作台IDE用于编程基于MAXQ内核的微控制器。IAR™ C编译器(用于MAXQ微控制器)提供了在闪存或SRAM位置定义数据对象或变量的选项。编译器具有特殊的关键字杂注位置和所需的杂注;通过使用这些关键字,可以将内存分配给绝对地址处的数据对象或变量。这些变量或数据对象必须使用 IAR 关键字 __no_init 或 const(标准 C 关键字)声明。请参阅下面所需__no_init、常量、杂注位置和所需程序的关键字说明。
关键字描述
杂注位置
#pragma location 关键字用于将单个全局或静态变量或数据对象放置在绝对地址处。变量或数据对象必须声明为 __no_init 或 const。这对于必须位于固定地址的单个数据对象非常有用,例如变量、具有外部或内部接口的数据对象或填充硬件表。
需要编译指示
所需的#pragma可确保链接输出中包含另一个符号所需的符号。指令必须放在第二个符号之前。如果对符号的要求在应用程序中不可见,请使用该指令。例如,如果变量仅通过其所在的段间接引用,则必须使用必需#pragma。
__no_init
通常,IAR 运行时环境会在应用程序启动时将所有全局变量和静态变量初始化为 0。IAR C 编译器支持使用 __no_init 类型修饰符声明不会初始化的变量。使用 __no_init 声明的变量在启动时被禁止显示。无法为__no_init对象指定初始值。
示例:__no_init字符马克西姆查尔@0x0200;
在此示例中,声明__no_init变量放置在默认数据存储器 (SRAM) 中的绝对地址。
常量
const 关键字表示对象是只读的。这种类型的限定符用于指示直接或通过指针访问的数据对象是不可写的。当 const 与关键字 #pragma 位置一起使用并且需要#pragma时,IAR 会在#pragma位置定义的位置分配内存。这对于可从外部接口访问的配置参数非常有用。此类闪存数据对象只能由实用程序ROM功能读取或写入。
放置在绝对地址的常量变量在 IAR 的默认内存模型中不可访问。使用选项“在 CODE 中放置常量”(在 IAR 项目选项“常规选项 目标”窗口中)使其可访问,如图 4 所示。
图4.IAR 项目选项窗口。
例 1
const int FLASH_DATA0;
//FLASH_DATA0 初始化为 0x0000,链接器将分配内存地址。
例 2
#pragma位置 = 0xA000
常量整数 FLASH_DATA1 = 0x1234;
所需#pragma = 此处FLASH_DATA1
内存在闪存地址 0xA000 处分配并初始化为 0x1234。
例 3
#pragma位置 = 0xA002
__no_init const int FLASH_DATA2 //内存在地址0xA002(字节地址)
处分配#pragma所需的 = FLASH_DATA2
此处,内存在闪存地址0xA002分配,无需初始化。
在上面的示例中,有三个 const 声明的对象,其中第一个初始化为零,第二个初始化为特定值,第三个未初始化。所有三个变量都放置在闪存中。
审核编辑:郭婷
全部0条评论
快来发表一下你的评论吧 !