KEIL51调试时一些的错误总结
(1)提示无M51文件
编译时候提示:
F:\...\XX.M51
File has been changed outside the editor, reload
------
解决方法:
重新生成项目,产生STARTUP.A51即可。
(2)L15重复调用
***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT:  ?PR?SPI_RECEIVE_WORD?D_SPI
CALLER1:  ?PR?VSYNC_INTERRUPT?MAIN
CALLER2:  ?C_C51STARTUP
   
  如果函数可以在其执行时被调用,则情况会变得更复杂一些。这时可以采用以下几种方法:
1.函数prototype主程序调用该函数时禁止中断,可以在该函数被调用时用#pragma disable语句来实现禁止中断的目的。必须使用OVERLAY指令将该函数从覆盖分析中除去。
2.复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。
3.将该函数设为重入型。例如:
void myfunc(void) reentrant {
...
}
      这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配置。这种方法消耗更多的RAM并会降低重入函数的执行速度。
(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程序有中文标点
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)
Target not created
---------
注意:
字母O 数字 0”。主要错在这里。
应该输入数字 0”,而你输入字母O”了。

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