搜索
bottom↓
回复: 21

请教各位高手一个关于C51内存的问题

[复制链接]

出0入0汤圆

发表于 2013-2-1 20:55:23 | 显示全部楼层 |阅读模式
测试芯片:STC90C516RD+
使用语言:C
就是一段简单的程序
#define LEN 485
unsigned int box[LEN];
unsigned char LED_NUM[10]={};//先行省略,A~F数码管上显示时候用
main(){
    unsigned int box[LEN]={0};
    unsigned char i=0;
    for(i=0;i<LEN;i++){
        box=3*i;
    }
    i=0;
    while(1){
        led_show(box,LED_NUM);//事先写好的在数码管上显示数字的程序
        i++;
        if(i==LEN){
            i=0;
        }
    }
}
当LEN大到一定程度的时候,数码管的显示就会“神经错乱”,个人猜测其原因应该是box申请的内存越界了,导致冲毁的LED_NUM
但是不能理解的是:为毛是从后面往前面冲垮的?比如,LEN为485时候刚好不冲毁,LEN为486时候,LED_NUM[8]和LED_NUM[9]被冲毁,导致8,9显示不正常,LEN为487时,6和7也就阵亡了……可是为什么是从后向前的……
还有,main函数使用的内存为485*2+1=971字节
如果现在写一个程序,main函数使用1字节的内存,子函数f1使用970字节内存,函数f2也使用970字节内存,main分别同时调用两个函数,会不会溢出?(尚未实验)
还有,Keil里面这个界面这几个选项的含义到底是什么?

尤其是那个Operating

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

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

出0入0汤圆

发表于 2013-2-1 21:15:35 | 显示全部楼层
for(i=0;i<LEN;i++){
        box=3*i;
    }

是神马意思?

出0入0汤圆

 楼主| 发表于 2013-2-1 21:18:36 | 显示全部楼层
