关键词:51单片机,Keil, C语言编程,xdata, 片外数据存储器, XRAM存放结构体的问题。

是这样的,本人以前一直做硬件设计,最近一年才接触单片机的硬件和编程设计,昨天在程序设计中,发现一个怪现象,就是,我程序里定义了一个结构体数据类型,如下定义:
typedef struct Calender
{
unsigned char Minute;
unsigned char Hour;
unsigned char Date;
unsigned char Month;
unsigned short Year;
}CALENDER;

CALENDER Calndr1;
CALENDER Calndr_Temp;

并且声明了两个个变量,Calndr1 和 Calndr_Temp,后来,因为程序不够,我把内存模式修改成Large模式,结果,程序就完全出错了,再后来,我找个高手问了一下,他说,51单片机的结构体数据类型所定义的变量和数组变量,是不可以放在外部RAM里的,至于详细的原因,他说他也不清楚,是经验所得的。

他后来只把变量的定义修改如下:
data CALENDER Calndr1;
data CALENDER Calndr_Temp;
程序在Large模式下就可以运行了,我想问问其他前辈,为什么自定义的结构体类型的数据不可以存放在外部存储器XRAM里呢?
另外补充的说一下,我用的是STC90C516AD,有4K的外部RAM,是可以用的。
百度没分了,能给出详细且正确的解释的,我愿意充十块话费,谢谢!

变量当然可以放在XRAM里。

当内存模式small时,如果没有给变量指定内存区域,那么默认就是放在data区的,但当你内存模式改成LARGE时,默认就变成xdata了,就如同你的程序一样,必须强制说明在data区程序就正常了。

使用XRAM的话,必须指定xram的地址和大小,例如:

追问

是这样的,我在使用Large的时候,没有指定Start 和Size,就是没有按照你图中的设置,但存储普通的变量没有问题,只要是存储结构体就不行,为什么?

追答

没指定的话那就相当于开放式了,谁也不知道KEIL是怎么安排的了。只有当你给出了约束条件,你的程序才是可预期的
结构为什么会失效我不能随便下结论,不过我建议你使用small模式。

温馨提示:答案为网友推荐,仅供参考