这个问题是替朋友问的,当然,我也不会,顺便请教,如果有回答的好的,我朋友可以充十块话费,先谢谢各位大神。
是这样的,本人以前一直做硬件设计,最近一年才接触单片机的硬件和编程设计,昨天在程序设计中,发现一个怪现象,就是,我程序里定义了一个结构体数据类型,如下定义:
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,是可以用的。
百度没分了,能给出详细且正确的解释的,我愿意充十块话费,谢谢!
那为什么对于普通数据类型的变量没有问题,而自定义结构体类型的变量就不行呢?
追答这个只能说是Keil对STC的支持问题,同样式51单片机,用SST的和C805F等带XRAM的就能正常编译通过,结构体是可以放在XRAM中的,不
存在你说的上述问题。还有声明结构体方法有问题。
typedef struct Calender
{
........
}CALENDER;
后面的这个CALENDER是一个变量,Calender才是变量类型。只有变量类型才能声明其他变量。这两个名称最好有所区别避免混淆。
你没看明白,我是typedef struct xxx{}XXX.这种声明结构体的方法是没有问题的。
另外,我这个不是说把结构体类型放到外部RAM会编译报错,编译是不报错的,能够编译通过,只是运行出错。
这个代码我验证过了,没有问题。而且我有很多项目上都在用外部RAM放结构体,不存在你说的问题。
你看那,我的结构体包括结构体的数组都定义到XRAM里了,
非常感谢您能为这个问题亲自做实验!
如果 struct xxx{}XXX;这样的话,那么,XXX是一个声明的变量
typedef struct xxx{}XXX.如果是这样的话,其结构与 typedef unsigned short uint;是一样的,
那个uint是类型的新别名,而不是unsigned short类型的变量。
嘿嘿,这个我弄错了,以我截图为准。你试着找找其他原因。
是的,只要放到xdata里,程序就不对,数据就乱,但是放到data里就没有问题
追答数据乱了是通过程序运行看出来的 还是仿真查看该地址时 数据是乱的
前者的话就好好检查下程序 看看是否是堆栈溢出了 后者的话有可能就是楼上所说keil的不支持引起的
数据乱了是程序运行出来的,我用8个LED分别表示状态几种状态,只要把那个结构体类型定义在外部XRAM,状态跑的就不对,定义在内部就没有问题,您说是堆栈溢出,可是,我放到外部RAM的堆栈,减小了内部RAM的使用量,应该是增大了堆栈的空间才对呀?请前辈指教
追答那你仿真看看 断点设在变量定义赋值之后 看变量是不是正确存放了