如何利用IAR嵌入式工具分配和存取MAXQ微控制器的存储数据

引言
can bus(controller area network),控制器区域网,起源于80年代,由国际标准化组织(iso)所发布,因为利用双线差动(two-wired differential),使其即使在电器条件恶劣环境下,也可正常运作的一种传输总线。又因双线沟通的特性,大幅缩减了其应用线路的使用量,也降低传统线路复杂易造成错误的发生机会。
图1. harvard结构
每个maxq器件采用以下存储器类型:
1.闪存
2.sram
3.固定用途rom
maxq器件也可从闪存、固定用途rom或sram执行程序代码。从某个存储器段执行程序代码时,其它两个存储器段可作为数据存储器(更多详细信息,请参阅从闪存执行程序和执行固定用途rom函数部分)。这是因为程序和数据存储器总线不能同时存取同一存储器段。
有人可能认为采用harvard结构的maxq微控制器也不能在非易失闪存中储存数据。然而,maxq器件内嵌固定用途rom函数,允许读、写非易失闪存数据。
从闪存执行程序
maxq器件中,从闪存执行应用程序时,数据存储器为sram (读和写)和固定用途rom (只读)。从闪存执行代码时,数据存储器映射请参见表1,存储器映射参见图2.
sram数据存储器在存储器映射中位于地址0x0000至0x07ff (字节寻址模式下)或地址0x0000至0x03ff (字寻址模式下)。
固定用途rom在存储器映射中位于地址0x8000至0x9fffh (字节模式)或地址0x8000至0x8fff (字寻址模式下)。
图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.
图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项目选项窗口
例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. 存储器分配
例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查看窗口
在intel? hex文件中查看分配的存储器
可在iar嵌入式工作台生成的intel hex文件中查看在代码存储器中为数据对象分配的存储器。请参见图7中的高亮部分。本例中,为数据对象分配的存储器为闪存中0xee00至0xee15.
图7. 释放模式下iar生成的hex文件

OLED结构、发光原理简述
详谈接地变压器的原理和作用
Pico推Corvil电子交易数据仓库 TDK开发陷波滤波器
发光二极管电压是多少 如何计算发光二极管电压
vivoX9对比美图M6,不比照相比颜值你更爱谁?
如何利用IAR嵌入式工具分配和存取MAXQ微控制器的存储数据
如何先人一步经济高效地扩展5G毫米波段?(一)
北京赛斯维压电薄膜传感器系列介绍
普源DG4162信号发生器的产品功能和参数介绍
人工智能界的大佬 这些才是真正的大牛
锂离子电池组内短路保护
房地产,校园,工业等行业运用vr仿真技术有什么作用
灵犀微光加入阿里云元宇宙加速器,携手布局AR产业化应用落地
LT6711GX 是具 PD 控制器的 HDMI2.1 至 DP1.4a 转换器
为什么数字信号的音频能够保持保真度
DC电源模块:提升效率,降低能耗的利器
烽火通信2017年营收210.56亿增长21.28% 三年翻番百亿增长
雷达水位计的工作原理是什么
智能母线系统在数据中心末端供电的应用
Wave Alchemy 发布免费的鼓采样包 Evolve