例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文件中添加定义即可,注意防止重定义。