[原创] keil51中的致命warning

piggyfeng   2010-10-16 14:51 楼主

例1:WARNING L15: MULTIPLE CALL TO SEGMENT
            SEGMENT: ?PR?_WRTOROM?WORKTIME_02
            CALLER1: ?PR?TIM?WORKTIME_02
           CALLER2: ?C_C51STARTUP

   以上warning说明函数WRTOROM()被调用多次(multiple),而且不理睬该warning,往往无法在开发板上得到理想的实验结果。

  分析:我们想想平时短延时函数delay()在一个工程程序里头都调用多次,却不会有warning,那何时才会出现多次调用的warning呢?

         caller指出了调用者是谁,caller1指出worktime_02文件下的tim(其实这个是我写的中断程序的函数名)函数体中有调用,

        caller2指出main()函数中也有调用WRTOROM(),问题就在这里了,keil有规定,中断服务程序不可调用main()函数中调用过的

        子程序。

解决办法:为保持main函数的简单明了,一般采取的方法是主函数正常调用,而中断服务子程序可采用直接展开法,而不直接调用需要的那个函数。

 

例2.

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  DIS_HOUR_GEWE
    MODULE:  main.obj (MAIN)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  DIS_HOUR_GEWE
    MODULE:  main.obj (MAIN)

 

分析:可见其中外部变量(external)DIS_HOUR_GEWE 在main文件(一般为main.c)中悬而未决。如此看来,C文件中或自定义的头文件中声明了extern变量,而这个变量在本文件外部并没发现有,很可能是变量名不一致,或者外部文件根本就没有这个变量,所以就会出现这两个致命性警告,而这两个warning是成对出现的。


解决方法:查看extern变量和外部文件中对应定义的变量,名字修改成一致即可。没有的话直接在需要用的c文件中添加定义即可,注意防止重定义。


   

勇往直前,协作共进,开创未来。

回复评论 (7)

另外大家用keil51开发时遇到什么致命性(不得不改)的warning的,可以发上来,大家讨论一下解决之道,也可和我们分享你的解决思路,共同进步啊,感谢万分!
勇往直前,协作共进,开创未来。
点赞  2010-10-16 14:54
这个好,以前不怎么在意,但是,的确很重要
点赞  2010-10-16 15:51

支持楼主~~

 

做自己喜欢的设计就是一种幸福~~~
点赞  2010-10-16 16:01
以前的学习没怎么看啊,现在看到楼主说出来还真是啊
我爱电子!
点赞  2010-10-16 16:42
顶死你!!!!!
小草眼中的世界!
点赞  2010-10-22 12:53
顶死你!!!!!
小草眼中的世界!
点赞  2010-10-22 12:53

恩,上边两个问题我也常犯

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2010-10-22 13:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复