keil软件编译常见错误解释总结和中文翻译.docx

上传人:b****0 文档编号:16926599 上传时间:2023-07-19 格式:DOCX 页数:26 大小:26.48KB
下载 相关 举报
keil软件编译常见错误解释总结和中文翻译.docx_第1页
第1页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第2页
第2页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第3页
第3页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第4页
第4页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第5页
第5页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第6页
第6页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第7页
第7页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第8页
第8页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第9页
第9页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第10页
第10页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第11页
第11页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第12页
第12页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第13页
第13页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第14页
第14页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第15页
第15页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第16页
第16页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第17页
第17页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第18页
第18页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第19页
第19页 / 共26页
keil软件编译常见错误解释总结和中文翻译.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

keil软件编译常见错误解释总结和中文翻译.docx

《keil软件编译常见错误解释总结和中文翻译.docx》由会员分享,可在线阅读,更多相关《keil软件编译常见错误解释总结和中文翻译.docx(26页珍藏版)》请在冰点文库上搜索。

keil软件编译常见错误解释总结和中文翻译.docx

keil软件编译常见错误解释总结和中文翻译

Keil编译时出现错误和警告的总结

和C编译器错误信息中文翻译

(1)L15重复调用

***WARNINGL15:

MULTIPLECALLTOSEGMENT

SEGMENT:

  ?

PR?

SPI_RECEIVE_WORD?

D_SPI

CALLER1:

  ?

PR?

VSYNC_INTERRUPT?

MAIN

CALLER2:

  ?

C_C51STARTUP

   该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。

   出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生变化并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被ISR打断,一段时间后又可以

运行,但是相应数据不会丢失)。

   原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于确定程序或子程序的值])的内存区被其他函数的内存区所覆盖,如果该函数被中断,则它的内存区就会被使用,这将导致其他函数的内存冲突。

   例如,第一个警告中函数WRITE_GMVLX1_REG在D_GMVLX1.C或者D_GMVLX1.A51被定义,它被一个中断服务程序或者一个调用了中断服务程序的函数调用了,调用它的函数是VSYNC_INTERRUPT,在MAIN.C中。

解决方法:

   如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并且该函数不占用内存(假设只使用寄存器),则你可以完全忽略这种警告。

   如果该函数占用了内存,则应该使用连接器(linker)OVERLAY指令将函数从覆盖分析(overlayanalysis)中除去,例如:

OVERLAY(?

PR?

_WRITE_GMVLX1_REG?

D_GMVLX1!

*)

  上面的指令防止了该函数使用的内存区被其他函数覆盖。

如果该函数中调用了其他函数,而这些被调用在程序中其他地方也被调用,你可能会需要也将这些函数排除在覆盖分析(overlayanalysis)之外。

这种OVERLAY指令能使编译器除去上述警告信息。

  如果函数可以在其执行时被调用,则情况会变得更复杂一些。

这时可以采用以下几种方法:

1.主程序调用该函数时禁止中断,可以在该函数被调用时用#pragmadisable语句来实现禁止中断的目的。

必须使用OVERLAY指令将该函数从覆盖分析中除去。

2.复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。

3.将该函数设为重入型。

例如:

voidmyfunc(void)reentrant{

...

}

     这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配置。

这种方法消耗更多的RAM并会降低重入函数的执行速度。

(2)提示无M51文件

编译时候提示:

F:

\...\XX.M51

Filehasbeenchangedoutsidetheeditor,reload?

------

解决方法:

重新生成项目,产生STARTUP.A51即可。

(3)L16无调用

***WARNINGL16:

UNCALLEDSEGMENT,IGNOREDFOROVERLAYPROCESS

   

SEGMENT:

?

PR?

_COMPARE?

TESTLCD

      说明:

程序中有些函数例如COMPARE(或片段)以前(调试过程中)从未被调用过,或者根本没有调用它的语句。

      这条警告信息前应该还有一条信息指示出是哪个函数导致了这一问题。

只要做点简单的调整就可以。

不理它也没什么大不了的。

      解决方法:

去掉COMPARE()函数或利用条件编译#if…..#endif,可保留该函数并不编译。

(4)L10和L16"主程序名字写错(或无主程序)"

