打印

Keil C51 未调用函数没有提示却直接编译了进去? NOOVERLAY

[复制链接]
8826|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
AVRx007|  楼主 | 2009-12-15 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 AVRx007 于 2009-12-15 09:37 编辑

现在手上的一个工程,代码用的差不多(63K多,还没写完),优化却好像没有起作用

程序空间 64KB
前面 40KB是 MaskROM,厂家已经固化了代码在里面,用 *.LIN 锁定了地址, 通过*.LIB *.h来被调用
       *.LIN 里面指定了 部分 BIT,DATA,IDATA,XDATA,CODE 的编译位置,用定位MaskROM部分代码

后面 24KB是 SRAM(CODE接法),开机由MaskROM的引导代码自动从外部FLASH读程序。

厂家的LIB有一部分锁定在MaskROM,有一部分会编译到SRAM。 里面还用了间接跳转表

我只能修改这24KB的部分空间

却发现  
我写了部分函数,即使未调用这个函数,没有提示却直接编译了进去
厂家LIB里面也有很多未调用函数,照样编译进去了,定位MaskROM的无所谓,不过自由分配到SRAM的就好浪费

查看*.LIN 里面用了 NOOVERLAY ,所以会直接编译 未调用函数

如果去掉 NOOVERLAY,无法编译
1 间接跳转的
  *** WARNING L13: RECURSIVE CALL TO SEGMENT
2 未调用函数的  (好多个)
  *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS  

*** FATAL ERROR L232: APPLICATION CONTAINS TOO MANY RECURSIONS
Target not created

有什么方法能指定 前40KB 全部编译,而 后24KB 优化编译(起码能去掉 未调用函数)?

或者说
除了 *.LIN 锁定的函数/变量(位于 MaskROM 区) 不用优化之外 ,其他位置的就优化( 位于SRAM区)

相关帖子

沙发
huangqi412| | 2009-12-15 09:56 | 只看该作者
后面是你自己写的程序,你干吗不条件编译,,,不让它弄进去...相当于注释掉...:funk:

使用特权

评论回复
板凳
huangqi412| | 2009-12-15 09:56 | 只看该作者
后面是你自己写的程序,你干吗不条件编译,,,不让它弄进去...相当于注释掉...:funk:自己写的没调用的函数,,,干吗还要编进去?

使用特权

评论回复
地板
huangqi412| | 2009-12-15 09:57 | 只看该作者
自己写的没用到的函数,干吗还自己要编进片子里?

使用特权

评论回复
5
xlsbz| | 2009-12-15 10:04 | 只看该作者
大家好:我是keil
对于我来说,没有调用的函数 就是中断函数。

使用特权

评论回复
6
xlsbz| | 2009-12-15 10:05 | 只看该作者
我不但要将未调用函数编译进入,还要将未调用函数的所有局部变量都分配空间。

使用特权

评论回复
7
AVRx007|  楼主 | 2009-12-15 11:17 | 只看该作者
我写未调用的函数,只是用来测试 UNCALLED SEGMENT警告是否会产生。

主要是厂家LIB里面有好些未调用函数编译在SRAM区,浪费不少空间 (maskROM的无所谓)
keil 这个 UNCALLED SEGMENT 好麻烦。

使用特权

评论回复
8
AVRx007|  楼主 | 2009-12-15 11:32 | 只看该作者
只能说厂家的LIB没有细分 c/obj,
所以导致只要调用了c/obj里面任一个函数就会把整个c/obj编译进去,
包括哪些未调用的函数,也引发了 UNCALLED SEGMENT 。
为了消除 UNCALLED SEGMENT ,只能使用 NOOVERLAY

估计 间接跳转表的 WARNING L13: RECURSIVE CALL TO SEGMENT  也需要 NOOVERLAY 来消除

而用了 NOOVERLAY,就导致我自己写的未调用函数也没有提示却直接编译了进去

LIB里面的 UNCALL 浪费不少SRAM程序空间,好郁闷

使用特权

评论回复
9
因特网用户| | 2009-12-15 12:33 | 只看该作者
做lib要一个函数一个文件

使用特权

评论回复
10
x181084431| | 2010-8-16 14:27 | 只看该作者
在你的函数前面
写上
if(0)//不是条件编译  
{
   //把不用的函数写在里面
}
这样写就好了

使用特权

评论回复
11
ayb_ice| | 2010-8-16 15:05 | 只看该作者
谁规定没有调用的函数不能产生HEX代码,
假如不产生HEX,人家又有的说了,我的程序怎么没有产生代码
....

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

43

帖子

1

粉丝