新闻中心

EEPW首页>嵌入式系统>设计应用> Keil C 编译器常见警告与错误信息的解决方法

Keil C 编译器常见警告与错误信息的解决方法

作者: 时间:2016-11-27 来源:网络 收藏
1. Warning 280:’i’:unreferenced local variable
说明 局部变量 i 在函数中未作任何的存取操作
解决方法 消除函数中 i变量的宣告
2 Warning 206:’Music3’:m issing 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 用了指令#include “beep.h”,但却找不到所致
解决方法 编写一个 beep.h 的包含档并存入到 c:8051 的工作目录中
4 Compling:C:8051 LED.C
Error 237:’LedOn’:function already has a body
说明 LedOn( )函数名称重复定义 即有两个以上一样的函数名称
解决方法 修正其中的一个函数名称 使得函数名称都是独立的
5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_DELAYX1MS?DELAY
说明 DelayX1ms( )函数未被其它函数调用 也会占用程序记忆体空间
解决方法 去掉 DelayX1ms( )函数 或利用条件编译#if …..#endif,可保留该函数并不编译
6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP
FROM : 0025H
TO: 0025H
说明 外部资料ROM 的 0025H重复定义地址
解决方法 外部资料 ROM的定义如下
Pdata unsigned char XFR_ADC _at_0x25 其中 XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在 0x25 处并修正它
7 WARNING 206:’DelayX1ms’: missing function-prototype
C:8051INPUT.C
Error 267 :’DelayX1ms ‘:r equires ANSI-style prototype C:8051INPUT.C
说明 程序中有调用DelayX1ms 函数 但该函数没定义 即未编写程序内容或函数已定义但未作宣告
解决方法 编写 DelayX1ms 的内容 编写完后也要作宣告或作外部宣告 可在 delay.h的包含档宣告成外部 以便其它函数调用
8 ***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添加到工程文件中去
9 ***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型别的定义
作为初学者,输入程序的时候一般会出现语法错误。语法错误会造成汇编失败。常见的语法错误有:
(1) 标号重复:Multiply Defined Label
常见于复制、粘贴程序时忘记修改标号,造成出现多个相同的标号,标号是不允许重复的。。
(2)标点符号以全角方式输入:
汇编程序要求标点符号为半角方式,否则汇编失败。可以在输入:,;时切换到半角方式,或者在大写状态输入标点符号,这也是很容易犯而且不容易发觉的错误。
(3)数值#FFH 前遗漏0:
根据要求应该在a~f前加0,写成#0FFH
(4)字母O和数字0搞混:
有时候这两个字看上去完全相同,要注意哦~~
(5)标号后边遗漏":"
(6)标号使用了特殊字符:
标号不能用指令助记符、伪指令、特殊功能寄存器名和8051在 指令系统中用的“#”、“@”等,长度以2~6字符为宜,第一字母必须是英文字母。比如:T1、T2、A、B这些字符有特定的含义,不允许用于标号。
(7)超过地址范围:Address Out of Range
JB P3.2,EXIT跳转超过-128~127个地址范围。这个是最容易出现的错误!你有可能程序刚才还能汇编编译成功,你加了一段程序后程序就提示出错了,你可以把:
JB P3.2, EXIT ;如果EXIT的位置距离本条语句超过127字节,则会出错。
;可以用跳转中继的方法,可以达到跳转超过127字节的范围。
JNB P3.2, ZJ01 ;ZJ01是跳转的中继,在ZJ01的位置,放置一条长跳转指令。
……
ZJ01: LJMP EXIT ;
……
EXIT:
AJMP跳转超过2K地址:
AJMP属于短跳转命令,有2K地址范围的限制。
(8)字母I和数字1混淆:
冒失鬼的常见问题。
(9)创造发明不存在的汇编语言指令:Unrecognized Statemen or Undefined Argument
在编写程序程序的过程中可不欢迎这种创新,这种指令汇编程序不支持,芯片也不认可。
(10)符号“:”“;”用半角书写。
(11)语句中的符号名可能拼错或未被定义:Undefined Symbol。
(12)汇编的源程序结尾未发现END语句:Missing END Statrment。
要养成良好的程序书写习惯,比如标号对齐、参数对齐、注释对齐,这样看起来赏心悦目,也不容易出错。标号最好采用有意义的英文或汉语拼音,这样比较直观,注释尽量详细准确,便于以后读懂,而且有利于其它程序中作为子程序模块的调用。还有要注意典型程序模块的积累,再复杂的程序也是由一个个小程序模块组成的,在初学阶段可以对典型程序比如:延时子程序、查表子程序等编写实践一次,这样印象深刻,便于以后引用。


评论


技术专区

关闭