1.Warning 280:’i’:unreferenced local variable 说明局部变量i在函数中未作任何的存取操作解决方法消除函数中i变量的宣告 2 Warning 206:’Music3’:missing function-prototype 说明Music3()函数未作宣告或未作外部宣告所以无法给其他函数调用 解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告 3 Compling:C:\8051\MANN.C Error:318:can’t open file‘beep.h’ 说明在编译C:\8051\MANN.C程序过程中由于main.c用了指令#i nclude“beep.h”,但却找不到所致解决方法编写一个beep.h的包含档并存入到c:\8051的工作目录中 4 Compling:C:\8051\LED.C Error 237:’LedOn’:function already has a body 说明LedOn()函数名称重复定义即有两个以上一样的函数名称 解决方法修正其中的一个函数名称使得函数名称都是独立的 5***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT:?PR?_DELAYX1MS?DELAY 说明DelayX1ms()函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms()函数或利用条件编译#if…..#endif,可保留该函数并不编译 6***WARNING 6:XDATA SPACE MEMORY OVERLAP FROM:0025H TO:0025H 说明外部资料ROM的0025H重复定义地址 解决方法外部资料ROM的定义如下Pdata unsigned char XFR_ADC_at_0x25其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25处并修正它 7 WARNING 206:’DelayX1ms’:missing function-prototype C:\8051\INPUT.C Error 267:’DelayX1ms‘:requires ANSI-style prototype C:\8051\INPUT.C 说明程序中有调用DelayX1ms函数但该函数没定义即未编写程序内容或函数已定义但未作宣告 解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用 8***WARNING 1:UNRESOLVED EXTERNAL SYMBOL SYMBOL:MUSIC3 MODULE:C:\8051\MUSIC.OBJ(MUSIC) ***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL:MUSIC3 MODULE:C:\8051\MUSIC.OBJ(MUSIC) ADDRESS:0018H 说明程序中有调用MUSIC函数但未将该函数的含扩档C加入到工程档Prj作编译和连接 解决方法设MUSIC3函数在MUSIC C里将MUSIC C添加到工程文件中去 9***ERROR 107:ADDESS SPACE OVERFLOW SPACE ATA SEGMENT:_DATA_GOUP_ LENGTH:0018H ***ERROR 118:REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL:VOLUME MODULE:C:\8051\OSDM.OBJ(OSDM) ADDRESS:4036H 说明data存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存 储模式设为SMALL则局部变量先使用工作寄存器R2~R7作暂存当存储器不够用时则会 以data型别的空间作暂存的个数超过0x7f时就会出现地址不够的现象 解决方法将以data型别定义的公共变量修改为idata型别的定义 说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的 解决办法加以归纳以期共享 10定义了全局变量而没有外部External声明:reference made to erroneous external Ram空间不足:public refers to ignore segment 外部变量:定义处不用加External,声明处要加External 将以data型别定义的公共变量修改为idata型别的定义 11***ERROR L118:REFERENCE MADE TO ERRONEOUS EXTERNAL 定义了某某函数或全部变量在不同文件里面想调用它,却在包含头文件里面少了extern语句,或只有主程序和包含头文件没有(EXTERN......定义语句(函数)). 如果调试时有些if结构里的语句符合条件没有执行,或者某些语句不符合条件也被执行,那是因为if和else里有相同的语句,编译的时候作优化处理了。 12 WARNING 15(MULTIPLE CALL TO SEGMENT)症状 我添加了一个中断处理程序(ISR)到我的项目中,然而我却得到了如下的警告: ***WARNING L15:MULTIPLE CALL TO SEGMENT SEGMENT:?PR?_WRITE_GMVLX1_REG?D_GMVLX1 CALLER1:?PR?VSYNC_INTERRUPT?MAIN CALLER2:?C_C51STARTUP ***WARNING L15:MULTIPLE CALL TO SEGMENT SEGMENT:?PR?_SPI_SEND_WORD?D_SPI CALLER1:?PR?VSYNC_INTERRUPT?MAIN CALLER2:?C_C51STARTUP ***WARNING L15:MULTIPLE CALL TO SEGMENT SEGMENT:?PR?SPI_RECEIVE_WORD?D_SPI CALLER1:?PR?VSYNC_INTERRUPT?MAIN CALLER2:?C_C51STARTUP 上面这些都是什么?我该如何解决这个问题呢? 原因 Warning 15向我们表明了linker发现了一个函数,这个函数不仅在main code里被调用了,而且在ISR(或者被ISR调用的函数中)被调用了。或者是被同时被多个ISR同时调用了。 这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函数已经在执行时它可能被另一个ISR所调用。这样就会导致结果是可变的而且很可能会导致一些参数的错误。 另一个问题就是本地变量和参数所使用的内存可能被其他函数的内存覆盖。如果函数是由中断所调用的,则此函数的内存就会被使用。这会引起其它函数的内存错误。 举例来说,对于你的第一个警告,WRITE_GMVLX1_REG是会被多个root所调用。其被定义在D_GMVLX1.C或者D_GMVLX1.A51中。他不仅会被ISR(或者被ISR调用的函数)而且也会被MAIN.C中的VSYNC_INTERRUPT函数所调用。 解决方法 有几种方法去解决这个问题 如果你100%确认这个函数的两个副本都不会同时执行(如果此函数是被main调用并且中断是未被使能的)并且此函数没有使用内存(只使用的寄存器),那么你就可以忽略此警告。 如果此函数使用了内存,你就要使用OVERLAY directive来将此函数从覆盖分析(overlay anaysis)中移除。举例如下: OVERLAY(?PR?_WRITE_GMVLX1_REG?D_GMVLX1!*) 如上语句能阻止被此函数使用的内存遭到覆盖。如果这个函数调用了你程序中其他的在别处的函数,那么你可能需要将这些函数也排除在覆盖分析之外。 如果当此函数在执行时可以被调用,那么事情就会变得比较的复杂。你可能需要: 无论何时当从main中调用此函数时,需要关闭中断。你可能需要对被调用的函数使用#pragma disable。你也必须使用OVERLAY directive将此函数从overlay analysis中移除。 为此函数创建两个副本。一个给main,一个给ISR。 使此函数可重入。举例如下: void myfunc(void)reentrant{ ... } 上面的定义会产生一个用来存储参数和本地变量的可重入的栈。如果使用了这种方法那么这个可重入的栈必须在STARTUP.A51中配置。这样会花费更多的RAM并且会减缓可冲入函数的执行
|