keilc语言编程常见错误分析.docx

上传人:b****8 文档编号:10650063 上传时间:2023-02-22 格式:DOCX 页数:20 大小:57.89KB
下载 相关 举报
keilc语言编程常见错误分析.docx_第1页
第1页 / 共20页
keilc语言编程常见错误分析.docx_第2页
第2页 / 共20页
keilc语言编程常见错误分析.docx_第3页
第3页 / 共20页
keilc语言编程常见错误分析.docx_第4页
第4页 / 共20页
keilc语言编程常见错误分析.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

keilc语言编程常见错误分析.docx

《keilc语言编程常见错误分析.docx》由会员分享,可在线阅读,更多相关《keilc语言编程常见错误分析.docx(20页珍藏版)》请在冰豆网上搜索。

keilc语言编程常见错误分析.docx

keilc语言编程常见错误分析

1.Warning280:

’i’:

unreferencedlocalvariable

说明局部变量i在函数中未作任何的存取操作解决方法消除函数中i变量的宣告及即定义的参数在程序中并未调用

2Warning206:

’Music3’:

missingfunction-prototype

说明Music3()函数未作宣告或未作外部宣告所以无法给其他函数调用

解决方法将叙述voidMusic3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成externvoidMusic3(void),即作外部宣告

3Error:

318:

can’topenfile‘beep.h’

说明在编译C:

\8051\MANN.C程序过程中由于main.c用了指令#include“beep.h”,但却找不到所致解决方法编写一个beep.h的包含档并存入到c:

\8051的工作目录中

4Error237:

’LedOn’:

functionalreadyhasabody

说明LedOn()函数名称重复定义即有两个以上一样的函数名称

解决方法修正其中的一个函数名称使得函数名称都是独立的

5***WARNING16:

UNCALLEDSEGMENT,IGNOREDFOROVERLAYPROCESS

SEGMENT:

?

PR?

_DELAYX1MS?

DELAY

说明DelayX1ms()函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms()函数或利用条件编译#if…..#endif,可保留该函数并不编译

6***WARNING6:

XDATASPACEMEMORYOVERLAP

FROM:

0025H

TO:

0025H

说明外部资料ROM的0025H重复定义地址

解决方法外部资料ROM的定义如下PdataunsignedcharXFR_ADC_at_0x25其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25处并修正它

7WARNING206:

’DelayX1ms’:

missingfunction-prototype

C:

\8051\INPUT.C

Error267:

’DelayX1ms‘:

requiresANSI-styleprototypeC:

\8051\INPUT.C

说明程序中有调用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

SYMBOL:

MUSIC3

MODULE:

C:

\8051\MUSIC.OBJ(MUSIC)

ADDRESS:

0018H

在MUSIC3函数里面MUSIC这个参数有使用,没有申明。

或者申明了没有实体。

也就是说对于这个参数,编译器无法解析。

10***ERROR107:

ADDESSSPACEOVERFLOW

SPACE:

DATA

SEGMENT:

_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

SYMBOL:

VOLUME

MODULE:

C:

\8051\OSDM.OBJ(OSDM)

ADDRESS:

4036H

定义了某某函数或全部变量在不同文件里面想调用它,却在包含头文件里面少了extern语句,或只有主程序和包含头文件没有(EXTERN......定义语句(函数)).

如果调试时有些if结构里的语句符合条件没有执行,或者某些语句不符合条件也被执行,那是因为if和else里有相同的语句,编译的时候作优化处理了。

13WARNING15(MULTIPLECALLTOSEGMENT)症状

原因

Warning15向我们表明了linker发现了一个函数,这个函数不仅在maincode里被调用了,而且在ISR(或者被ISR调用的函数中)被调用了。

或者是被同时被多个ISR同时调用了。

这样会产生一个问题,就是在此函数不是一个可重入函数,而当此函数已经在执行时它可能被另一个ISR所调用。

这样就会导致结果是可变的而且很可能会导致一些参数的错误。

另一个问题就是本地变量和参数所使用的内存可能被其他函数的内存覆盖。

如果函数是由中断所调用的,则此函数的内存就会被使用。

这会引起其它函数的内存错误。

解决方法

有几种方法去解决这个问题

如果你100%确认这个函数的两个副本都不会同时执行(如果此函数是被main调用并且中断是未被使能的)并且此函数没有使用内存(只使用的寄存器),那么你就可以忽略此警告

如果此函数使用了内存,你就要使用OVERLAYdirective来将此函数从覆盖分析(overlayanaysis)中移除。

举例如下:

OVERLAY(?

PR?

_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中的

原因:

修改了不能改变的变量,

E:

\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

SYMBOL:

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

SYMBOL:

MAIN

MODULE:

C:

\KEIL\C51\LIB\C51S.LIB(?

C_INIT)

ADDRESS:

080DH

在main函数里面C_INIT这个参数有使用,没有申明。

或者申明了没有实体。

也就是说对于这个参数,编译器无法解析。

19keil4warningC316:

unterminatedconditionals

  今天用Keil4写程序时遇到这个问题:

warningC316:

unterminatedconditionals

跑了几个论坛,在审视了一遍代码之后,知道了原因:

  像类似XX.C(99):

warningC316:

unterminatedconditionals这种警告的话XX.c文件有一个凌乱的条件编译或预编译。

因为C语言中有些头文件中的预编译或宏定义,那么条件编译就避免不了。

写条件编译时,可能有忘写一个基本的语句。

比如说,你用了条件编译#ifndef而忘记写#endif。

因为他们本来就是配套的。

有前者必有后者。

不能丢掉其中任何一个。

一个include文件最后的#endif少了#前缀或者没有#endif,都会出现类似警告。

就像你写C语句,你不会写了inti   而不能忘记写";",否者就不能把一个语句表达完整。

  总之,出现上述问题。

先看看整个C文件中是否出现上述错误,或整个工程中自己写的那些头文件中里面的条件编译是否都写对了,即:

前面写了#ifndef,后面是否有对应的#endif。

20DS1302.C(86):

errorC183:

unmodifiablelvalue

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                                   内存溢出

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                    缺整型表达式

error 39:

Ordinal expression expected                    缺有序类型表达式

error 40:

Boolean expression expected                    缺布尔表达式

error 41:

Operand types do not match                        操作数类型不匹配

error 42:

Error in expression                            表达式错误

error 43:

Illegal assignment                                非法赋值

error 44:

Field identifier expected                        缺域标识符

error 45:

Object file too large                            目标文件太大

error 46:

Undefined external                                未定义的外部过程与函数

error 47:

Invalid object file record                        无效的OBJ文件格式

error 48:

Code segment too large                           代码段太长

error 49:

Data segment too large                           数据段太长

error 50:

DO expected                                      缺DO

error 51:

Invalid PUBLIC definition                        无效的PUBLIC定义

error 52:

Invalid EXTRN definition                        无效的EXTRN定义

error 53:

 Too many EXTRN definitions                        太多的EXTRN定义

error 54:

OF expected                                    缺OF

error 55:

INTERFACE expected                                缺INTERFACE

error 56:

Invalid relocatable reference                    无效的可重定位引用

error 57:

THEN expected                                    缺THEN

error 58:

TO or DOWNTO expected                            缺TO或DOWNTO

error 59:

Undefined forward                     

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1