我选用的是GC++编译器,而且在项目中选用C++来编写程序,依据理论上来讲,只需外部存储器使能了而且装备完结,那么变量的地址分配完全可以交给编译器来做,可是条件是存储器使能及装备代码要在上电复位后最早得到履行,而选用C或许C++来编写程序,上电复位之后最早得到履行的代码是由编译器主动添加的发动代码以及结构函数代码。我不清楚怎么让存储器使能及装备代码在上电复位后最早得到履行,所以就写了下面一段宏来操控外部存储器的拜访。
代码如下:
//extern_ram.h
#ifndef _H_EXTERN_RAM_H_
#define _H_EXTERN_RAM_H_
#include “type.h”
#define DEF_EX_VAR(name) EX_VAR name;
#define INIT_EX_VAR(name,ele_size,ele_n) do{\
name.size_ele=ele_size;\
name.n_ele=ele_n;\
name.addr=p;\
p+=((ele_size)*(ele_n));\
}while(0)
#define WR_EX_VAR(name,pos,pdat) do {\
for(UINT8 iiiii=“0”;iiiii(name.addr+(pos)*name.size_ele)[iiiii]=*((INT8 *)pdat+iiiii);\
} while(0)
#define RD_EX_VAR(name,pos,pdat) do {\
for(UINT8 iiiii=“0”;iiiii*((INT8 *)pdat+iiiii)=((INT8 *)(name.addr+(pos)*name.size_ele))[iiiii];\
} while(0);
#define GET_P_EX_VAR(name,pos) (name.addr+(pos)*name.size_ele)
typedef struct _tag_ex_var
{
UINT8 size_ele;
UINT16 n_ele;
INT8 *addr;
} EX_VAR;
#endif
使用示例
//main.cpp
#include “includes.h”
INT8 *p=(INT8*)0x3100;//外部RAM的地址从0X3100开端
DEF_EX_VAR(test);//界说一个外部变量
INT16 main(void)
{
UINT8 i;
INT16 tmp;
INT16 *p_ele;
MCUCR|=0X80;//使能XRAM,并配制成最快速度拜访
INIT_EX_VAR(test,sizeof(INT16),100);//外部变量初始化,该变量有100个元素,元素巨细为sizeof(INT16)
tmp=“0xaaaa”;
for(i=0;i《100;i++)
{
WR_EX_VAR(test,i,&tmp);//写示例,对变量test的一切元素都赋值为0Xaaaa
}
for(i=0;i《100;i++)
{
RD_EX_VAR(test,i,&tmp);//读示例
}
p_ele=( INT16 *)GET_P_EX_VAR(test,32);//获取变量test的第32个元素的指针
while(1);
return 0x00;
}