7588|4

59

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

求助:请教一个关于51单片机变量空间溢出的问题 [复制链接]

程序中定义的变量数大于128个了该怎么办?kelic编译器提示如下:
Program Size: data=140.1 xdata=126 code=24647
麻烦高手提供一个解决办法

最新回复

你的程序为什么会用到这么多变量? 是不是太多全局变量,静态变量? 否则除非更换型号,获得更大容量别无他法,或者外部扩展。 但现在我觉得关键的问题是,你到底怎么用的这么多变量?也许有办法可以不用这么多。那就可以在程序上改动,硬件上保持原状,最省事。  详情 回复 发表于 2012-3-31 15:13
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
PS:我把所有的变量都定义为xdata类型的同样也不行
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
关注一下,
转帖
在C51中变量的空间分配几个方法

1、 data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。

2、 data区内最好放局部变量。

因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;

3、 确保你的程序中没有未调用的函数。

在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil C做得很愚蠢,但也没办法。

4、 程序中遇到的逻辑标志变量可以定义到bdata中,可以大大降低内存占用空间。

在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。

5、 其他不频繁用到和对运算速度要求不高的变量都放到xdata区。

6、 如果想节省data空间就必须用large模式,将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。

7、 当使用到指针时,要指定指针指向的内存类型。

在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针 p是指向data区,则应定义为: char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
问题已解决,虽然不是用的上面的方法,还是很感谢,一样给分。
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

5
 
你的程序为什么会用到这么多变量?
是不是太多全局变量,静态变量?

否则除非更换型号,获得更大容量别无他法,或者外部扩展。

但现在我觉得关键的问题是,你到底怎么用的这么多变量?也许有办法可以不用这么多。那就可以在程序上改动,硬件上保持原状,最省事。
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表