新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > KEIL51调试时一些错误总结

KEIL51调试时一些错误总结

作者:时间:2016-09-26来源:网络收藏

  (1)提示无M51文件

本文引用地址:http://www.eepw.com.cn/article/201609/310318.htm

  编译时候提示:

  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

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

  出现这种问题的原因之一是这个函数是不可重入性函数,当该函数运行时它可能会被一个中断打断,从而使得结果发生变化并可能会引起一些变量形式的冲突(即引起函数内一些数据的丢失,可重入性函数在任何时候都可以被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并会降低重入函数的执行速度。

  (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 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 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 /* 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 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','0x0d','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)C141错误

  提示 001.C(23): error C141: syntax error near 'unsigned'

  这行之前的语句"bit flag_Key_Service_song=0"少分号了

  (14)C129错误

  提示 001.C(22): error C129: missing ';' before 'flag_Key_Service_song'

  定义里 "bi flag_Key_Service_song=0;"

  改为bit



关键词: KEIL51

评论


技术专区

关闭