您的位置 首页 解答

keilC51编译常见过错和正告阐明

(1)L15重复调用***WARNINGL15:MULTIPLECALLTOSEGMENTSEGMENT:?PR?SPI_RECEIVE_WORD?D_SPICALLER1:?PR?VSYNC_INT

( 1 )L15 重复调用
***WARNING L15: MULTIPLE CALL TO SEGMENT
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 指令将函数从掩盖剖析 (overlay
analysis) 中除掉 , 例如:
OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)
上面的指令避免了该函数运用的内存区被其他函数掩盖 。 假如该函数中调用了其他函数 , 而这些被调用在
程序中其他地方也被调用 , 你或许会需求也将这些函数扫除在掩盖剖析 (overlay analysis) 之外。这种 OVERLAY 指
令能使编译器除掉上述正告信息。
假如函数能够在其履行时被调用 , 则状况会变得更杂乱一些。这时能够选用以下几种办法:
1. 主程序调用该函数时制止中止 , 能够在该函数被调用时用 #pragma disable 句子来完成制止中止的意图。必
须运用 OVERLAY 指令将该函数从掩盖剖析中除掉。
2. 仿制两份该函数的代码 , 一份到主程序中 , 另一份仿制到中止服务程序中。
3. 将该函数设为重入型。例如:void myfunc(void) reentrant {

}
这种设置将会发生一个可重入仓库 , 该仓库被被用于存储函数值和局部变量 , 用这种办法时重入仓库有必要在 STARTUP.A51 文件中装备。这种办法耗费更多的 RAM 并会下降重入函数的履行速度。

( 2 ) 提示无 M51 文件
编译时分提示:
F:…XX.M51
File has been changed outside the editor, reload ?
——
解决办法:
从头生成项目,发生 STARTUP.A51 即可。

(3)L16 无调用
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_COMPARE?TESTLCD
阐明 : 程序中有些函数例如 COMPARE ( 或片段 ) 曾经 ( 调试过程中 ) 从未被调用过 , 或许底子没
有调用它的句子。
这条正告信息前应该还有一条信息指示出是哪个函数导致了这一问题。只要做点简略的调整就
能够。不睬它也没什么大不了的。
解决办法 : 去掉 COMPARE() 函数或运用条件编译 #if … ..#endif, 可保存该函数并不编译。

(4)L10 和 L16″ 主程序姓名写错 ( 或无主程序 )”
程序中 :
void mian (void)
编译提示 :
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?MIAN?MAIN
*** WARNING L10: CANNOT DETERMINE ROOT SEGMENTProgram Size: data=8.0 xdata=0 code=9

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

(5)L16 主程序没用到前面界说的函数
主程序里没用到前面界说的函数,编译时显现:
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?DELAY?MAIN

(6)L210 程序前生成 SRC 句子
Build target Target 1
assembling STARTUP.A51…
compiling test.C…
linking…
BL51 BANKED LINKER/LOCATER V6.00 – SN: K1JXC-94Z4V9
COPYRIGHT KEIL ELEKTRONIK GmbH 1987 – 2005
“STARTUP.obj”,
“test.obj”
TO “test”
*** FATAL ERROR L210: I/O ERROR ON INPUT FILE:
EXCEPTION 0021H: PATH OR FILE NOT FOUND
FILE: test.obj
Target not created
———
设置上的问题,在程序里屏蔽掉 #pragma src 即可

(7)C206 函数未界说
该函数没界说
MAIN.C(15): warning C206: delay1: missing function-prototype(8)C141 少分号
部分程序 :
{
pval = P1
P3 = pval;
}
编译提示犯错 :
MAIN.C(22): error C141: syntax error near P3
改正 : P1 后加 “;”

(9)C129 汇编与 C 后缀问题
例如写这么一段小程序,保存为 c0.c ,编译时呈现 error c129 , miss ; before 0000 ;
假如保存为: c0.asm 就不会呈现这个过错,保存为 c 的话,先调用 c51 编译器,按 c 言语的要求编译,所以
呈现过错;能够参阅一些书,专门介绍 keilc 这个编译器的;

(10)C101 和 C141 关于数组引号问题
界说了如下的数组:
unsigned char
a[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,0
x0d,0x0b,0x07,0x06,0x05,0x03,0x02,0x01,0x00};
可是编译的时分总通不过,过错提示如下:
Build target Target 1
compiling shaomiao.c…
SHAOMIAO.C(3): error C101: 0: invalid character constant
SHAOMIAO.C(3): error C141: syntax error near xfe
SHAOMIAO.C(3): error C101: }: invalid character constant
Target not created
解决办法:去掉 … 引号

(11)C100 和 C141 和 C129 程序有中文标点
用 keil 编译时呈现过错,如下: D:KEILC51INCREG52.H(1): error C100: unprintable character 0xA1
skipped同上过错有很多个,还有 D:KEILC51INCREG52.H(2): error C141: syntax error near #
D:KEILC51INCREG52.H(2): error C129: missing ; before<
可是 reg52.h 头文件是 keil 自带的(见下),为何会报错呀。
—-
答复: 程序里有带中文标点,用英文从头写一遍即可

(12)A45 汇编呈现数字、字母混杂
MOV PO,A ;put on next 11

MOV RO,#0FFH ; 14
MOV R1,#OFFH ; 15

DJNZ RO,DLY_LP ;19
MOV R0,#OFFH ; 20

编译后:
ledtest.asm(11): error A45: UNDEFINED SYMBOL (PASS-2)
ledtest.asm(14): error A45: UNDEFINED SYMBOL (PASS-2)
ledtest.asm(15): error A45: UNDEFINED SYMBOL (PASS-2)
ledtest.asm(19): error A45: UNDEFINED SYMBOL (PASS-2)
ledtest.asm(20): error A45: UNDEFINED SYMBOL (PASS-2)
Target not created
———
留意:
字母 “ O ” 和 数字 “ 0 ” 。首要错在这里。
应该输入数字 “ 0 ” ,而你输入字母 “ O ” 了。

