• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

警告问题

唯爱小姑娘 2016-11-22 浏览量:615
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 一般的編譯器將函數中的區域變數動態配置在 stack,等函數結束空間就釋放出來。因為51內部RAM很少,所以編譯器為了折衷變數該配置成固定位址(靜態)還是防止佔用空間很久(動態),採用了data overlaying 技術


    data overlaying 是指沒有呼叫關係的函數,它們的區域變數區可以重疊在一起(共用一塊記憶體)。Keil C51 會分析程式中函數間呼叫的關係,產生一個呼叫樹。它就根據這個呼叫樹來決定那些函數的區域變數區可以 overlaying 在一起。一種情況是是編譯器發現某一個函數(不是 main)沒有被別的函數呼叫,這會造成編譯器的困惑。一個正常的程式,除了 main 之外,除非是垃圾程式碼(沒呼叫但沒有刪除),否則所有的函數應該是至少會被一個其它函數呼叫的。


    編譯器在安全至上的原則下,會認定它的分析無法正確的辨識這個函數呼叫關係,所以對這個函數的區域變數就會獨立配置,不會重疊配置。這樣有沒有問題?邏輯上當然不會有問題,但沒 overlaying 就是會浪費RAM,而且也會一直產生 *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS 的警告。


    經由以上解釋,您需要看看您的Code各函數的呼叫關係,如果有無用的函數,comment掉再進行編譯即可

    • 发布于 2016-11-22
    • 举报
    • 评论 1
    • 0
    • 0
唯爱小姑娘 回复了 MOP:谢谢以后会注意的,程序本身有点小问题 回复

其他答案 数量:2
  • 在Keil C中,如果没有显式调用到定义过的函数,就会出现这样的的警告。当出现这样的警告时,可以不用管,因为不影响其它部分。但是,我们知道,即使没有调用这个函数,Keil仍然把它编译连接进整个程序,不过浪费点ROM倒是不心疼。最主要的是,在这个函数中的变量,不会被列入覆盖分析范围内,也就是说这些变量占的空间不能被回收,这对于为数不多的RAM资源可是巨大的浪费啊。。。

    当这个不被调用的函数写在C文件中时,可以把它注释掉来解决这个问题。我想知道的是,当我将一组函数包装成lib文件时,又怎么解决问题呢?总不能每次都重新生成lib吧,这样的话移植性不就成问题了?还有,Keil自带的库中必然有很多函数,也必然有很多用不到的,为什么就不没有UNCALLED SEGMENT呢?我猜想它的lib的源代码有什么特殊的地方(我猜的)。小弟请教各位高手解决此问题的方法或技巧。

    //=========================================================================

    (1)

    可以用条件编译啊,
    #ifdef **
    (程序段1)
    #else
    (程序段2)
    #endif
    **是在前面用#define定义的标识符,作用是如果定义了**,就编译(程序段1),否则编译(程序段2).
    如果你一定要考虑可移植性的话,就这样做,否则还是

    (2)直接用注释符隐蔽掉,或者直接删掉,会比较快。

    //=========================================================================

    (3)想不显示这些提示:则可设置如下:

    option for target
    --->bl51 misc
    --->disable warning ==这里写入16
    • 发布于2016-11-22
    • 举报
    • 评论 1
    • 0
    • 0
唯爱小姑娘 回复了 LiuYang :谢谢,我知道啦 回复

  • WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    不影响运行啊,只是说你定义的函数没有调用而已
    • 发布于2016-11-22
    • 举报
    • 评论 1
    • 0
    • 0
唯爱小姑娘 回复了 Eagleson :现象出不来,表示定时器初始化那有警告,注释掉初始化就没有啦 回复

相关问题

问题达人换一批

警告问题