打印

AT89S52定义变量数据存储空间不够用解决

[复制链接]
7848|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 电子三极管 于 2011-12-26 11:57 编辑

遇到一个AT89S52单片机程序定义变量数据存储空间不够用
不知道该怎么解决 现在是129.3字节RAM
在网上收索到的解决方法是:(如图)
现在我想求助一下大家 帮帮看看是不是遇见过类似问题 指教解决方法的措施

KEIL4编译.jpg (120.67 KB )

KEIL4编译.jpg

网上有人认为.jpg (131.31 KB )

网上有人认为.jpg

数据存储空间溢出.jpg (71.15 KB )

数据存储空间溢出.jpg

相关帖子

沙发
wukunshan| | 2011-12-26 13:09 | 只看该作者
上图的说明是在有外部扩展RAM的情况下才行得通。像你的这种请况的话通过以下方法解决:
1.把值不大于255的int型数据改为unsigned char 型数据。
2.把常数组、常变量(其值是常数), 定义为code型数据,存储在ROM里。
3.以上方法还不能解决只有扩展外部RAM了。

使用特权

评论回复
板凳
电子三极管|  楼主 | 2011-12-26 14:41 | 只看该作者
谢谢你 2# wukunshan

这个警告该怎么解决.png (6.52 KB )

这个警告该怎么解决.png

使用特权

评论回复
地板
ayb_ice| | 2011-12-26 14:51 | 只看该作者
将较大的数组声明为idata类型,比如
char idata my_array[32];

使用特权

评论回复
5
wukunshan| | 2011-12-26 15:48 | 只看该作者
这个问题是你给_SFDioayChange函数赋值实参的时候可能少了一个参数呀。

使用特权

评论回复
6
544852010| | 2012-4-28 11:14 | 只看该作者
PIC单片机的类似问题呢?数据空间不够用如何解决??

使用特权

评论回复
7
ningling_21| | 2012-4-28 11:44 | 只看该作者
尽量减少全局变量的使用...
变量定义时明确存储空间...

使用特权

评论回复
8
受不了了| | 2012-4-28 12:10 | 只看该作者
如果某些功能不用,则相应的一些特殊功能寄存器倒是可以用来当变量使的,比如T2中断不用,则TH2,TL2,T2CON,RCAP2H,RCAP2L的5个字节可以当RAM使,显然是直接寻址。51的那些特殊功能寄存器区域未定义的RAM不能读写,很是可惜:'(

使用特权

评论回复
9
ayb_ice| | 2012-4-28 13:30 | 只看该作者
先搞清楚DATA与IDATA区别

使用特权

评论回复
10
受不了了| | 2012-4-28 15:00 | 只看该作者
平时我也不大看书,百度来一段:
DATA,又叫直接寻址区,位于单片机内部RAM的前128个字节,可以直接寻址
IDATA区:间接寻址区,单片机内部RAM的前256个字节,用间接寻址进行访问
虽然特殊功能寄存器不属于DATA区域,但照样可以直接寻址,这个可以吧。我上面举例的TH2之类的单元如果定时器2不打开可以当与时间无关的变量使,没错吧

使用特权

评论回复
11
airwill| | 2012-4-28 15:24 | 只看该作者
我上面举例的TH2之类的单元如果定时器2不打开可以当与时间无关的变量使,没错吧,  没错.
问题并不太麻烦, 一些用得比较少的变量都可以定为 IDATA 存储类型(原则上任何变量都可以, 只是代码空间会增长). code 空间也不紧张.

使用特权

评论回复
12
零之韵律| | 2013-5-16 07:24 | 只看该作者
用idata 解决了   谢谢了

使用特权

评论回复
13
kaly_liu| | 2013-5-16 10:35 | 只看该作者
ayb_ice 发表于 2011-12-26 14:51
将较大的数组声明为idata类型,比如
char idata my_array[32];

我在程序里,在函数的外部定义一个全局变量:unsigned char temp[64];在程序中可以用;
后来我将这个全局变量注释掉,在函数内部定义一个局部变量unsigned char temp[64];可是不知道为什么这样一来,程序运行就有错误了·····是data溢出了?还是·······

使用特权

评论回复
14
kaly_liu| | 2013-5-16 10:38 | 只看该作者
在程序中,是否可以将 data xdata code 这些都用完呢?(就是keil编译后出现的 code data xdata都达到了单片机的最大值··)是不是要留些data出来,给运行的时候用?

使用特权

评论回复
15
ayb_ice| | 2013-5-16 10:41 | 只看该作者
编译器报告的data用量其实包括DATA和IDATA空间,这个不能用完的,必须保证足够的堆栈空间,其它的可以用完

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
kaly_liu + 2 赞一个!
16
kaly_liu| | 2013-5-16 15:17 | 只看该作者
多谢楼上的。哈哈

使用特权

评论回复
17
gkkg| | 2013-5-19 20:04 | 只看该作者
用XDATA就行啦

使用特权

评论回复
18
litianchenghao| | 2015-9-9 11:18 | 只看该作者
好,谢谢

使用特权

评论回复
19
天风立马| | 2015-9-13 17:40 | 只看该作者
建议keil的帮助从头看一遍。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:承接采集设备运行参数,如温度、速度、压力、浓度、流量、节拍、湿度、重量等。采用PIC 51 AVR等类单片机 59467837(杭州单片机开发技术交流QQ群)

116

主题

530

帖子

2

粉丝