[技术问答] N76E003 内存

[复制链接]
757|18
 楼主 | 2019-8-26 08:35 | 显示全部楼层 |阅读模式
Program Size: data=108.1 xdata=555 code=7128
这是正常编译的内存大小。
注释掉主循环中的一个调用函数,占用内存大小
Program Size: data=132.1 xdata=626 code=7125

该函数内部有局部变量,增大的内存刚好为函数内部内存大小。
为什么注释掉该函数,占用的内存会增大,而没有注释前,系统的内存时如何分配的?我用表统计data ,idata ,xdata区域占用内存与mdk生成的内存大小并不相等。

使用特权

评论回复
| 2019-8-26 09:15 | 显示全部楼层
这都是编译器干的事情,谁知道咋回事呢,毕竟是人家写的

使用特权

评论回复
| 2019-8-26 13:19 | 显示全部楼层
編譯後,可以查看MAP FILE,檢查ROM, RAM的使用量

使用特权

评论回复
| 2019-8-26 13:25 | 显示全部楼层
这个很正常的,比如,一个函数,没有调用到,占内存100,调用了,反而只占80的内存。

使用特权

评论回复
 楼主 | 2019-8-26 14:21 | 显示全部楼层
gx_huang 发表于 2019-8-26 13:25
这个很正常的,比如,一个函数,没有调用到,占内存100,调用了,反而只占80的内存。 ...

正常现象不应该是:一个函数,没有调用,占用内存80;调用了,占用100吗?

使用特权

评论回复
 楼主 | 2019-8-26 14:48 | 显示全部楼层
/*测试函数,内存20字节数据,内存区域idata*/
void test_func(void)
{
        unsigned char idata test_num[20];
}
在主函数中调用该函数
占用内存情况:Program Size: data=108.1 xdata=546 code=7375

在主函数中注释掉该函数
占用内存情况:Program Size: data=128.1 xdata=546 code=7372

所以哪一个才是数据的真正内存?没有注释前的这20个字节又跑到了哪里?为什么注释掉反而内存变大了?

使用特权

评论回复
| 2019-8-26 15:00 | 显示全部楼层
无聊逛1逛 发表于 2019-8-26 14:21
正常现象不应该是:一个函数,没有调用,占用内存80;调用了,占用100吗? ...

KEIL C51,一个没有用到的函数,反而占用更多的内存。
这不正常,但是实际就是这样的。
你调用了,编译系统认为少量内存即可,你不调用,他按照可能的最大内存分配。
所以,我的程序,无关的函数全部注释掉,没有一个警告。

使用特权

评论回复
| 2019-8-26 22:58 | 显示全部楼层
是不是在程序中创建了该函数,没有取消啊

使用特权

评论回复
| 2019-8-26 22:59 | 显示全部楼层
你彻底取消该函数试试。

使用特权

评论回复
| 2019-8-26 23:20 | 显示全部楼层
Keil C51中,如何优化掉未调用函数
把target options中的device页中选上"Use LX51 ...",然后在LX51 Misc页中的Misc Control中填入"REMOVEUNUSED",确认后重新编译即可自动去掉未调用的函数。
来自:
https://www.cnblogs.com/luckyqiao/p/3591624.html

使用特权

评论回复

评论

whtwhtw 2019-8-27 10:23 回复TA
给力 
| 2019-8-27 00:01 | 显示全部楼层
你把被调用的函数注释掉了吗

使用特权

评论回复
| 2019-8-27 00:01 | 显示全部楼层
如果只是不在主函数调用,而前面定义了这个函数,就会开辟一个空间给它。

使用特权

评论回复
| 2019-8-27 00:01 | 显示全部楼层
所以你的空间反而可能大了,为了可能的调用预留了大量的空间。

使用特权

评论回复
| 2019-8-27 00:02 | 显示全部楼层
所以编译器有时候提示你,你定义的某个函数在程序中没有被使用。

使用特权

评论回复
 楼主 | 2019-8-27 10:00 | 显示全部楼层
jekey 发表于 2019-8-26 23:20
Keil C51中,如何优化掉未调用函数
把target options中的device页中选上"Use LX51 ...",然后在LX51 Misc页 ...

优化后,主循环中注释掉调用函数。
编译后keil生成 内存大小 确实少了20个字节 data=78.1。
data = 108.1 是程序实际占用的内存大小。
如果不优化直接注释掉函数,平白无故多占用了40个字节,很奇怪。

使用特权

评论回复
| 2019-8-27 11:10 | 显示全部楼层
无聊逛1逛 发表于 2019-8-27 10:00
优化后,主循环中注释掉调用函数。
编译后keil生成 内存大小 确实少了20个字节 data=78.1。
data = 108.1 ...

这个是keil c51把未调用的函数也分配内存了,并且是独立的不是共享的。

使用特权

评论回复
| 2019-8-27 13:10 | 显示全部楼层
不被调用的函数,不能参与数据覆盖分析(相当于中断函数),不能与其它局部变量共享内存,所以是独立的,所以就反而数据多了

在一个不可能被调用的地方调用一下就可以了
比如
uchar i;

if ((uint)i > 256)
{
    call_xxxx....
}

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

在线客服 快速回复 返回顶部 返回列表