Keil编译时出现错误和警告的总结
C 编译器错误信息中文翻译
(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)L10L16"主程序名字写错(或无主程序)"
程序中:
void mian (void)
编译提示:
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?MIAN?MAIN
*** WARNING L10: CANNOT DETERMINE ROOT SEGMENT
    Program 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
compiling
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          /* Read P1 into pval */
P3 = pval;            /* Write pval to P3 */
}
编译提示出错:
MAIN.C(22): error C141: syntax error near 'P3'
改正: P1后加";"
(9)C129汇编与C后缀问题
例如写这么一段小程序,保存为c0.c,编译时出现error c129miss before 0000
如果保存为:c0.asm就不会出现这个错误,保存为c的话,先调用c51编译器,按c语言的要求编译,所以出现错误;可以参考一些书,专门介绍keilc这个编译器的;
(10)C101C141关于数组引号问题
定义了如下的数组:
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','0x0d','0x0b','0x07','0x06','0x05','0x03','0x02','0x01','0x00'};
可是编译的时候总通不过,错误提示如下:
Build target 'Target 1'
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)C100C141C129程序有中文标点
c语言编译器怎么用不了用keil编译时出现错误,如下:D:\KEIL\C51\INC\REG52.H(1): error C100: unprintable character 0xA1 skipped
同上错误有很多个,还有D:\KEIL\C51\INC\REG52.H(2): error C141: syntax error near '#'
                    D:\KEIL\C51\INC\REG52.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)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。