keilc语言编程常见错误分析 (1)

上传人:cn****1 文档编号:476183786 上传时间:2023-05-11 格式:DOCX 页数:17 大小:93.79KB
返回 下载 相关 举报
keilc语言编程常见错误分析 (1)_第1页
第1页 / 共17页
keilc语言编程常见错误分析 (1)_第2页
第2页 / 共17页
keilc语言编程常见错误分析 (1)_第3页
第3页 / 共17页
keilc语言编程常见错误分析 (1)_第4页
第4页 / 共17页
keilc语言编程常见错误分析 (1)_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《keilc语言编程常见错误分析 (1)》由会员分享,可在线阅读,更多相关《keilc语言编程常见错误分析 (1)(17页珍藏版)》请在金锄头文库上搜索。

1、1. Warning 280:i:unreferenced local variable说明局部变量i在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告及即定义的参数在程序中并未调用2 Warning 206:Music3:missing function-prototype说明Music3()函数未作宣告或未作外部宣告所以无法给其他函数调 用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3Error:318:cant open file beep h说明在编译C:8051

2、MANNC程序过程中由于mainc用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beeph的包 含档并存入到c:8051的工作目录中4 Error 237:LedOn:function already has a body说明LedOn()函数名称重复定义即有两个以上一样的函数名称 解决方法修正其中的一个函数名称使得函数名称都是独立的5 *WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms()函数未被其它函数调用也会占用程序记

3、忆体空间解决方法去掉DelayX1ms()函数或利用条件编译#if.#endif,可保留该函数并不编译6 *WARNING 6 :XDATA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM的0025H重复定义地址解决方法外部资料ROM的定义如下Pdata unsigned charXFR_ADC _at_0x25其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25处并修正它7 WARNING 206:DelayX1ms: missing function-prototypeC:8051INPUT.CError

4、 267 :DelayX1ms :requires ANSI-style prototypeC:8051INPUT.C说明程序中有调用DelayX1ms函数但该函数没定义即未编写程序 内容或函数已定义但未作宣告解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部宣 告可在delay.h的包含档宣告成外部以便其它函数调用8 *WARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMB0L:MUSIC3解决办法:1. 是文件没有添加到工程里。2. 可能是因为存在没有被调用的已经定义的函数。3.不知道你有没有把 Source group 组下面的 A51.C 删掉,如

5、果没有删,在 A51.c 上点右键,选择 remove file .4.建一个新的 c 文件,里面写一个空的函数,把该文件添加到 project 中,注意 该文件不能再选 gen erate assembler SRC file 和 assemble SRC file 选项。重新 编译工程,如果警告该函数没被调用,在主文件中调一下。5建一个新的c文件,把主文件中的几个函数移至该文件,把该文件添加到 project 中,注意该文件不能再选 generate assembler SRC file 和 assemble SRCfile 选项。重新编译工程 9*WARNING 2:REFERENCE

6、MADE TOUNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:8051MUSIC O BJ(MUSIC)ADDRESS:0018H在MUSIC3函数里面MUSIC这个参数有使用,没有申明。或 者申明了没有实体。也就是说对于这个参数,编译器无法解析。10 *ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H说明data空间已经不够用,原因是你可能有好多函数,而函数内部的局部变量又没有定义 其空间,这种情况下,系统会将变量分配到你在Otions for Target

7、对话框里的设置的空间。 如果你在下图所示中的Memory Model里设置成Small:variables in DATA,则DATA空间 很快便用完,导致data空间不够用。解决的办法有两种,一是通过更改Memory Model设 置,可以设置成pdata或xdata,以便有足够大的空间,但这又带来新的问题,程序运行速 度减慢,而且code代码也会加大,因为如果一个局部变量被存放在了 xdata空间,汇编语 言访问xdata空间的代码大小要比访问data空间的代码大,变量一旦很多,程序的代码也 会逐渐增大;二是根据自己的要求设置变量的空间。所以这涉及到代码优化的问题,遇到具体问题时,在运行速

8、度和代码大小之间取得适合自己的情况Project 0pt ion for target BL51 Loca te 选项卡,如上图红圈部分所 示,根据自己系统的存储器分布情况,可以设置代码区间和XDATA区间。通常默 认情况下,代码区间很小,所以会造成107号错误,根据需求,调大该范围即可。11 ERROR L105: PUBLIC REFERS TO IGNORED SEGMENTSYMBOL: USARTDATACOUNTSEGMENT: ?DT?USART_READWRITERam空间不足:外部变量:定义处不用加External,声明处要加External将以data型别定义的公共变量修改