程序中:

voidmian(void)

编译提示:

***WARNINGL16:

UNCALLEDSEGMENT,IGNOREDFOROVERLAYPROCESS

   SEGMENT:

?

PR?

MIAN?

MAIN

***WARNINGL10:

CANNOTDETERMINEROOTSEGMENT

   ProgramSize:

data=8.0xdata=0code=9

---

修改:

缺少主程序(其实是笔误),将mian改为main

(5)L16主程序没用到前面定义的函数

主程序里没用到前面定义的函数,编译时显示:

***WARNINGL16:

UNCALLEDSEGMENT,IGNOREDFOROVERLAYPROCESS

   SEGMENT:

?

PR?

DELAY?

MAIN

(6)L210程序前生成SRC语句

Buildtarget'Target1'

assemblingSTARTUP.A51...

compilingtest.C...

linking...

BL51BANKEDLINKER/LOCATERV6.00-SN:

K1JXC-94Z4V9

COPYRIGHTKEILELEKTRONIKGmbH1987-2005

"STARTUP.obj",

"test.obj"

TO"test"

***FATALERRORL210:

I/OERRORONINPUTFILE:

   EXCEPTION0021H:

PATHORFILENOTFOUND

   FILE:

test.obj

Targetnotcreated

---------

设置上的问题,在程序里屏蔽掉#pragmasrc即可

(7)C206函数未定义

该函数没定义

MAIN.C(15):

warningC206:

'delay1':

missingfunction-prototype

(8)C141少分号

部分程序:

{

pval=P1         /*ReadP1intopval*/

P3=pval;           /*WritepvaltoP3*/

}

编译提示出错:

MAIN.C(22):

errorC141:

syntaxerrornear'P3'

改正:

P1后加";"

(9)C129汇编与C后缀问题

例如写这么一段小程序,保存为c0.c,编译时出现errorc129,miss;before0000;

如果保存为:

c0.asm就不会出现这个错误,保存为c的话,先调用c51编译器,按c语言的要求编译,所以出现错误;可以参考一些书,专门介绍keilc这个编译器的;

(10)C101和C141关于数组引号问题

定义了如下的数组:

unsignedchara[36]={'0xfe','0xfd','0xfb','0xf7','0xef','0xdf','0xbf','0x7f','0x7e','0x7d','0x7b','0x77','0x6f','0x5f','0x3f','0x3e','0x3d','0x3b','0x37','0x2f','0x1f','0x1e','0x1d','0x1b','0x17','0x0f','0x0e','0x0d','0x0b','0x07','0x06','0x05','0x03','0x02','0x01','0x00'};

可是编译的时候总通不过,错误提示如下:

Buildtarget'Target1'

compilingshaomiao.c...

SHAOMIAO.C(3):

errorC101:

''0':

invalidcharacterconstant

SHAOMIAO.C(3):

errorC141:

syntaxerrornear'xfe'

SHAOMIAO.C(3):

errorC101:

''}':

invalidcharacterconstant

Targetnotcreated

解决方法:

去掉'...'引号

(11)C100和C141和C129程序有中文标点

用keil编译时出现错误,如下:

D:

\KEIL\C51\INC\REG52.H

(1):

errorC100:

unprintablecharacter0xA1skipped

同上错误有很多个,还有D:

\KEIL\C51\INC\REG52.H

(2):

errorC141:

syntaxerrornear'#'

                   D:

\KEIL\C51\INC\REG52.H

(2):

errorC129:

missing';'before'<'    

但是reg52.h头文件是keil自带的(见下),为何会报错呀。

----

回答:

程序里有带中文标点,用英文重新写一遍即可

(12)A45汇编出现数字、字母混淆

MOVPO,A;putonnext         11

...

MOVRO,#0FFH;                    14

MOVR1,#OFFH;                    15

...

DJNZRO,DLY_LP                    ;19

MOVR0,#OFFH;                    20

...

编译后:

ledtest.asm(11):

errorA45:

UNDEFINEDSYMBOL(PASS-2)

ledtest.asm(14):

errorA45:

UNDEFINEDSYMBOL(PASS-2)

ledtest.asm(15):

errorA45:

UNDEFINEDSYMBOL(PASS-2)

