keil里面data怎么会变大?

问题是这样的,我手上有一块彩屏的列子程序,我想修改了自己测试。可以是当我删除一些程序,发现data会变大,我删除了越多,data就会越大。有的人告诉我是内存申请了没有释放掉。我想问下,怎么释放内存。

没有删除之前如上图

删除之后data由以前的32变成34.
如果我删除了越多,就会变得越大。
这是怎么回事啊?

这是因为,你删除的程序中,有几行是函数的调用,被你删除后,这些函数就只有函数体,却没有调用了(从编译信息看,是memory_clear_with_font_bgcolor)。当这个函数中有局部变量时,由于没被调用过,所以KEIL无法进行变量的优化,最后只能把局部变量保存下来,反而多占用了空间。
解决办法:1、把不用函数删掉或注释掉
2、写成这样,伪调用:
a = 1;
if(a==0)
{
memory_clear_with_font_bgcolor();//把从不调用的函数放这里
}追问

那您的意思就是说,调用过反而会被keil清除掉,没被调用的反而会被保存下来~

追答

调用过的函数,它里面的局部变量会和其他的变量复用某个地址,而没被调用过的函数,里面的变量KEIL不知道怎么优化,但又必须保留,所以从编译结果来看,反而使用的RAM多了。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-05-20
这里内存不是动态分配的,应该与申请和释放没有多大关系,具体怎么回事要看编译器如何编译的,可以在仿真的过程看看增加了那些内容。追问

可以给个判别的方法吗

追答

总共就三十几个字节,把全局的变量拉到观察窗口看看就知道了,编译器使用RAM一般是从某个地址起连续使用的。

第2个回答  2013-05-20
data是什么,恩貌似指的是ram空间吧,传统51也就256Byte。这块区域的话变大变小比如栈空间是编译器决定的,而内存释放啊之类的时动态的。所以data为何变大,应该是编译器的原因。个人意见

keil里面data怎么会变大?
这是因为,你删除的程序中,有几行是函数的调用,被你删除后,这些函数就只有函数体,却没有调用了(从编译信息看,是memory_clear_with_font_bgcolor)。当这个函数中有局部变量时,由于没被调用过,所以KEIL无法进行变量的优化,最后只能把局部变量保存下来,反而多占用了空间。解决办法:1、把不用函...

keil里面data怎么会变大?
data是什么,恩貌似指的是ram空间吧,传统51也就256Byte。这块区域的话变大变小比如栈空间是编译器决定的,而内存释放啊之类的时动态的。所以data为何变大,应该是编译器的原因。个人意见

keil C51中的data怎么设置成大一点的值?
在keil里面选择正确的单片机型号,各种型号对应了特定的ram 比如:89c51的128 Bytes On-chip RAM。比如将那些不改变的变量定义为code,比如unsigned char code a;可以用外扩的数据存储器,定义XDATA来改变变量的存储地方,比如XDATA signed char a;设置options for the target里面的target,如图。资源不够...

Keil C程序中定义的一维数组字节过大该怎么办?
idata 指向的片内ram ,大小范围为256字节,所以你一个数组定义在idata段内,不能超过256字节,超过就会报错。xdata指向的片外ram,大小范围为64KB,你可以将你需要的大容量数组定义在该段内。

keil如何修改52xdata大小
如果没有注册,代码大小就有限制。点击OPTIONS然后选TARGET,里面就可以设置了。在EDIT下的configuration中,或点击工具栏中的小扳手样的图标进入configuration弹出框。选择colors&fonts,选择EDITCFILES,右边选择txt,然后点FONT右边的选项,进行字体类型以及字体大小的修改。

用Keil编译程序时数据段过长怎么办?
per Functin”就是将每个函数都生成一个ELF文件,最会将需要的函数链接成一个大的ELF文件。但是如果没有勾选“One ELF Section per Functin”。Keil将每个文件编译成一个ELF文件(即使文件中用未被使用的函数),最会链接成一个ELF文件。所以勾选“One ELF Section per Functin”会使code变小。

keil里data字段被超出怎么办?
89C51只有128字节的RAM,但其中很多地址被特殊寄存器占用了,另外,你的中断、函数调用还要使用的堆栈也要使用RAM,所以你实际使用的RAM也就是80个字节左右,如果函数嵌套多,那么可使用的RAM就更少了。

单片机 keil c 关于 data段超出的问题
楼主:是这样的 xdata是不包括在256的,是单片机有XDATA才能调用。258是包括DATA和IDATA;分别对应低128和高128。

keil链接时data字段被超
是256字节,不过仍然只有低128字节可用作直接寻址的RAM,高128字节只有间接寻址时才是访问RAM。data超出了就应当分配到idata中。

Keil uvision4 程序中C程序定义的一维数组字节过大该怎么办?
首先,所有的52芯片都只有128字节的idata和128字节的data,再去除sfr和堆栈的开销,实际可使用的内部ram也就210以下。如果想开个320的数组,那就必须要用扩展ram,也就是xram,可以根据实际情况来选择外部sram,或者干脆选择自带xram的芯片,例如stc的几款。其次,要看是否真的需要这么大的缓存。如果是...

相似回答