keil C51中的data怎么设置成大一点的值?

keil C51中的data超过了110多就报错,data就超了;

现在我的芯片有512字节的RAM,要怎么设置keil,才能使软件的data不报错?

还请各位高手指点指点!
补充:不要说更换芯片、设置成xdata、缩减代码之类的,我需要的是怎么设置成更大的RAM,谢谢!!

在keil里面选择正确的单片机型号,各种型号对应了特定的ram

比如:89c51的128 Bytes On-chip RAM。比如将那些不改变的变量定义为code,比如unsigned char code a;可以用外扩的数据存储器,定义XDATA来改变变量的存储地方,比如XDATA signed char a;设置options for the target里面的target,如图。

资源不够你可以减少没有用到的定义变量,或者是精简变量,能用char的就用char,

WARNING L15,大多是函数可重入性函数的问题,比如说主函数条调用某个函数abc();中断里面也调用了这个函数,而你定义的这个函数是不可重入得函数,就会L15警告。解决由两个方法,重新顶一个一样的函数,就是函数名字不一样,分别在主函数和中断里面各自调用函数,另一种就是在函数abc()加入reentrant 可重入性。reentrant abc ()这个方法会降低重入函数的执行速度

温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-02-11
楼主没有搞清楚 51的 结构.
楼上说的虽然大多是废话,,对你的项目可以没多少帮助
但是至少有一点是对的..设置成xdata可以解决你的问题.
虽然不是什么好办法.

51的 ram 分外三种.
内部直接寻址你的128byte 内部间接的128byte
还有就是外部 ram

你的51单片机有512byte
那么肯定是 内部 直接 间接各128
外加外部256字节

你把那些大一点的数据全部改成 xdata 声明就可以了.
当然如果你会控制ram大小的话..用idata 声明效率更好一点
例如 unsigned char yy;
写个成 unsigned char xdata yy;

(你看你自己的编译结果显示 data=137, xdata=0, code=4856
就应该猜测一下 xdata 干吗用的了

最后 建议楼主. 最好不用在keil c51里面使用printf函数(浪费啊)
回去.仔细看一遍51的结构..然后看看keil c51的区别于ansi c的东西
会对你有帮助本回答被提问者采纳
第2个回答  2010-02-15
以我的知识,keil不允许自己设置ram大小。都由芯片决定。

512字节的internal ram?我没见过。。。
因为512字节的ram寻址需要2个字节,而data一般只用一个字节寻址。
所以很难想象存在512的data空间。
甚至data区只有128字节,包括寄存器占用的。
因为另128字节地址作为sfr被访问。
所以超过128的internal ram都用idata方式来访问。

楼主仔细看看芯片手册?如果确定有512字节data,务必告诉我使用何种汇编语句直接访问data。
第3个回答  推荐于2018-05-17
data不是数据类型,是keil编译器的一个关键字,用来声明变量存储的位置的。
若一个变量声明为data,那么它就是存放在单片机低128byte的ram区的。
数据类型是char int long这些,本质上就是用来声明一个变量是占用多少字节的存储空间的。
举个例子,int a;int bdata a;int data a;
a这个变量都是整形,占用两个字节的存储空间,但通过加关键字“bdata”和“data”声明了之后,存放的位置会比较确定。
不加该关类键字的话,编译器有可能把它分配在bdata区或者data区。本回答被网友采纳