keil报错分析
9***ERROR107:ADDESS SPACE OVERFLOW
SPACE:DATA
SEGMENT:_DATA_GOUP_
LENGTH:0018H
溢出内存不够,解决方法1.扩展内存。2.换用其他内存大的cpu,也有可能使用了标准51。
3.减少全局变量定义,把部分DATA段定义为IDATA,这样Keil会自动覆盖,节约内存。因为你超出的不多,应该可以优化掉。
扩展内存方法
目标定义中增加XDATA,编译模式选择large就可以了。
***ERROR118:REFERENCE MADE TO ERRONEOUS EXTERNAL
SYMBOL:VOLUME
MODULE:C:\8051\OSDM.OBJ(OSDM)
ADDRESS:4036H
说明data存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存
储模式设为SMALL则局部变量先使用工作寄存器R2~R7作暂存当存储器不够用时则会
以data型别的空间作暂存的个数超过0x7f时就会出现地址不够的现象
解决方法将以data型别定义的公共变量修改为idata型别的定义
说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的
解决办法加以归纳以期共享
10***ERROR L104:MULTIPLE PUBLIC DEFINITIONS函数prototype
是104号错误,你头文件里的变量定义被多次调用,相当于多次定义了。(注意头文件里与主函数间容易同时调用相同的变量)
第10是条是批多次重复定义了,,,
一是头文件防止被重复包含加上
#ifndef__YOURHEADERFILE.H___
#define__YOURHEADERFILE.H___
...
#endif
这样可以防止头文件被重复包含,里面的变量也不会被重复定义了。最好每个头文件都这样
写。
c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很
大的麻烦,为了使大家少走弯路,特祥细的说明一下。
对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通常会直接定义在c文件中,在程序之前加int i定义。如果要在头文件中定义有
以下两种方法:用extern来声明:extern int i;这一句只是对变量i进行声明,在c文件的程序之前必须加上int i进行定义。extern int i=0;这一句声明和定义都做了。
对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头文件中声明(不需要初始化),然后在一个c文件中定义(该初始化的要初始化)。如果在头文件中定义,则编译的时候会出现重复定义的错误。如果只有头文件中声明就会出现没有定义有警告。
***ERROR L104:MULTIPLE PUBLIC DEFINITIONS
SYMBOL:K
MODULE:222.obj(222)
出现上述错误则是因为变量k重复定义,把你的头文件中的变量定义前加extern(只是变量声
明不用初始化),再在某一个你要调用该变量的c文件的程序之前再定义(注意第一个调用的c文件要负责附带初始化该变量,其他调用的c 文件就不需要初始化过程啦)一下就可以了
***ERROR L104:MULTIPLE PUBLIC DEFINITIONS
SYMBOL:MAIN
MODULE:.\Text1.obj(TEXT1)
***ERROR L104:MULTIPLE PUBLIC DEFINITIONS
SYMBOL:_DELAYMS
程序中,重复定义了标号:MAIN、_DELAYMS。
WARNING L1:UNRESOLVED EXTERNAL SYMBOL
无法定位的外部符号(那个变量没有定义或者打错了)
WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL
调用了未定义的符号,其实可能是只有一处错误
WARNING L7:MODULE NAME NOT UNIQUE
函数重名
***WARNING L15:MULTIPLE CALL TO SEGMENT这个问题!
其实这个问题应该是引起注意的,有可能引起程序冲突,但是一般时候程序运行不会有问题,但是如果出来问题,那将会是很讨厌的问题.
分析一下产生这一警告的一个根源是:例如在主循环里调用了一个函数,而在中断服务中,你又一次调用了同样的函数。这样当主循环运行到该函数中时,一旦产生中断,则在中断里又再次调用该函数!而使得该子函数发生了重入,这时,经管概率很低,但是很可能出错!这样,编译器就给出了警告!告诉你*** WARNING L15:MULTIPLE CALL TO SEGMENT,表达的意思是发生了重入!字面意思自己理解去吧~~~
想要避免这种情况的方法
一.用reentrant使函数重入
关于reentrant的说明:
1,重入函数不能传递bit类型的参数和变量;
2,重入函数建立的是模拟堆栈区,所以不使用一般函数位于存储模式默认空间的可覆盖式堆栈,而是在同一空间从顶端另行分配一个非覆盖式的重入堆栈。
small默认空间是data;
compact默认空间是pdata;
largr默认空间是xdata;
3,由于要保存参数和局部变量,所以会消耗很大的栈空间;尽量少用这种模式;
4、在同一程序中可以定义和使用不同存储器模式的重入函数,任意模式的重入函数不能调用不同存储器模式的重入函数,但可以调用普通函数。
5、实际参数可以传递给间接调用的重入函数。无重入属性的间接调用函数不能包含调用参数。
二.如果空间多的话,可以定义两个同功能的函数,分别在中断和中断外调用
别的方法没研究出来,嘿嘿~~~对了我建议用第二种方法好点,第一种有些限制
WARNING L16是由于你写了LCDDISPLAY这个函数,而在程序中没有调用,这种警告不影响程序的执行
1.Warning280:’i’:unreferenced local variable
说明局部变量i在函数中未作任何的存取操作,解决方法消除函数中i变量的宣告
2Warning206:’Music3’:missing function-prototype
说明Music3()函数未作宣告或未作外部宣告所以无法给其他函数调用
解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告
3Compling:C:\8051\MANN.C
Error:318:can’t open file‘beep.h’
说明在编译C:\8051\MANN.C程序过程中由于main.c用了指令#include“beep.h”,但却不到所致解决方法编写一个beep.h的包含档并存入到c:\8051的工作目录中
4Compling:C:\8051\LED.C
Error237:’LedOn’:function already has a body
说明LedOn()函数名称重复定义即有两个以上一样的函数名称
解决方法修正其中的一个函数名称使得函数名称都是独立的
5***WARNING16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS
SEGMENT:?PR?_DELAYX1MS?DELAY
说明DelayX1ms()函数未被其它函数调用也会占用程序记忆体空间,解决方法去掉DelayX1 m
s()函数或利用条件编译#if…..#endif,可保留该函数并不编译
6***WARNING6:XDATA SPACE MEMORY OVERLAP
FROM:0025H
TO:0025H
说明外部资料ROM的0025H重复定义地址
解决方法外部资料ROM的定义如下Pdata unsigned char XFR_ADC_at_0x25其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25处并修正它
7WARNING206:’DelayX1ms’:missing function-prototype
C:\8051\INPUT.C
Error267:’DelayX1ms‘:requires ANSI-style prototype C:\8051\INPUT.C
说明程序中有调用DelayX1ms函数但该函数没定义即未编写程序内容或函数已定义但未作宣
解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用
8***WARNING1:UNRESOLVED EXTERNAL SYMBOL
SYMBOL:MUSIC3
MODULE:C:\8051\MUSIC.OBJ(MUSIC)
***WARNING2:REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL:MUSIC3
MODULE:C:\8051\MUSIC.OBJ(MUSIC)
ADDRESS:0018H
说明程序中有调用MUSIC函数但未将该函数的含扩档C加入到工程档Prj作编译和连接解决方
法设MUSIC3函数在MUSIC C里将MUSIC C添加到工程文件中去
Program Size:data=23.0xdata=0code=249
data=内部数据区大小
xdata=外部数据区大小
code=代码区大小,,,也就是你说的占用单片机的那块.
方法二吧你的hex转化成bin直接看bin文件大小也可以
hex2bin有转化工具..不过要网上下载
2.AT89C58这种都可以.
stc89c58等等,flash都是64K的
肯定换单片机..外部的太麻烦..价格也不便宜.
3
RAM有500BYTE
其中内部256外部256
如果要运行速度快一点的用
unsigned char idata Fifo[180];//这个在内部ram中
unsigned char xdata Fifo[180];//慢一点在外部ram中

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