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

2020-02-01 16:14发布

测试芯片: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里面这个界面这几个选项的含义到底是什么?
BaiduShurufa_2013-2-1_20-54-0.png (4.56 KB, 下载次数: 0) 下载附件 2013-2-1 20:54 上传
尤其是那个Operating
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
SUNZHILIANG
1楼-- · 2020-02-02 14:08
顶起来?
清雨影
2楼-- · 2020-02-02 15:49
琉璃蝶羽 发表于 2013-2-3 13:46
你可以把固定的数组改成:unsigned char code LED_NUM[10]={};//先行省略,A~F数码管上显示时候用
这样就可 ...

谢谢,此前我并不知道这样就是放在ROM中的,因为我觉得,任何一个数据放在ROM中肯定没有在RAM中读取来得快。
此前,我觉得加了CODE只是受保护了而已。
health
3楼-- · 2020-02-02 17:27
内存溢出了。
用了多少内存,看一下编译报告一目了然。
目测你的程序,光是那两行就已经XRAM超了。
unsigned int box[485];

unsigned int box[485]={0};
这两行用掉1940byte ram。
不清楚这个stc90c516有多少xram,估计最大也就1024byte。
清雨影
4楼-- · 2020-02-02 20:11
health 发表于 2013-2-3 23:33
内存溢出了。
用了多少内存,看一下编译报告一目了然。
目测你的程序,光是那两行就已经XRAM超了。

485(嗯,我依稀记得应该是这个数据)是个临界值。
1个int2个Byte,16进制书写出来占4位。所以不到1K。
官方档案上显示那个型号的芯片有1280byte的ROM,但是实际练1024都用不到。
我想问的是那个关于子程序的,子程序占用的内存是不是只有在调用的时候才会加载?
刚刚
5楼-- · 2020-02-02 23:50
 精彩回答 2  元偷偷看……
health
6楼-- · 2020-02-03 02:37
清雨影 发表于 2013-2-3 23:47
485(嗯,我依稀记得应该是这个数据)是个临界值。
1个int2个Byte,16进制书写出来占4位。所以不到1K。
...

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

一周热门 更多>