您的位置 首页 知识

KEIL51调试时一些过错总结

(1)提示无M51文件编译时候提示:F:\…\XX.M51File has been changed outside the editor, reload ?-

  (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

  该正告表明连接器发现有一个函数或许会被主函数和一个中止服务程序(或许调用中止服务程序的函数)一起调用,或许一起被多个中止服务程序调用。

  呈现这种问题的原因之一是这个函数是不行重入性函数,当该函数运转时它或许会被一个中止打断,然后使得成果发生变化并或许会引起一些变量方式的抵触(即引起函数内一些数据的丢掉,可重入性函数在任何时分都能够被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:\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”了。

  (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

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部