搜索
bottom↓
回复: 45

我写的51程序是不是跑飞了。

[复制链接]

出0入0汤圆

发表于 2014-8-8 09:31:22 | 显示全部楼层 |阅读模式
我洗的程序硬件仿真是没问题的,下载到RAM为256的单片机,没反应,我在找了一个1KRAM的单片机,跟仿真一样,没问题。这是什么情况呢。。。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-8-8 10:34:16 | 显示全部楼层
你没找个RAM128的试试?

出0入0汤圆

 楼主| 发表于 2014-8-8 11:50:54 | 显示全部楼层
tam2907 发表于 2014-8-8 10:34
你没找个RAM128的试试?

256的都不行了。128应该更加不行吧!   而且,程序超过8K  所以就用了一款RAM256,ROM16K的单片机了。

出0入0汤圆

 楼主| 发表于 2014-8-8 11:59:47 | 显示全部楼层
自己顶上来一下!!!!!跪求大神出来解答啊

出0入0汤圆

发表于 2014-8-8 12:09:50 | 显示全部楼层
你IDE建立工程的时候选择的芯片,需要和你实际使用的芯片相对应才行。或者你可以手工修改icf文件,使链接器在链接的时候把变量都分配到实际存在的空间上去。

出0入0汤圆

 楼主| 发表于 2014-8-8 15:30:14 | 显示全部楼层
shandian 发表于 2014-8-8 12:09
你IDE建立工程的时候选择的芯片,需要和你实际使用的芯片相对应才行。或者你可以手工修改icf文件,使链接器 ...

我选的芯片型号是相对应的。因为他们之前都是这么选的,我是刚来公司,做的第一个项目。还有什么可能吗?我觉得你说的这个问题,的确是有概率!

出0入0汤圆

发表于 2014-8-8 15:49:30 | 显示全部楼层
写个hello看飞不飞?这要写飞了改行搬砖,高收入行业。
检查存储模式,idata, xdata, code不超范围。

出0入0汤圆

 楼主| 发表于 2014-8-8 15:53:54 | 显示全部楼层
rain73 发表于 2014-8-8 15:49
写个hello看飞不飞?这要写飞了改行搬砖,高收入行业。
检查存储模式,idata, xdata, code不超范围。 ...

写个hello肯定是没问题的。
我定义的时候,基本上用了idata,全部的变量加在一起也才5,60个,不可能超的。我用的RAM是256的。生成的HEX大小9K多,我选用的ROM是16K的,也不会超的啊!

出0入0汤圆

发表于 2014-8-8 22:08:52 | 显示全部楼层
Program Size: data=后面的数字是不是快接近256了?
头像被屏蔽

出0入0汤圆

发表于 2014-8-8 22:42:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

 楼主| 发表于 2014-8-8 22:45:07 | 显示全部楼层
csaaa 发表于 2014-8-8 22:42
是不是内存泄露了?某个地方在循环中不停申请新内存,而不是在使用已有的空间? ...

这是为什么呢?  我在用256RAM的时候程序没跑起来的感觉。但是用1K的RAM的单片机的时候,跑起来完全没问题!还有,真的是内存泄露,怎么处理呢?  大神请指教啊

出0入0汤圆

 楼主| 发表于 2014-8-8 22:47:48 | 显示全部楼层
iquer 发表于 2014-8-8 22:08
Program Size: data=后面的数字是不是快接近256了?

我用的是medwin,这是万利的产品。编译结束的时候没有这个提示。
不过我自己个人感觉不可能接近256,我定义的时候都用u年signed char idata,而且我数了一下变量,65个左右。

出0入0汤圆

发表于 2014-8-9 12:51:11 | 显示全部楼层
堆栈嵌套多不多?这个也很耗内存的

出0入0汤圆

 楼主| 发表于 2014-8-9 19:38:35 | 显示全部楼层
dadongleilei 发表于 2014-8-9 12:51
堆栈嵌套多不多?这个也很耗内存的

不多啊!加中断,最多的顶多六层吧!

出0入0汤圆

发表于 2014-8-9 21:53:03 | 显示全部楼层
51内部idata ram最多也就256字节把那些1K的是扩展的xdata ram,有没有什么变量倍放置在xdata区了啊

出0入0汤圆

发表于 2014-8-9 22:02:34 | 显示全部楼层
如果有可能,第一天就要上机实验,搞到最后一天才发现原来一直不能在真机运行,会哭的

出0入0汤圆

 楼主| 发表于 2014-8-9 22:53:03 | 显示全部楼层
ARM菜鸟 发表于 2014-8-9 21:53
51内部idata ram最多也就256字节把那些1K的是扩展的xdata ram,有没有什么变量倍放置在xdata区了啊 ...

被放置到xdata?不可能啊,我定义的时候没用到xdata,都是用idata来定义的。
现在看了,程序会进外部中断,但是其他的反应一个都没有,写的显示程序,也什么都不会显示!