Alvin007 发表于 2013-2-1 21:15
for(i=0;i

不好意思
应该是box=3*i;
赋个初值……

出0入0汤圆

发表于 2013-2-1 21:37:09 | 显示全部楼层
#define LEN 485
unsigned int box[LEN];
开头就错了,51的ram只有256bytes,想要更多需要声明成xdata。

出0入0汤圆

 楼主| 发表于 2013-2-1 21:55:00 | 显示全部楼层
i55x 发表于 2013-2-1 21:37
#define LEN 485
unsigned int box[LEN];
开头就错了,51的ram只有256bytes,想要更多需要声明成xdata。 ...

是的,我的确改成了XDATA但是不是在变量申明里改的是在project的设置里改的,就是如图那三个设置我不会
STC90C516RD+的内存好像是1K多一点的。ROM61K(号称64K)

出0入0汤圆

发表于 2013-2-3 13:46:11 | 显示全部楼层
你可以把固定的数组改成:unsigned char code LED_NUM[10]={};//先行省略,A~F数码管上显示时候用
这样就可以把它放在ROM中,而不是放在RAM中了,不影响程序。但是变量则不可以这样子做。

出0入0汤圆

发表于 2013-2-3 21:19:43 | 显示全部楼层
顶起来?

出0入0汤圆

 楼主| 发表于 2013-2-3 23:19:39 | 显示全部楼层
琉璃蝶羽 发表于 2013-2-3 13:46
你可以把固定的数组改成:unsigned char code LED_NUM[10]={};//先行省略,A~F数码管上显示时候用
这样就可 ...

谢谢,此前我并不知道这样就是放在ROM中的,因为我觉得,任何一个数据放在ROM中肯定没有在RAM中读取来得快。
此前,我觉得加了CODE只是受保护了而已。

出0入0汤圆

发表于 2013-2-3 23:33:42 | 显示全部楼层
内存溢出了。
用了多少内存,看一下编译报告一目了然。
目测你的程序,光是那两行就已经XRAM超了。
unsigned int box[485];

unsigned int box[485]={0};
这两行用掉1940byte ram。
不清楚这个stc90c516有多少xram,估计最大也就1024byte。

出0入0汤圆

 楼主| 发表于 2013-2-3 23:47:35 | 显示全部楼层
health 发表于 2013-2-3 23:33
内存溢出了。
用了多少内存,看一下编译报告一目了然。
目测你的程序,光是那两行就已经XRAM超了。

485(嗯,我依稀记得应该是这个数据)是个临界值。
1个int2个Byte,16进制书写出来占4位。所以不到1K。
官方档案上显示那个型号的芯片有1280byte的ROM,但是实际练1024都用不到。
我想问的是那个关于子程序的,子程序占用的内存是不是只有在调用的时候才会加载?

出0入0汤圆

发表于 2013-2-3 23:58:11 | 显示全部楼层
  unsigned char i=0;
    for(i=0;i<LEN;i++){
        box=3*i;
    }

声明i为char,范围是0~255,LEN已经超出变量了,肯定会乱来了塞

你把i声明成int试试~

出0入0汤圆

发表于 2013-2-3 23:58:18 | 显示全部楼层
清雨影 发表于 2013-2-3 23:47
485(嗯,我依稀记得应该是这个数据)是个临界值。
1个int2个Byte,16进制书写出来占4位。所以不到1K。
...

按你的写法,那是两个不同的数组,一个全局,一个局部。虽然名称相同,但是两个独立的东西,占用的空间也是单独的。
另外,1280byte的是ram,其中又分为1024byte的扩展ram和256byte的片内ram。

出0入0汤圆

 楼主| 发表于 2013-2-4 00:01:47 | 显示全部楼层
刚刚 发表于 2013-2-3 23:58
unsigned char i=0;
    for(i=0;i

不好意思,当时应该意识到了,改成int的,很久不弄又忘了,谢谢提醒

出0入0汤圆

发表于 2013-2-4 00:03:14 | 显示全部楼层
清雨影 发表于 2013-2-4 00:01
不好意思,当时应该意识到了,改成int的,很久不弄又忘了,谢谢提醒

改成int还是不行?

出0入0汤圆

发表于 2013-2-4 00:29:33 | 显示全部楼层
Operating--操作系统,51可以跑操作系统的。下拉就有三个选项可以选择:none  tiny full

出0入0汤圆

 楼主| 发表于 2013-2-4 01:40:06 | 显示全部楼层
health 发表于 2013-2-3 23:58
按你的写法,那是两个不同的数组,一个全局,一个局部。虽然名称相同,但是两个独立的东西,占用的空间也 ...

嗯嗯,还是有些不懂的说,继续向高手请教:
比如:

void f1(){
uint fx1[480]={0};
。。。
}

void f2(){
uint fx2[480]={0};
。。。
}

main(){
f1();
f2();
}
这个程序会崩溃么?
(如果我的帖子里的)

出0入0汤圆

 楼主| 发表于 2013-2-4 01:40:33 | 显示全部楼层
刚刚 发表于 2013-2-4 00:03
改成int还是不行?

行的呀,这就是个溢出实验

出0入0汤圆

 楼主| 发表于 2013-2-4 01:42:27 | 显示全部楼层
咱厝人 发表于 2013-2-4 00:29
Operating--操作系统,51可以跑操作系统的。下拉就有三个选项可以选择:none  tiny full ...

我记得操作系统应该是要写的吧…就算是抄也行…
比如μCOS的源代码……
写了以后怎么选?
none,tiny,full到底代表着什么?

出0入0汤圆

发表于 2013-2-4 23:13:28 | 显示全部楼层
清雨影 发表于 2013-2-4 01:40
嗯嗯,还是有些不懂的说,继续向高手请教:
比如:

如果仅是这点的话,默认情况下是可以的,没有嵌套关系,也不在中断中调用,可以内存覆盖,共用空间。

出0入0汤圆

发表于 2013-2-4 23:16:01 | 显示全部楼层
清雨影 发表于 2013-2-4 01:42
我记得操作系统应该是要写的吧…就算是抄也行…
比如μCOS的源代码……
写了以后怎么选?

rtx51tny,rtx51full,前者keil c51自带,后者要另卖

出0入0汤圆

 楼主| 发表于 2013-2-5 08:54:48 | 显示全部楼层
health 发表于 2013-2-4 23:13
如果仅是这点的话,默认情况下是可以的,没有嵌套关系,也不在中断中调用,可以内存覆盖,共用空间。 ...

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

本版积分规则

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

GMT+8, 2024-7-23 18:32

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

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