9、为idata型别的定义12*ERROR 118: REFERENCE MADE TO ERRONEOUSEXTERNALSYMBOL: VOLUMEMODULE: C:8051OSDM OBJ (OSDM)ADDRESS: 4036H定义了某某函数或全部变量在不同文件里面想调用它,却在包含头文 件里面少了 extern语句,或只有主程序和包含头文件没有 (EXTERN定义语句(函数).如果调试时有些if结构里的语句符合条件没有执行,或者某些语句不 符合条件也被执行,那是因为if和else里有相同的语句,编译的时 候作优化处理了。13WARNING 15 (MULTIPLE CALL TO SE

10、GMENT)症状原因Warning 15向我们表明了 linker发现了一个函数,这个函数不仅在 main code里被调用了,而且在ISR (或者被ISR调用的函数中)被 调用了。或者是被同时被多个ISR同时调用了。这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函 数已经在执行时它可能被另一个ISR所调用。这样就会导致结果是 可变的而且很可能会导致一些参数的错误。另一个问题就是本地变量和参数所使用的内存可能被其他函数的内 存覆盖。如果函数是由中断所调用的,则此函数的内存就会被使用。 这会引起其它函数的内存错误。解决方法有几种方法去解决这个问题如果你100%确认这个函数的两个副本都

11、不会同时执行(如果此函数 是被main调用并且中断是未被使能的)并且此函数没有使用内存(只 使用的寄存器),那么你就可以忽略此警告 如果此函数使用了内存,你就要使用OVERLAY directive来将此函数从覆盖分析(overlay anaysis)中移除。举例如下:OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)如上语句能阻止被此函数使用的内存遭到覆盖。如果这个函数调用了 你程序中其他的在别处的函数,那么你可能需要将这些函数也排除在 覆盖分析之外。如果当此函数在执行时可以被调用,那么事情就会变得比较的复杂。 你可能需要:无论何时当从main中调用此函

12、数时,需要关闭中断。 你可能需要对被调用的函数使用#pragma disable。你也必须使用OVERLAY directive将此函数从overlay analysis中移除。为此函数 创建两个副本。一个给main, 个给ISR。使此函数可重入。14 E:VCWORK2815C(826): error C236: _wrbyte: different length of parameter lists子函数里的形参声明的方式不对,需要每个参数都定义一下类型E:VCWORK2815.C(743): error C183: unmodifiable lvalue出现error C183: unm

13、odifiable lvalue的错误,最后发现时存在一个数组是ucharcode xx5,后边把它用作接受串口的缓冲区,显示uchar code是不能改变的, 是写在rom中的。应该改成uchar xx5,这是写在ram中的原因:修改了不能改变的变量,E:VCWORK2815.C(799): error C242: array: too many initializers15ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL:_WRITE_DATA MODULE: .ds18b20start.obj (DS18B20c/c+语言中有很多地方要用到ex

14、tern,但是如果没有真正的了解它的意义,会 给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下。对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通 常会直接定义在c文件中,在程序之前加int i定义。如果要在头文件中定义有以 下两种方法:用extern来声明:extern int i;这一句只是对变量i进行声明,在c 文件的程序之前必须加上int i进行定义。extern int i=0;这一句声明和定义都做 了。对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头 文件中声明(不需要初始化),然后在一个c文件中定义(该初始化的要初始化)。 如果在头文件中

15、定义,则编译的时候会出现重复定义的错误。如果只有头文件中 声明就会出现没有定义有警告。* ERROR L104: MULTIPLE PUBLIC DEFINITIONSSYMBOL: KMODULE: 222.obj (222)出现上述错误则是因为变量 k重复定义,把你的头文件中的变量定义前加 extern(只是变量声明不用初始化),再在某一个你要调用该变量的c文件的程序 之前再定义(注意第一个调用的c文件要负责附带初始化该变量,其他调用的c 文件就不需要初始化过程啦)14MAIN.C(85): warning C259: parameter: pointer: different mspace 原因,函数调用时候的实参和声明时候的形参存储空间不同,修改成一致即可。16 E:VC28152815FTOC C(32): warning C231: _memcpy:attempt to redefine intrinsic function17* ERROR L121: IMPROPER FIXUP访问内存指令超出指令的寻址范围了,例如MOVX Ri指令超出 了 PDATA段的范围,或者是ACALL指令超出了

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号