出0入0汤圆

 楼主| 发表于 2014-8-9 22:54:09 | 显示全部楼层
javabean 发表于 2014-8-9 22:02
如果有可能,第一天就要上机实验,搞到最后一天才发现原来一直不能在真机运行,会哭的 ...

硬件仿真的一点问题都没有,写到单片机进去发现不工作,真是欲哭无泪。。。。。。。。求指导!

出0入0汤圆

发表于 2014-8-9 23:06:26 | 显示全部楼层
rockyyangyang 发表于 2014-8-9 22:54
硬件仿真的一点问题都没有,写到单片机进去发现不工作,真是欲哭无泪。。。。。。。。求指导! ...

仿真是让所有工作最后崩溃的罪魁祸首,相信真机,别信仿真,仿真没事真机出事的情况多了去了,软件硬件都是bug,最后以量产为准,没办法,仿真没问题你给客户装电脑去仿真去吧

出0入0汤圆

发表于 2014-8-9 23:23:45 | 显示全部楼层
重新建一个工程,功能一点一点的加,在在真机上实验,看看问题出在哪,可以用svn,加一个i功能真机测试好了,提交,再增加其他功能。svn可以在本机上建立服务的

出0入0汤圆

 楼主| 发表于 2014-8-9 23:59:32 | 显示全部楼层
javabean 发表于 2014-8-9 23:06
仿真是让所有工作最后崩溃的罪魁祸首,相信真机,别信仿真,仿真没事真机出事的情况多了去了,软件硬件都 ...

我也知道啊,前期你总得在电脑上调试吧!
我现在看了编译结果,提示data=119,xdata=7  我想说,我定义变量的时候没用到xdata,都用idata跟data直接定义的,这个xdata哪里出现的呢?

出0入0汤圆

发表于 2014-8-10 00:33:06 | 显示全部楼层
rockyyangyang 发表于 2014-8-9 23:59
我也知道啊,前期你总得在电脑上调试吧!
我现在看了编译结果,提示data=119,xdata=7  我想说,我定义变 ...

程序在电脑上写,仿真还 是别太相信,你防盗实际的平台上看效果

出0入0汤圆

发表于 2014-8-10 07:03:31 | 显示全部楼层
rockyyangyang 发表于 2014-8-9 23:59
我也知道啊,前期你总得在电脑上调试吧!
我现在看了编译结果,提示data=119,xdata=7  我想说,我定义变 ...

汗,现在才发现到这个?之前看你说变量个数用人工算,除了你自己的,还有库也要用到,怎么算得出,除非不用库。

出0入0汤圆

发表于 2014-8-10 09:16:53 | 显示全部楼层
内部RAM不要占用过多,给堆栈留一点

出0入0汤圆

发表于 2014-8-10 09:26:39 | 显示全部楼层
内存用超了吧,看看编译的结果,每个内存用了多少,实际IC有没有那么多,这个非常关键,因为大部分情况确实是内存不够用,子程序相互调用需要堆栈的

出0入0汤圆

 楼主| 发表于 2014-8-10 09:30:23 | 显示全部楼层
Ai_evan 发表于 2014-8-10 00:33
程序在电脑上写,仿真还 是别太相信,你防盗实际的平台上看效果

就是实际中,下载到RAM256的单片机就不能运行了,但是1K的就可以!

出0入0汤圆

 楼主| 发表于 2014-8-10 09:31:42 | 显示全部楼层
rain73 发表于 2014-8-10 07:03
汗,现在才发现到这个?之前看你说变量个数用人工算,除了你自己的,还有库也要用到,怎么算得出,除非不 ...

请问我该这么解决呢?  还有啊,虽然data是119了,但是我用的RAM大小是256的啊,怎么样也不会超吧!
求解答!

出0入0汤圆

 楼主| 发表于 2014-8-10 09:33:51 | 显示全部楼层
cn_badboy 发表于 2014-8-10 09:16
内部RAM不要占用过多,给堆栈留一点

RAM用256的,现在data达到119,堆栈的内存应该没问题吧!
没定义xdata类型的,但是编译结果xdata=7,不知道哪里来的。

出0入0汤圆

 楼主| 发表于 2014-8-10 09:35:01 | 显示全部楼层
javabean 发表于 2014-8-10 09:26
内存用超了吧,看看编译的结果,每个内存用了多少,实际IC有没有那么多,这个非常关键,因为大部分情况确实 ...

没超吧! data到119,但是我用的是256的。现在在奇怪哪里冒出一个xdata,我没定义这类型的

出0入0汤圆

发表于 2014-8-10 09:38:46 | 显示全部楼层
rockyyangyang 发表于 2014-8-10 09:31
请问我该这么解决呢?  还有啊,虽然data是119了,但是我用的RAM大小是256的啊,怎么样也不会超吧!
求解 ...

应该很明显了,1k可运行,因为他超256都是xdata,而256的没有,把xdata清除应就可以了