ledtest.asm(19):

errorA45:

UNDEFINEDSYMBOL(PASS-2)

ledtest.asm(20):

errorA45:

UNDEFINEDSYMBOL(PASS-2)

Targetnotcreated

---------

注意:

字母“O”和数字“0”。

主要错在这里。

应该输入数字“0”,而你输入字母“O”了。

1.Warning280:

’i’:

unreferencedlocalvariable

说明局部变量i在函数中未作任何的存取操作解决方法消除函数中i变量的宣告

 

2Warning206:

’Music3’:

missingfunction-prototype

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

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

成externvoidMusic3(void),即作外部宣告

 

3Compling:

C:

\8051\MANN.C

Error:

318:

can’topenfile‘beep.h’

说明在编译C:

\8051\MANN.C程序过程中由于main.c用了指令#include“beep.h”,但

却找不到所致解决方法编写一个beep.h的包含档并存入到c:

\8051的工作目录中

4Compling:

C:

\8051\LED.C

Error237:

’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

MODULE:

C:

\8051\MUSIC.OBJ(MUSIC)

***WARNING2:

REFERENCEMADETOUNRESOLVEDEXTERNAL

SYMBOL:

MUSIC3

MODULE:

C:

\8051\MUSIC.OBJ(MUSIC)

ADDRESS:

0018H

说明程序中有调用MUSIC函数但未将该函数的含扩档C加入到工程档Prj作编译和连接

解决方法设MUSIC3函数在MUSICC里将MUSICC添加到工程文件中去

9***ERROR107:

ADDESSSPACEOVERFLOW

SPACE:

DATA

SEGMENT:

_DATA_GOUP_

LENGTH:

0018H

***ERROR118:

REFERENCEMADETOERRONEOUSEXTERNAL

SYMBOL:

VOLUME

MODULE:

C:

\8051\OSDM.OBJ(OSDM)

ADDRESS:

4036H

说明data存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存

储模式设为SMALL则局部变量先使用工作寄存器R2~R7作暂存当存储器不够用时则会

以data型别的空间作暂存的个数超过0x7f时就会出现地址不够的现象

解决方法将以data型别定义的公共变量修改为idata型别的定义

说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的

解决办法加以归纳以期共享

10.***WARNINGL15:

MULTIPLECALLTOSEGMENT

SEGMENT:

?

PR?

_WRITE_GMVLX1_REG?

D_GMVLX1

CALLER1:

?

PR?

VSYNC_INTERRUPT?

MAIN

CALLER2:

?

C_C51STARTUP

***WARNINGL15:

MULTIPLECALLTOSEGMENT

SEGMENT:

?

PR?

_SPI_SEND_WORD?

D_SPI

CALLER1:

?

PR?

VSYNC_INTERRUPT?

MAIN

CALLER2:

?

C_C51STARTUP

***WARNINGL15:

MULTIPLECALLTOSEGMENT

SEGMENT:

?

PR?

SPI_RECEIVE_WORD?

D_SPI

CALLER1:

?

PR?

VSYNC_INTERRUPT?

MAIN

CALLER2:

?

C_C51STARTUP

该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断

服务程序的函数)同时调用,

或者同时被多个中断服务程序调用。

出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一

个中断打断,从而使得结果发生变化

并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时

候都可以被ISR打断,一段时间后又可以

运行,但是相应数据不会丢失)。

原因之二是用于局部变量和变量(暂且这样翻译,arguments,[自变量,变元一数值,用于

确定程序或子程序的值])的内存区被其他函数的内存区所覆盖,如果该函数被中断,则它的

内存区就会

被使用,这将导致其他函数的内存冲突。

例如,第一个警告中函数WRITE_GMVLX1_REG在D_GMVLX1.C或者D_GMVLX1.A51被定义,

它被一个中断服务程序或者一个调用了中断

服务程序的函数调用了,调用它的函数是VSYNC_INTERRUPT,在MAIN.C中。

解决方法:

如果你确定两个函数决不会在同一时间执行(该函数被主程序调用并且中断被禁止),并

且该函数不占用内存(假设只使用寄存器),

则你可以完全忽略这种警告。

