keilc语⾔编程常见错误分析(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:can’t open file ‘beep.h’
说明在编译C:\8051\MANN.C 程序过程中由于main.c ⽤了指令#i nclude “beep.h”,但却不到所致解决⽅法编写⼀个beep.h 的包含档并存⼊到c:\8051 的⼯作⽬录中
4 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
解决办法:
1.是⽂件没有添加到⼯程⾥。
2.可能是因为存在没有被调⽤的已经定义的函数。
3.不知道你有没有把Source group组下⾯的A51.C删掉,如果没有删,在A51.c 上点右键,选择remove file " ".
4.建⼀个新的c⽂件,⾥⾯写⼀个空的函数,把该⽂件添加到project中,注意该⽂件不能再选generate assembler SRC file和assemble SRC file选项。重新编译⼯程,如果警告该函数没被调⽤,在主⽂件中调⼀下。
5.建⼀个新的c⽂件,把主⽂件中的⼏个函数移⾄该⽂件,把该⽂件添加到project中,注意该⽂件不能再选generate assembler
SRC file和assemble SRC
file选项。重新编译⼯程9***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:MUSIC3
MODULE:C:\8051\MUSIC.OBJ(MUSIC)
ADDRESS:0018H
在MUSIC3函数⾥⾯MUSIC这个参数有使⽤,没有申明。或者申明了没有实体。也就是说对于这个参数,编译器⽆法解析。10 ***ERROR 107:ADDESS SPACE OVERFLOW SPACE: DATA
SEGMENT: _DATA_GOUP_
LENGTH: 0018H
说明data空间已经不够⽤,原因是你可能有好多函数,⽽函数内部的局部变量⼜没有定义其空间,这种情况下,系统会将变量分配到你在Otions for Target 对话框⾥的设置的空间。如果你在下图所⽰中的Memory Model ⾥设置成Small:variables in DATA,则DATA空间很快便⽤完,导致data空间不够⽤。解决的办法有两种,⼀是通过更改Memory Model设置,可以设置成pdata或xdata,以便有⾜够⼤的空间,但这⼜带来新的问题,程序运⾏速度减慢,⽽且code代码也会加⼤,因为如果⼀个局部变量被存放在了xdata空间,汇编语⾔访问xdata空间的代码⼤⼩要⽐访问data空间的代码⼤,变量⼀旦很多,程序的代码也会逐渐增⼤;⼆是根据⾃⼰的要求设置变量的空间。所以这涉及到代码优化的问题,遇到具
体问题时,在运⾏速度和代码⼤⼩之间取得适合⾃⼰的情况
Project---->Option for target---->BL51 Locate选项卡,如上图红圈部分所⽰,根据⾃⼰系统的存储器分布情况,可以设置代码区间和XDATA区间。通常默认情况下,代码区间很⼩,所以会造成107号错误,根据需求,调⼤该范围即可。
11ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT SYMBOL: USARTDATACOUNT
SEGMENT: ?DT?USART_READWRITE
Ram空间不⾜:
外部变量:定义处不⽤加External,声明处要加External
将以data 型别定义的公共变量修改为idata 型别的定义
12***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: VOLUME
MODULE: C:\8051\OSDM.OBJ (OSDM)
ADDRESS: 4036H
定义了某某函数或全部变量在不同⽂件⾥⾯想调⽤它,却在包含头⽂件⾥⾯少了extern语句,或只有主程序和包含头⽂件没有(定义语句(函数)).
如果调试时有些if结构⾥的语句符合条件没有执⾏,或者某些语句不符合条件也被执⾏,那是因为if和else⾥有相同的语句,编译的时候作优化处理了。
13WARNING 15 (MULTIPLE CALL TO SEGMENT) 症状
原因
Warning 15向我们表明了linker发现了⼀个函数,这个函数不仅在main code⾥被调⽤了,⽽且在ISR(或者被ISR调⽤的函数中)被调⽤了。或者是被同时被多个ISR同时调⽤了。
这样会产⽣⼀个问题,就是在此函数不是⼀个可重⼊函数,⽽当此函数已经在执⾏时它可能被另⼀个ISR所调⽤。这样就会导致结果是可变的⽽且很可能会导致⼀些参数的错误。
另⼀个问题就是本地变量和参数所使⽤的内存可能被其他函数的内存覆盖。如果函数是由中断所调⽤的,则此函数的内存就会被使⽤。这会引起其它函数的内存错误。
解决⽅法
有⼏种⽅法去解决这个问题
如果你100%确认这个函数的两个副本都不会同时执⾏(如果此函数是被main调⽤并且中断是未被使能的)并且此函数没有使⽤内存(只使⽤的寄存器),那么你就可以忽略此警告
如果此函数使⽤了内存,你就要使⽤OVERLAY directive来将此函数从覆盖分析(overlay anaysis)中移除。举例如下:
OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)
如上语句能阻⽌被此函数使⽤的内存遭到覆盖。如果这个函数调⽤了你程序中其他的在别处的函数,那么你可能需要将这些函数也排除在覆盖分析之外。
如果当此函数在执⾏时可以被调⽤,那么事情就会变得⽐较的复杂。你可能需要:⽆论何时当从main中调⽤此函数时,需要关闭中断。你可能需要对被调⽤的函数使⽤#pragma disable。你也必须使⽤OVERLAY directive将此函数从overlay analysis中移除。为此函数创建两个副本。⼀个给main,⼀个给ISR。
使此函数可重⼊。
14E:\VCWORK\2815.C(826): error C236: '_wrbyte': different length of parameter lists
⼦函数⾥的形参声明的⽅式不对,需要每个参数都定义⼀下类型
E:\VCWORK\2815.C(743): error C183: unmodifiable lvalue
出现error C183: unmodifiable lvalue的错误,最后发现时存在⼀个数组是uchar code xx[5],后边把它⽤作接受串⼝的缓冲区,显⽰uchar code是不能改变的,是写在rom中的。应该改成uchar xx[5],这是写在ram中的
原因:修改了不能改变的变量,
E:\VCWORK\2815.C(799): error C242: 'array[]': too many initializers
15ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: _WRITE_DATA MODULE: .\ds18b20start.obj (DS18B20
c/c++语⾔中有很多地⽅要⽤到extern,但是如果没有真正的了解它的意义,会给编程带来很⼤的⿇烦,为了使⼤家少⾛弯路,特祥细的说明⼀下。
对于⽐较⼩的程序,⼀般只有⼀个c⽂件和⼀个头⽂件,全局变量我们通常会直接定义在c⽂件中,在程序之前加int i定义。如果要在头⽂件中定义有以下两种⽅法:⽤extern来声明:extern int i;这⼀句只是对变量i进⾏声明,在c ⽂件的程序之前必须加上int i进⾏定义。extern int i=0;这⼀句声明和定义都做了。
对于⼤⼀点的程序,有很多c⽂件和头⽂件,这个时候全局变量就必须在头⽂件中声明(不需要初始化),然后在⼀个c⽂件中定义(该初始化的要初始化)。如果在头⽂件中定义,则编译的时候会出现重复定义的错误。如果只有头⽂件中声明就会出现没有定义有警告。
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: K
MODULE: 222.obj (222)
出现上述错误则是因为变量k重复定义,把你的头⽂件中的变量定义前加extern(只是变量声明不⽤初始化),再在某⼀个你要调⽤该变量的c⽂件的程序之前再定义(注意第⼀个调⽤的c⽂件要负责附带初始化该变量,其他调⽤的c ⽂件就不需要初始化过程啦)
14MAIN.C(85): warning C259: 'parameter': pointer: different mspace
原因,函数调⽤时候的实参和声明时候的形参存储空间不同,修改成⼀致即可。
函数prototype16 E:\VC\2815\2815\FTOC.C(32): warning C231: '_memcpy': attempt to redefine intrinsic function
17*** ERROR L121: IMPROPER FIXUP
访问内存指令超出指令的寻址范围了,例如MOVX @Ri 指令超出了PDATA段的范围,或者是ACALL 指令超出了2k的寻址范围.
检查你的调⽤⼦函数的命令.特别是那些LCALL,ACALL等
18*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: MAIN
MODULE: C:\KEIL\C51\LIB\C51S.LIB (?C_INIT)
ADDRESS: 080DH
在main函数⾥⾯C_INIT这个参数有使⽤,没有申明。或者申明了没有实体。也就是说对于这个参数,编译器⽆法解析。
19keil4 warning C316:unterminated conditionals 今天⽤Keil4写程序时遇到这个问题:warning C316:unterminated conditionals
跑了⼏个论坛,在审视了⼀遍代码之后,知道了原因:
像类似XX.C(99):warning C316:unterminated conditionals这种警告的话XX.c⽂件有⼀个凌乱的条件编译或预编译。因为C语⾔中有些头⽂件中的预编译或宏定义,那么条件编译就避免不了。写条件编译时,可能有忘写⼀个基本的语句。⽐如说,你⽤了条件编译#ifndef⽽忘记写#endif。因为他们本来就是配套的。有前者必有后者。不能丢掉其中任何⼀个。⼀个include⽂件最后的#endif 少了# 前缀或者没有#endif,都会出现类似警告。就像你写C语句,你不会写了int i ⽽不能忘记写" ; " ,否者就不能把⼀个语句表达完整。
总之,出现上述问题。先看看整个C⽂件中是否出现上述错误,或整个⼯程中⾃⼰写的那些头⽂件中⾥⾯的条件编译是否都写对了,即:前⾯写了#ifndef,后⾯是否有对应的#endif。
20 DS1302.C(86): error C183: unmodifiable lvalue
code的内容只能读,不能改. 定义数组时把code去掉。
21 keil编译警告‘Argument':conversion:pointer to
non-pointer是什么问题
应该是参数传递错误,指针参数处传递了⾮指针参数。
22*** ERROR L114: SEGMENT DOES NOT FIT
块⼤⼩与⽬标设备不符。段溢出了,你的DATA区超过了256字节
你的idata变量太⼤(CEH),与器件容量不匹配。可能你的单⽚机型号选成31了,选个256字节内部RAM的应该就⾏,将定义为data的变量定义为xdata类型,问题解决了。
23 error C193 :bad operand type
% 取模不能⽤浮点数,
frequence 要转成整型来取模,⼩数位可以乘10后转整型来得到。
24 常见错误
error 1: Out of memory 内存溢出
error 2: Identifier expected 缺标识符
error 3: Unknown identifier 未定义的标识符
error 4: Duplicate identifier 重复定义的标识符
error 5: Syntax error 语法错误
error 6: Error in real constant 实型常量错误
error 7: Error in integer constant 整型常量错误
error 8: String constant exceeds line 字符串常量超过⼀⾏
error 10: Unexpected end of file ⽂件⾮正常结束
error 11: Line too long ⾏太长
error 12: Type identifier expected 未定义的类型标识符
error 13: Too many open files 打开⽂件太多
error 14: Invalid file name ⽆效的⽂件名
error 15: File not found ⽂件未到
error 16: Disk full 磁盘满
error 17: Invalid compiler directive ⽆效的编译命令
error 18: Too many files ⽂件太多
error 19: Undefined type in pointer def 指针定义中未定义类型
error 20: Variable identifier expected 缺变量标识符
error 21: Error in type 类型错误
error 22: Structure too large 结构类型太长
error 23: Set base type out of range 集合基类型越界
error 24: File components may not be files or objectsfile分量不能是⽂件或对象error 25: Invalid string length ⽆效的字符串长度error 26: Type mismatch 类型不匹配
error 27:error 27:Invalid subrange base type ⽆效的⼦界基类型
error 28:Lower bound greater than upper bound 下界超过上界
error 29:Ordinal type expected 缺有序类型
error 30:Integer constant expected 缺整型常量
error 31:Constant expected 缺常量
error 32:Integer or real constant expected 缺整型或实型常量
error 33:Pointer Type identifier expected 缺指针类型标识符
error 34:Invalid function result type ⽆效的函数结果类型
error 35:Label identifier expected 缺标号标识符
error 36:BEGIN expected 缺BEGIN
error 37:END expected 缺END
error 38:Integer expression expected 缺整型表达式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论