出0入0汤圆

 楼主| 发表于 2014-8-10 09:41:28 | 显示全部楼层
rain73 发表于 2014-8-10 09:38
应该很明显了,1k可运行,因为他超256都是xdata,而256的没有,把xdata清除应就可以了 ...

我不知道该这么解决,变量到119,不是还没到256吗?  你说的库,我就只调用了一个#include<reg52.h>,xdata真的都不知道哪里出来的!很想解决。

出0入0汤圆

 楼主| 发表于 2014-8-10 09:45:14 | 显示全部楼层
rain73 发表于 2014-8-10 09:38
应该很明显了,1k可运行,因为他超256都是xdata,而256的没有,把xdata清除应就可以了 ...

你说的把xdata清楚,我该怎么清楚?因为我没定义这样类型的变量!不知道从哪里清除。

出0入0汤圆

发表于 2014-8-10 09:45:40 | 显示全部楼层
XDATA是编译器自己产生的,没有定义存储类型的用LARGE模式编译会默认XDATA

出0入0汤圆

 楼主| 发表于 2014-8-10 09:50:07 | 显示全部楼层
cn_badboy 发表于 2014-8-10 09:45
XDATA是编译器自己产生的,没有定义存储类型的用LARGE模式编译会默认XDATA

我的确是设置在large模式!
“没有定义存储类型的用LARGE模式编译会默认XDATA”--除了定时中断的几个变量定义为data,其他类型的全部定义为idata。
函数入口参数我没有定义类型,比如我就直接void rec_24c24_data(uchar sla,uchar saddr,uchar *rec_24c02_s,uchar no);

出0入0汤圆

发表于 2014-8-10 09:58:01 | 显示全部楼层
看到hex文件9K多,我就笑了。hex文件不是二进制文件的大小,实际的代码还没达到8K

出0入0汤圆

 楼主| 发表于 2014-8-10 10:02:38 | 显示全部楼层
lcofjp 发表于 2014-8-10 09:58
看到hex文件9K多,我就笑了。hex文件不是二进制文件的大小,实际的代码还没达到8K ...

hex大小是27K 。。。  我之前想表达的是code已经9K多了!

出0入0汤圆

 楼主| 发表于 2014-8-10 10:04:20 | 显示全部楼层
cn_badboy 发表于 2014-8-10 09:45
XDATA是编译器自己产生的,没有定义存储类型的用LARGE模式编译会默认XDATA

我现在吧编译器设置成small模式,xdata不见了!
Program Size: data=126.0 xdata=0 code=8234
这样应该没影响了吧!!!!明天下载到单片机试一试。

出0入0汤圆

发表于 2014-8-10 10:05:41 | 显示全部楼层
如果已经全部指定为IDATA,编译器还自行产生了几个XDATA变量,就是RAM不够用了,想办法减少变量吧

出0入0汤圆

 楼主| 发表于 2014-8-10 10:14:34 | 显示全部楼层
cn_badboy 发表于 2014-8-10 10:05
如果已经全部指定为IDATA,编译器还自行产生了几个XDATA变量,就是RAM不够用了,想办法减少变量吧 ...

这个跟我设置keil的memory model是什么模式有关系吗?之前一直全部设置为large,听了你的改成small的,马上就不见了!
你说ram不够很奇怪啊,data才119,我用的ram是256的。变量也真的才那么几个!
会不会是编译器设置的问题?

出0入0汤圆

发表于 2014-8-10 10:20:36 | 显示全部楼层
程序运行中还需要RAM,程序嵌套越多,需要的越大,RAM接近用光,就算跑起来,某种情况下,也有堆栈溢出的可能。

出0入0汤圆

 楼主| 发表于 2014-8-10 11:03:50 | 显示全部楼层
cn_badboy 发表于 2014-8-10 10:20
程序运行中还需要RAM,程序嵌套越多,需要的越大,RAM接近用光,就算跑起来,某种情况下,也有堆栈溢出的可 ...

是需要RAM,我用了一半,不是还剩下一半吗?
我现在最关心的是不是编译器设置的问题!

出0入0汤圆

发表于 2014-8-10 11:42:37 | 显示全部楼层
单步仿真吧,看跑到哪里飞了

出0入0汤圆

 楼主| 发表于 2014-8-10 13:23:02 | 显示全部楼层
cn_badboy 发表于 2014-8-10 11:42
单步仿真吧,看跑到哪里飞了

硬件单步仿真,或者全速运行都是没问题的。
关键就是下载到单片机就没反应了,

出0入0汤圆

发表于 2014-8-10 13:51:13 | 显示全部楼层
就是XDATA的问题了,很明显1K的RAM中是有XDATA的,256的没有。

出0入0汤圆

发表于 2015-1-24 13:10:58 | 显示全部楼层
学习了。我来帮你看看呢

出0入0汤圆

发表于 2015-1-26 11:25:45 | 显示全部楼层
程序大小超了ram是烧写不进去的,程序问题吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表