keilc语言编程常见错误分析Word文档下载推荐.docx
《keilc语言编程常见错误分析Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《keilc语言编程常见错误分析Word文档下载推荐.docx(20页珍藏版)》请在冰点文库上搜索。
说明程序中有调用DelayX1ms函数但该函数没定义即未编写程序内容或函数已定义但未作宣告
解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用
8***WARNING1:
UNRESOLVEDEXTERNALSYMBOL
SYMBOL:
MUSIC3
解决办法:
1.是文件没有添加到工程里。
2.可能是因为存在没有被调用的已经定义的函数。
3.不知道你有没有把Sourcegroup组下面的A51.C删掉,如果没有删,在A51.c上点右键,选择removefile"
"
.
4.建一个新的c文件,里面写一个空的函数,把该文件添加到project中,注意该文件不能再选generateassemblerSRCfile和assembleSRCfile选项。
重新编译工程,如果警告该函数没被调用,在主文件中调一下。
5.建一个新的c文件,把主文件中的几个函数移至该文件,把该文件添加到project中,注意该文件不能再选generateassemblerSRCfile和assembleSRCfile选项。
重新编译工程
9***WARNING2:
REFERENCEMADETOUNRESOLVEDEXTERNAL
MODULE:
\8051\MUSIC.OBJ(MUSIC)
ADDRESS:
0018H
在MUSIC3函数里面MUSIC这个参数有使用,没有申明。
或者申明了没有实体。
也就是说对于这个参数,编译器无法解析。
10***ERROR107:
ADDESSSPACEOVERFLOW
SPACE:
DATA
_DATA_GOUP_
LENGTH:
0018H
说明data空间已经不够用,原因是你可能有好多函数,而函数内部的局部变量又没有定义其空间,这种情况下,系统会将变量分配到你在OtionsforTarget对话框里的设置的空间。
如果你在下图所示中的MemoryModel里设置成Small:
variablesinDATA,则DATA空间很快便用完,导致data空间不够用。
解决的办法有两种,一是通过更改MemoryModel设置,可以设置成pdata或xdata,以便有足够大的空间,但这又带来新的问题,程序运行速度减慢,而且code代码也会加大,因为如果一个局部变量被存放在了xdata空间,汇编语言访问xdata空间的代码大小要比访问data空间的代码大,变量一旦很多,程序的代码也会逐渐增大;
二是根据自己的要求设置变量的空间。
所以这涉及到代码优化的问题,遇到具体问题时,在运行速度和代码大小之间取得适合自己的情况
Project---->
Optionfortarget---->
BL51Locate选项卡,如上图红圈部分所示,根据自己系统的存储器分布情况,可以设置代码区间和XDATA区间。
通常默认情况下,代码区间很小,所以会造成107号错误,根据需求,调大该范围即可。
11ERRORL105:
PUBLICREFERSTOIGNOREDSEGMENT
SYMBOL:
USARTDATACOUNT
SEGMENT:
DT?
USART_READWRITE
Ram空间不足:
外部变量:
定义处不用加External,声明处要加External
将以data型别定义的公共变量修改为idata型别的定义
12***ERROR118:
REFERENCEMADETOERRONEOUSEXTERNAL
VOLUME
C:
\8051\OSDM.OBJ(OSDM)
4036H
定义了某某函数或全部变量在不同文件里面想调用它,却在包含头文件里面少了extern语句,或只有主程序和包含头文件没有(EXTERN......定义语句(函数)).
如果调试时有些if结构里的语句符合条件没有执行,或者某些语句不符合条件也被执行,那是因为if和else里有相同的语句,编译的时候作优化处理了。
13WARNING15(MULTIPLECALLTOSEGMENT)症状
原因
Warning15向我们表明了linker发现了一个函数,这个函数不仅在maincode里被调用了,而且在ISR(或者被ISR调用的函数中)被调用了。
或者是被同时被多个ISR同时调用了。
这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函数已经在执行时它可能被另一个ISR所调用。
这样就会导致结果是可变的而且很可能会导致一些参数的错误。
另一个问题就是本地变量和参数所使用的内存可能被其他函数的内存覆盖。
如果函数是由中断所调用的,则此函数的内存就会被使用。
这会引起其它函数的内存错误。
解决方法
有几种方法去解决这个问题
如果你100%确认这个函数的两个副本都不会同时执行(如果此函数是被main调用并且中断是未被使能的)并且此函数没有使用内存(只使用的寄存器),那么你就可以忽略此警告
如果此函数使用了内存,你就要使用OVERLAYdirective来将此函数从覆盖分析(overlayanaysis)中移除。
举例如下:
OVERLAY(?
_WRITE_GMVLX1_REG?
D_GMVLX1!
*)
如上语句能阻止被此函数使用的内存遭到覆盖。
如果这个函数调用了你程序中其他的在别处的函数,那么你可能需要将这些函数也排除在覆盖分析之外。
如果当此函数在执行时可以被调用,那么事情就会变得比较的复杂。
你可能需要:
无论何时当从main中调用此函数时,需要关闭中断。
你可能需要对被调用的函数使用#pragmadisable。
你也必须使用OVERLAYdirective将此函数从overlayanalysis中移除。
为此函数创建两个副本。
一个给main,一个给ISR。
使此函数可重入。
14E:
\VCWORK\2815.C(826):
errorC236:
'
_wrbyte'
:
differentlengthofparameterlists
子函数里的形参声明的方式不对,需要每个参数都定义一下类型
E:
\VCWORK\2815.C(743):
errorC183:
unmodifiablelvalue
出现errorC183:
unmodifiablelvalue的错误,最后发现时存在一个数组是ucharcodexx[5],后边把它用作接受串口的缓冲区,显示ucharcode是不能改变的,是写在rom中的。
应该改成ucharxx[5],这是写在ram中的
原因:
修改了不能改变的变量,
\VCWORK\2815.C(799):
errorC242:
array[]'
toomanyinitializers
15ERRORL104:
MULTIPLEPUBLICDEFINITIONSSYMBOL:
_WRITE_DATAMODULE:
.\ds18b20start.obj(DS18B20
c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下。
对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通常会直接定义在c文件中,在程序之前加inti定义。
如果要在头文件中定义有以下两种方法:
用extern来声明:
externinti;
这一句只是对变量i进行声明,在c文件的程序之前必须加上inti进行定义。
externinti=0;
这一句声明和定义都做了。
对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头文件中声明(不需要初始化),然后在一个c文件中定义(该初始化的要初始化)。
如果在头文件中定义,则编译的时候会出现重复定义的错误。
如果只有头文件中声明就会出现没有定义有警告。
***ERRORL104:
MULTIPLEPUBLICDEFINITIONS
K
MODULE:
222.obj(222)
出现上述错误则是因为变量k重复定义,把你的头文件中的变量定义前加extern(只是变量声明不用初始化),再在某一个你要调用该变量的c文件的程序之前再定义(注意第一个调用的c文件要负责附带初始化该变量,其他调用的c文件就不需要初始化过程啦)
14MAIN.C(85):
warningC259:
parameter'
pointer:
differentmspace
原因,函数调用时候的实参和声明时候的形参存储空间不同,修改成一致即可。
16E:
\VC\2815\2815\FTOC.C(32):
warningC231:
_memcpy'
attempttoredefineintrinsicfunction
17***ERRORL121:
IMPROPERFIXUP
访问内存指令超出指令的寻址范围了,例如MOVX@Ri指令超出了PDATA段的范围,或者是ACALL指令超出了2k的寻址范围.
检查你的调用子函数的命令.特别是那些LCALL,ACALL等
18***WARNINGL2:
REFERENCEMADETOUNRESOLVEDEXTERNAL
MAIN
\KEIL\C51\LIB\C51S.LIB(?
C_INIT)
ADDRESS:
080DH
在main函数里面C_INIT这个参数有使用,没有申明。
19keil4warningC316:
unterminatedconditionals
今天用Keil4写程序时遇到这个问题:
warningC316:
unterminatedconditionals
跑了几个论坛,在审视了一遍代码之后,知道了原因:
像类似XX.C(99):
unterminatedconditionals这种警告的话XX.c文件有一个凌乱的条件编译或预编译。
因为C语言中有些头文件中的预编译或宏定义,那么条件编译就避免不了。
写条件编译时,可能有忘写一个基本的语句。
比如说,你用了条件编译#ifndef而忘记写#endif。
因为他们本来就是配套的。
有前者必有后者。
不能丢掉其中任何一个。
一个include文件最后的#endif少了#前缀或者没有#endif,都会出现类似警告。
就像你写C语句,你不会写了inti
而不能忘记写"
;
,否者就不能把一个语句表达完整。
总之,出现上述问题。
先看看整个C文件中是否出现上述错误,或整个工程中自己写的那些头文件中里面的条件编译是否都写对了,即:
前面写了#ifndef,后面是否有对应的#endif。
20DS1302.C(86):
code的内容只能读,不能改.定义数组时把code去掉。
21keil编译警告‘Argument'
conversion:
pointertonon-pointer是什么问题
应该是参数传递错误,指针参数处传递了非指针参数。
22***ERRORL114:
SEGMENTDOESNOTFIT
块大小与目标设备不符。
段溢出了,你的DATA区超过了256字节
你的idata变量太大(CEH),与器件容量不匹配。
可能你的单片机型号选成31了,选个256字节内部RAM的应该就行,将定义为data的变量定义为xdata类型,问题解决了。
23errorC193:
badoperandtype
%取模不能用浮点数,
frequence要转成整型来取模,小数位可以乘10后转整型来得到。
24常见错误
error
1:
Out
of
memory
内存溢出
2:
Identifier
expected
缺标识符
3:
Unknown
identifier
未定义的标识符
4:
Duplicate
重复定义的标识符
5:
Syntax
语法错误
6:
Error
in
real
constant
实型常量错误
7:
integer
整型常量错误
8:
String
exceeds
line
字符串常量超过一行
10:
Unexpected
end
file
文件非正常结束
11:
Line
too
long
行太长
12:
Type
未定义的类型标识符
13:
Too
many
open
files
打开文件太多
14:
Invalid
name
无效的文件名
15:
File
not
found
文件未找到
16:
Disk
full
磁盘满
17:
compiler
directive
无效的编译命令
18:
文件太多
19:
Undefined
type
pointer
def
指针定义中未定义类型
20:
Variable
缺变量标识符
21:
类型错误
22:
Structure
large
结构类型太长
23:
Set
base
out
range
集合基类型越界
24:
components
may
be
or
objectsfile分量不能是文件或对象
25:
string
length
无效的字符串长度
26:
mismatch
类型不匹配
27:
subrange
无效的子界基类型
28:
Lower
bound
greater
than
upper
下界超过上界
29:
Ordinal
缺有序类型
30:
Integer
缺整型常量
31:
Constant
缺常量
32:
缺整型或实型常量
33:
Pointer
缺指针类型标识符
34:
function
result
无效的函数结果类型
35:
Label
缺标号标识符
36:
BEGIN
缺BEGIN
37:
END
缺END
38:
expression
缺整型表达式
39:
缺有序类型表达式
40:
Boolean
缺布尔表达式
41:
Operand
types
do
match
操作数类型不匹配
42:
表达式错误
43:
Illegal
assignment
非法赋值
44:
Field
缺域标识符
45:
Object
目标文件太大
46:
external
未定义的外部过程与函数
47:
object
record
无效的OBJ文件格式
48:
Code
segment
代码段太长
49:
Data
数据段太长
50:
DO
缺DO
51:
PUBLIC
definition
无效的PUBLIC定义
52:
EXTRN
无效的EXTRN定义
53:
definitions
太多的EXTRN定义
54:
OF
缺OF
55:
INTERFACE
缺INTERFACE
56:
relocatable
reference
无效的可重定位引用
57:
THEN
缺THEN
58:
TO
DOWNTO
缺TO或DOWNTO
59:
Un