(13)Warning 280: ’ i ’ :unreferenced local variable
阐明局部变量 i 在函数中未作任何的存取操作解决办法消除函数中 i 变量的宣告2 Warning 206: ’ Music3 ’ :missing function-prototype
阐明 Music3( ) 函数未作宣告或未作外部宣告所以无法给其他函数调用
解决办法将叙说 void Music3(void) 写在程序的最前端作宣告假如是其他文件的函数则要写
成 extern void Music3(void), 即作外部宣告

3 Compling :C:8051MANN.C
Error:318:can ’ t open file ‘ beep.h ’
阐明在编译 C:8051MANN.C 程序过程中因为 main.c 用了指令# i nclude “ beep.h ” , 但
却找不到所造成的解决办法编写一个 beep.h 的包括档并存入到 c:8051 的作业目录中

(14)Compling:C:8051LED.C
Error 237: ’ LedOn ’ :function already has a body
阐明 LedOn( ) 函数称号重复界说即有两个以上相同的函数称号
解决办法批改其间的一个函数称号使得函数称号都是独立的

15)***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_DELAYX1MS?DELAY
阐明 DelayX1ms( ) 函数未被其它函数调用也会占用程序记忆体空间解决办法去掉DelayX1ms( ) 函数或运用条件编译 #if … ..#endif, 可保存该函数并不编译

(16) ***WARNING 6 :XDATA SPACE MEMORY OVERLAP
FROM : 0025H
TO: 0025H
阐明外部材料 ROM 的 0025H 重复界说地址
解决办法外部材料 ROM 的界说如下 Pdata unsigned char XFR_ADC _at_0x25 其间 XFR_ADC
变量的称号为 0x25, 请查看是否有其它的变量称号也是界说在 0x25 处并批改它

(17) WARNING 206: ’ DelayX1ms ’ : missing function-prototype
C:8051INPUT.C
Error 267 : ’ DelayX1ms ‘ :requires ANSI-style prototype C:8051INPUT.C
阐明程序中有调用 DelayX1ms 函数但该函数没界说即未编写程序内容或函数已界说但未作宣告
解决办法编写 DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在 delay.h 的包括档宣乐成外部以便其它函数调用

(18) ***WARNING 1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:MUSIC3
MODULE:C:8051MUSIC.OBJ(MUSIC)
***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:MUSIC3
MODULE:C:8051MUSIC.OBJ(MUSIC)
ADDRESS:0018H
阐明程序中有调用 MUSIC 函数但未将该函数的含扩档 C 加入到工程档 Prj 作编译和衔接
解决办法设 MUSIC3 函数在 MUSIC C 里将 MUSIC C 添加到工程文件中去

(19) ***ERROR 107:ADDESS SPACE OVERFLOW
SPACE: DATA
SEGMENT: _DATA_GOUP_
LENGTH: 0018H
***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL: VOLUME
MODULE: C:8051OSDM.OBJ (OSDM)
ADDRESS: 4036H
阐明 data 存储空间的地址规模为 0~0x7f, 当共用变量数目和函数里的局部变量假如存储方式设为 SMALL 则局部变量先运用作业寄存器 R2~R7 作暂存当存储器不行用时则会
以 data 型别的空间作暂存的个数超越 0x7f 时就会呈现地址不行的现象
解决办法将以 data 型别界说的公共变量批改为 idata 型别的界说

(20).***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1
CALLER1: ?PR?VSYNC_INTERRUPT?MAIN
CALLER2: ?C_C51STARTUP
***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_SPI_SEND_WORD?D_SPI
CALLER1: ?PR?VSYNC_INTERRUPT?MAIN
CALLER2: ?C_C51STARTUP
***WARNING L15: MULTIPLE CALL TO SEGMENT
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 指令将函数从掩盖剖析
(overlay analysis) 中除掉 , 例如:
OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)
上面的指令避免了该函数运用的内存区被其他函数掩盖。假如该函数中调用了其他函数 ,
而这些被调用在程序中其他地方也被调用 ,
你或许会需求也将这些函数扫除在掩盖剖析 (overlay analysis) 之外。这种 OVERLAY 指令能
使编译器除掉上述正告信息。

假如函数能够在其履行时被调用 , 则状况会变得更杂乱一些。这时能够选用以下几种方
法:
1. 主程序调用该函数时制止中止 , 能够在该函数被调用时用 #pragma disable 句子来完成禁
止中止的意图。有必要运用 OVERLAY 指令将该函数
从掩盖剖析中除掉。
2. 仿制两份该函数的代码 , 一份到主程序中 , 另一份仿制到中止服务程序中。3. 将该函数设为重入型。例如:
void myfunc(void) reentrant {

}
这种设置将会发生一个可重入仓库 , 该仓库被被用于存储函数值和局部变量 , 用这种
办法时重入仓库有必要在 STARTUP.A51 文件中装备。
这种办法耗费更多的 RAM 并会下降重入函数的履行速度。

(21). *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_COMPARE?TESTLCD
阐明:程序中有些函数(或片段)曾经(调试过程中)从未被调用过 , 或许底子没有
调用它的句子。
这条正告信息前应该还有一条信息指示出是哪个函数导致了这一问题。只要做点简
单的调整就能够。不睬它也没什么大不了的。
解决办法 : 去掉 COMPARE() 函数或运用条件编译 #if … ..#endif, 可保存该函数并不
编译。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/256852.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部