如果该函数占用了内存,则应该使用连接器(linker)OVERLAY指令将函数从覆盖分析

(overlayanalysis)中除去,例如:

OVERLAY(?

PR?

_WRITE_GMVLX1_REG?

D_GMVLX1!

*)

上面的指令防止了该函数使用的内存区被其他函数覆盖。

如果该函数中调用了其他函数,

而这些被调用在程序中其他地方也被调用,

你可能会需要也将这些函数排除在覆盖分析(overlayanalysis)之外。

这种OVERLAY指令能

使编译器除去上述警告信息。

如果函数可以在其执行时被调用,则情况会变得更复杂一些。

这时可以采用以下几种方

法:

1.主程序调用该函数时禁止中断,可以在该函数被调用时用#pragmadisable语句来实现禁

止中断的目的。

必须使用OVERLAY指令将该函数

从覆盖分析中除去。

2.复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。

3.将该函数设为重入型。

例如:

voidmyfunc(void)reentrant{

...

}

这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种

方法时重入堆栈必须在STARTUP.A51文件中配置。

这种方法消耗更多的RAM并会降低重入函数的执行速度。

11.***WARNINGL16:

UNCALLEDSEGMENT,IGNOREDFOROVERLAYPROCESS

SEGMENT:

?

PR?

_COMPARE?

TESTLCD

说明:

程序中有些函数(或片段)以前(调试过程中)从未被调用过,或者根本没有

调用它的语句。

这条警告信息前应该还有一条信息指示出是哪个函数导致了这一问题。

只要做点简

单的调整就可以。

不理它也没什么大不了的。

解决方法:

去掉COMPARE()函数或利用条件编译#if…..#endif,可保留该函数并不

编译。

C编译器错误信息中文翻译

Ambiguousoperatorsneed

parentheses

不明确的运算需要用括号括起

Ambiguoussymbol``xxx``

不明确的符号

Argumentlistsyntaxerror

参数表语法错误

Arrayboundsmissing

丢失数组界限符

Arraysizetoolarge

数组尺寸太大

Badcharacterinparamenters

参数中有不适当的字符

Badfilenameformatininclude

directive

包含命令中文件名格式不正确

Badifdefdirectivesynatax

编译预处理ifdef有语法错

Badundefdirectivesyntax

编译预处理undef有语法错

Bitfieldtoolarge

位字段太长

Callofnon-function

调用未定义的函数

Calltofunctionwithno

prototype

调用函数时没有函数的说明

Cannotmodifyaconstobject

不允许修改常量对象

Caseoutsideofswitch

漏掉了case语句

Casesyntaxerror

Case语法错误

Codehasnoeffect

代码不可述不可能执行到

Compoundstatementmissing{

分程序漏掉"{"

Conflictingtypemodifiers

不明确的类型说明符

Constantexpressionrequired

要求常量表达式

Constantoutofrangein

comparison

在比较中常量超出范围

Conversionmaylose

significantdigits

转换时会丢失意义的数字

Conversionofnearpointernot

allowed

不允许转换近指针

Couldnotfindfile``xxx``

找不到XXX文件

Declarationmissing;

说明缺少";"

Declarationsyntaxerror

说明中出现语法错误

Defaultoutsideofswitch

Default出现在switch语句之外

Definedirectiveneedsan

identifier

定义编译预处理需要标识符

Divisionbyzero

用零作除数

Dostatementmusthavewhile

Do-while语句中缺少while部分

Enumsyntaxerror

枚举类型语法错误

Enumerationconstantsyntax

error

枚举常数语法错误

Errordirective:

xxx

错误的编译预处理命令

Errorwritingoutputfile

写输出文件错误

Expressionsyntaxerror

表达式语法错误

Extraparameterincall

调用时出现多余错误

Filenametoolong

文件名太长

Functioncallmissing)

函数调用缺少右括号

Fuctiondefinitionoutofplace

函数定义位置错误

Fuctionshouldreturnavalue

函数必需返回一个值

Gotostatementmissinglabel

Goto语句没有标号

Hexadecimaloroctalconstant

toolarge

16进制或8进制常数太大

Illegalcharacter``x``

非法字符x

Illegalinitialization

非法的初始化

Illegaloct

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

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2