keil4 常见问题处理办法
- 格式:doc
- 大小:347.50 KB
- 文档页数:8
uvision4致命错误1250超过限制版本代码大小限制
超过限制版本代码大小限制是指keil制作uvision4仿真程序时,若超出了限制的程序代码大小,将会出现"致命错误1250"。
"致命错误1250"指程序代码大小越界异常。
这是由于计算机中使用的RAM容量有限,资源有限,因此事先约定该程序的最大代码大小,以保证系统稳定运行。
可以通过修改keil设置或程序代码实现调整,降低变动中遇到的"致命错误1250"的几率。
首先,可以重新编写和优化程序代码,减少重复的代码,可以采用面向对象编程方法或以其他更高效去改写原本的代码。
如果只是在程序运行状态下完成代码大小优化,可以尝试使用代码重构技术,使用重构工具可以调用相关的程序库来优化程序,进而获得更小的代码体积。
其次,可以尝试修改keil设置,以使程序能够在限定的内存空间内运行,比如在keil IDE中进行代码体积优化,减少程序所使用的中断向量表的数量,减少变量的数量等。
最后,也可以更换更大的RAM,消除程序代码大小限制。
一般情况下,如果更换RAM,也有可能会遇到不兼容的问题,因此使用时要小心。
总体来说,uvision4致命错误1250超过限制版本代码大小限制是比较常见的异常现象,可以通过优化程序代码、重新调整keil 设置或更换更大的RAM来解决该问题。
Keil C编译器常见警告与错误信息解决方法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.CError:318:can’t open file‘beep.h’说明在编译C:\8051\MANN.C程序过程中由于main.c用了指令#i nclude“beep.h”,但却找不到所致解决方法编写一个beep.h的包含档并存入到c:\8051的工作目录中4Compling:C:\8051\LED.CError237:’LedOn’:function already has a body说明LedOn()函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5***WARNING16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT:?PR?_DELAYX1MS?DELAY说明DelayX1ms()函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms()函数或利用条件编译#if…..#endif,可保留该函数并不编译6***WARNING6:XDATA SPACE MEMORY OVERLAPFROM:0025HTO:0025H说明外部资料ROM的0025H重复定义地址解决方法外部资料ROM的定义如下Pdata unsigned char XFR_ADC_at_0x25其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25处并修正它7WARNING206:’DelayX1ms’:missing function-prototypeC:\8051\INPUT.CError267:’DelayX1ms‘:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用8***WARNING1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC函数但未将该函数的含扩档C加入到工程档Prj作编译和连接解决方法设MUSIC3函数在MUSIC C里将MUSIC C添加到工程文件中去9***ERROR107:ADDESS SPACE OVERFLOWSPACE:DATASEGMENT:_DATA_GOUP_LENGTH:0018H***ERROR118:REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL:VOLUMEMODULE:C:\8051\OSDM.OBJ(OSDM)ADDRESS:4036H说明data存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL则局部变量先使用工作寄存器R2~R7作暂存当存储器不够用时则会以data型别的空间作暂存的个数超过0x7f时就会出现地址不够的现象解决方法将以data型别定义的公共变量修改为idata型别的定义说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享10定义了全局变量而没有外部External声明:reference made to erroneous external Ram空间不足:public refers to ignore segment外部变量:定义处不用加External,声明处要加External将以data型别定义的公共变量修改为idata型别的定义11***ERROR L118:REFERENCE MADE TO ERRONEOUS EXTERNAL定义了某某函数或全部变量在不同文件里面想调用它,却在包含头文件里面少了extern 语句,或只有主程序和包含头文件没有(EXTERN......定义语句(函数)).如果调试时有些if结构里的语句符合条件没有执行,或者某些语句不符合条件也被执行,那是因为if和else里有相同的语句,编译的时候作优化处理了。
keil 4 中的一些常见问题处理办法keil 软件对于一个单片机编程者来说已经再熟悉不过了,我们都用得很多,但往往我们应用时总会遇到这样那样的问题,但又苦于无法解决,最终只能凑合着用。
下面我就个人经验对部分问题的解决方法给大家分享一下,也为初学者打点keil的应用基础。
不管他是哪个版本的,其处理办法基本都差不多,甚至可以说是完全一样的,下面我们就谈点实际的问题。
1、keil 4 中注释时,为什么不能打进汉字,都是方框?其处理方法:Edit -> Configuration,点击Colors & Fonts选项卡,在Window列表中选择Editor C Files,在右侧选择字体Courier,Use color in Comments 不能打钩.在做完上面的操作后,我来进行一下前后比较:显示效果如下:1、操作前:如果后面注释的黑线是方框,操作一样,但要适当改变字体(eg:宋体、新宋体都行)。
2、操作后显示效果:通过显示我们可以很直观的看到,注释中的文字已经清楚的显示了出来。
2、改变关键字颜色:方法:Edit -> Configuration->Colors & Fonts->Editor C Files->keyword->选择foreground为任意你想要的颜色(蓝色)。
显示效果如下:通过这一系列操作后,你可以将不同类型的数据改成你想要的颜色,方便你的编程和查错。
3、当前操作行底纹颜色和选中文字颜色设置:(1)当前工作行底纹和选中其文字设置:显示效果:(2)当前选中文字颜色和底纹显示:显示效果:通过该项操作后,你可以快速的找到你所编辑的区域,行数,甚至行段。
4、程序中空格显示为一点,如下图:解决办法:修改后显示效果:该项操作可以让页面更漂亮,更能满足我们的视觉习惯,提高变成效率。
5、没有程序行数框架显示,如下图:操作方法:操作后显示结果:其它操作方式基本类似,均可进行相应操作,达到自己想要的结果。
1.Warning 280:’i’:unreferencedlocal variable 说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告及即定义的参数在程序中并未调用2Warning 206:’Music3’:missing function-prototype 说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern voidMusic3(void),即作外部宣告3Error:318:can’t open file‘beep.h’说明在编译C:\8051\MANN.C程序过程中由于main.c 用了指令#i nclude “beep.h”,但却找不到所致解决方法编写一个beep.h的包含档并存入到c:\8051 的工作目录中ﻫ4 Error237:’LedOn’:function already has a body ﻫ说明LedOn()函数名称重复定义即有两个以上一样的函数名称ﻫ解决方法修正其中的一个函数名称使得函数名称都是独立的ﻫﻫ5 ***WARNING16:UNCALLED SEGMENT,IGNORED FOR OVERLAYPROCESSSEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms()函数或利用条件编译#if …..#endif,可保留该函数并不编译ﻫ6***WARNING6 :XDATASPACE MEMORY OVERLAPFROM : 0025HTO: 0025H ﻫ说明外部资料ROM的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XF R_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它ﻫ7 WARNING206:’DelayX1ms’:missingfunction-prototypeﻫC:\8051\INPUT.CError 267 :’DelayX1ms ‘:requires ANSI-styleprototypeC:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部8宣告可在delay.h 的包含档宣告成外部以便其它函数调用ﻫﻫ***WARNING1:UNRESOLVED EXTERNAL SYMBOLﻫSYMBOL:MUSIC3解决办法:1.是文件没有添加到工程里。
Keil编译与下载设置及常见问题解决方案这几天在群里朋友的帮助下学习了keil的编译与下载,现在将遇到的几个问题记录下来。
形成一个完整的教程。
为了帮助和我一样刚刚接触Keil的朋友,本文将分为两部分。
一,keil编译与下载设置。
二,常见问题原因分析与解决方案。
一,keil编译与下载设置首先看根据不同的MCU我们需要设置的项目有device,c/c++。
根据不同的下载器需要设置的项目有debug,utilities。
1.device的设置在device选项中search自己所要的芯片。
根据MCU的类型选择,其实就是修改HD或者是MD.3.DEBUG设置4.utilities设置二,常见问题原因分析与解决方案到此我将我遇到的问题一一展示给大家,一来自己复习巩固二来帮助小白更快的解决问题。
1)在device中没有我要的芯片?解决办法,到网上下载pack包加载到keil。
如图所示,在file中选择import...2)Error:Flash Download failed-”cortex-M3原因分析:flash download 设置错误解决办法:参考第一部分第3步骤3)No ULINK2/ME Decice found原因分析:Utilities设置错误解决方案:参见第一部分第4步骤4)编译过程中出现#67:expected a “}”原因分析:我是在跟换不同型号芯片时遇到的这个问题。
这两个芯片一个是大型,一个是中型,因此出现这样的问题。
解决方案:替换.S文件,修改C/C++宏定义方法:第一步:在.S文件中右键今入manage project items,add与芯片对应的.S的文件。
第二步:修改C/C++宏定义方案:参加第一部分第二步骤。
具体的就是修改一个字母H,M等。
评,根据实测这一步非常重要,其实.s文件不修改进修改c/c++宏定义就可以了。
具体原因我也不懂。
感谢再次特别感谢麒麟座开发板交流群的朋友,感谢晨风~依然、OneNET-嵌入式软件-周家绪悉心指导了我遇到的问题,他们都是群里真正的老司机。
Keil中的常见错误和警告C51编译器识别错类型有三种1、致命错误:伪指令控制行有错、命令行指定的无效选项、访问不存在的原文件或头文件等。
致命错误立即终止程序编译。
2、语法及语义错误:语法和语义错误都发生在源文件中。
有这类错误时,给出提示但不产生目标文件,错误超过一定数量才终止编译。
3、警告:警告出现并不影响目标文件的产生,但执行时有可能发生问题,程序员应斟酌处理。
错误信息及可能发生的原因列表*ERROR 100:unprintable character 0x??skipped源文件中发现非法字符(注意,注解内的字符不做检查)。
*ERROR 101:unclosed string字符串未用引号结尾。
*ERROR 102:string too long字符串不得超过511 个字符。
为了定义更长的串,用户必须使用续行符‘\’逻辑的继续该字符串,在词汇分析时遇到以该符号结尾的行会与下行连接起来.*ERROR 103: invalid character constant试图再声明一个已定义的宏,已存在的宏可以用#undef指令删除。
预定义的宏不能删除。
*ERROR 104: identifier expected预处理器指令期望产生一个标示符,如ifdef。
*ERROR 105: unclosed comment当注解无结束界定符(*/)时产生此错误。
*EROOR 106: unbalanced#if-endif controlsendif的数量与if或ifdef的数量不匹配。
*ERROR 107:include file nesting exceeds 9include指令后的文件名无效或丢失*ERROR 108:expected string,如#error “string”预处理器指令期望一个串变量。
*ERROR 109:由#error 伪指令引入的错误信息以错误信号形式显示。
*ERROR 110:missing directive预处理行#后缺少伪指令。
Keil - 错误Keil是一种嵌入式编程软件工具,使用Keil可以为各种微处理器、单片机和其他嵌入式系统编写程序。
Keil是由德国的Keil Elektronik GmbH开发的。
使用Keil 进行编程,是嵌入式系统开发和设计中必不可少的一部分。
但是,由于编程时可能会出现各种错误。
这篇文章主要讨论在Keil编程中可能会遇到的一些错误,以及如何解决这些错误。
错误1:无法打开源文件在一个Keil项目中,需要引用许多源文件。
如果某个源文件无法被Keil所找到,就会出现这个错误。
通常情况下,出现这个错误的原因可能是:•路径错误:源文件路径与Keil项目设置的路径不一致。
•源文件名称错误:源文件名称拼写错误或者大小写不一致。
•编译器版本问题:源文件与编译器版本不兼容。
解决这个问题的方法是,确认源文件的路径、名称和版本是否正确。
如果以上都没有问题,可以尝试重新导入该源文件并重新配置路径来修复该错误。
错误2:定义错误在Keil编程中经常使用定义宏。
这种宏是在程序中声明的,用于定义变量和表示常数。
如果定义错误,编译器就会报错。
通常情况下,出现这个错误的原因可能是:•宏定义语法错误:定义宏时如语法错误则会引发这个错误。
•宏常量类型错误:定义宏时常量类型错误会导致编译错误。
•宏名称重复:定义两个相同名称的宏定义引发这个错误。
解决这个问题的方法是,确认定义宏的语法是否正确。
确认宏类型是否正确,如果该宏名称重复了,在程序中更改为不同的名称即可。
错误3:语法错误语法错误通常是由书写错误引起的。
Keil编译器在程序中检测到错误语法时,会抛出一个编译错误。
通常情况下,出现这个错误的原因可能是:•拼写错误:源代码中有单词拼写错误。
•语法错误:在编写代码时,例如函数、变量或指针中存在语法错误。
•缺少括号:程序员可能忘记使用括号,即忘记使用括号表示优先级。
解决这个问题的方法是,仔细检查程序代码中存在的错误和拼写错误。
错误4:链接错误链接错误在编译器完成编译后出现,它意味着编译器无法将所有的目标文件链接在一起来生成可执行文件。
KeiluVision4代码编辑器中⽂字符乱码问题
MDK-ARM 使⽤中⼀直有个很纠结的问题,中⽂字符⽀持不好。
⽐如写代码注释,使⽤中⽂删除字符就会只删除⼀半问题。
复制粘贴代码中间有中⽂就会出现乱码问题。
想过换IAR,新学个IDE也⿇烦,上⾯的问题也不很⼤稍微绕⼀下也能解决,所以⼀直没换。
发现其实这个根本不是问题,安装好后默认是ANSI编码,所以会出现上述问题。
只要把编码改成UTF-8编码就能解决上述烦恼。
设置步骤:
1、选择菜单:[Edit]->[Configuration]
2、页签[Editor]中 General Editor Settings 的Encoding 改为 Encode in UTF-8 without signature
注:建议修改为UTF-8 通⽤性⽐较好,不管在那⾥打开代码都不会出现问题。
版本:
Keil uVision4 V4.72.0.0。
1.warning: #550-D: variable "d" was set but never used描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.2.warning: #1-D: last line of file ends without a newline描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.3. warning: #111-D: statement is unreachable描述:声明不可能到达.多出现在这种场合:int main(void){...while(1) //无限循环,这在不使用操作系统的程序中最常见{...}return 0; //这句声明在正常情况下不可能执行到,编译器发出警告 }解决:不理会.4. warning: C3017W: data may be used before being set描述:变量'data'在使用前没有明确的赋值.如:uint8 i,data; //定义变量i和data,二者都没有明确赋值for ( i = 0; i < 8; i++) //变量'i'在语句中被赋值0{if ( IO1PIN & SO_CC2420 )data |= 0x01; //变量'data'在使用前没有明确赋值,编译器发出警告elsedata &= ~0x01;}解决:应仔细衡量该变量的初始值是否为0,若是,可以不理会这个警告,因为MDK编译器在程序执行前,会将使用到的数据区初始化为0,但若是该变量的初始值不应该是0,忽略这个警告可能会引起致命错误.这个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关.5. warning: #177-D: variable "temp" was declared but never referenced描述:变量'temp'进行了声明但没有引用.多出现在声明了一个变量,但却没有使用它,它和warning: #550-D: variable "temp" was set but never used不同之处在于temp从没有使用过.解决:若是定义的变量确实没有用,删除掉;若是有用,则在程序中使用. 与该警告类似的还有warning: #177-D: function "MACProcessBeacon" was declared but never referenced6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2"描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如: int DealwithInspect2(uint32 test){.........//此处应该是return x;返回一个int型数据,若是没有返回值,编译器产生警告}7..warning: #1295-D: Deprecated declaration lcd_init - give arg types描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.1. error: #65: expected a ";"描述:缺少分号.大多是漏忘';'.解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.2. error: #65: expected a ";"和error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如main.c,lcd.c,key.c...有很多头文件,如lcd.h,key.h,若是在lcd.h文件声明函数时没有加分号,那么这种错误可能定为到main.c中,所以要检查所有头文件.解决:仔细检查.h文件,将分号补上.3. Error: L6200E: Symbol flagu multiply defined (by uart0.o and main.o).描述:变量(也是一种符号)flagu多处定义(在uart0.c中和main.c都定义了).通常错在全局变量定义重复.比如:在main.c中定义全局变量flagu:uint8 flagu=0;在uart0.c中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰:extern uint8 flagu=0;然后编译,就会出现上面的连接错误,原因在于,我在uart0.c中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:extern uint8 flagu;解决办法:找到重复定义的变量,看情况修改一处.4.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:void a(void) //函数a的实体{b(); //调用函数b}void b(void) //函数b的实体{...}这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.解决方法:在函数a调用函数b之前,对函数b进行声明,如:void b(void); //对函数b进行声明void a(void) //函数a的实体{b(); //调用函数b}void b(void) //函数b的实体{...}5. error: #137: expression must be a modifiable lvalue描述:表达式必须是一个可以修改的左值.主要出现在这种现象:a=NUM;NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.解决方法:要么放弃赋值,要么修改变量属性.6.error: #18: expected a ")"如果是出现在c文件中, 多半是因为少了一个")",或者错误行有编译器不识别的字符如果出现在头文件中,错误行又是一个函数声明,多半是因为在函数声明中有编译器不认识的字符.7.error: #7: unrecognized token未识别的标记,多半是切换成了中文标点。
Error: L6200EError: L6200E: Symbol temp multiply defined (by wenshidu.o and main.o).在编译的时候出现了这个问题,但是检查不出来,希望各位大侠帮帮忙什么变量你给付了两次值你看看是不是那个外部变量你又给赋值了main.c申明,其他.c文件对应的.h文件中用extern引用error: #20error: #20: identifier "TIM2_IRQChannel" is undefined 谁能说说,哪里错了你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。
需要将.C文件添加到工程文件中warning: #1-Dmain.c(7): warning: #1-D: last line of file ends without a newline当使用keil编译时,弹出这样的警告信息:main.c(7): warning: #1-D: last line of file ends without a newline这个是由于在main函数的“}”后,没有加回车。
只要在main函数的“}”后加回车键,此警告信息即可消除。
error:#65...test_menu.c(27):error:#65:expected a ";"分数送你了,问题在你回答之前已经解决了,头文件里的结构体定义里的最后一行没有加";" 如 NB menu{..};error: #1113:折腾了大半天,才搞明白一个空操作的指令先在网上查有的说是__asm{NOP;},从intrins.h里调用,可犄角旮旯全找了,也没看到什么intrint.h的文件。
如果直接用,就出现error: #1113: Inline assembler not permitted when generating Thumb cod e最后搜索这条错误,知道是因为__asm("指令");这种语法是内联汇编(inline assembly)的语法。
一锤子Keil 4.7问题解决新增功能问题一锤子keil 4.7问题解决1. 安装2. 解决原子哥寄存器版本不能使用的问题3. 解决从别处复制代码时中文注释乱码问题4. 解决J-Link不能用的方法5. 使能代码提示功能6. 设置下载快捷键7.设置J-Link硬件仿真(可以在左侧观察运行时间)新增功能:1). 代码提示(Edit-Configuration-Text Completion选项卡-勾选Symbols after 3 Characters)2). 动态错误检查(代码有小问题会在左边框显示警告,一般无影响,或错误,这个要改动)3). 编辑器支持ctrl+鼠标滚轮缩放4). 硬件调试的时间观察(这个前几周才在开源电子网发现的,或许之前也有,很好用)…………问题:1). 原子哥的寄存器版本编译通不过2). 从别处复制代码时中文注释出现字体乱码3). J-link更新后提示是仿冒品,不能仿真,之后keil自动退出一锤子keil 4.7问题解决:1. 安装:如果用51MCU的话,先装keil C51,再装keil MDK,两者可以装一个目录下,共用一个启动快捷图标,软件附录里有,都是目前的最新版,破解时破解两回把两个都破解就行了:2. 解决原子哥寄存器版本不能使用的问题:下载附件中的STM32F10x.rar解压覆盖到安装目录C:\Program Files (x86)\Keil\ARM\INC\ST 覆盖STM32F10x文件夹即可:3. 解决从别处复制代码时中文注释乱码问题:Edit-Configuration-Editor选项卡,按照下图选择,当然这样字体不是太好看,可以在Colors & Fonts选项卡中加粗或改成好看的字体; Tab键默认2个空格,如果嫌不习惯,可以改成4:4. 解决J-Link不能用的问题:MDK4.7往后版本很好用但是用J-Link时会提醒更新,更新完后在MDK4.70,3.80也都不能用了,解决方法:下载附件中的Setup_JLinkARM_V440.exe 安装后到安装位置C:\Program Files (x86)\JLinkARM_V440复制JLinkARM.dll 文件到Keil安装目录:C:\Program Files (x86)\Keil MDK4.70\ARM\Segger替换 JLinkARM.dll 即可5. 使能代码提示功能:Edit-Configuration-Text Completion选项卡-勾选Symbols after 3 Characters:6. 设置下载快捷键Edit-Configuration-Shortcut Keys-找到Flash:Download,双击,这里我设置成F8,编辑完后直接F7编译,F8下载(使用J-Link):7.设置J-Link硬件仿真(可以在左侧观察运行时间):keil 4.7问题解决视频:视频链接:/v_show/id_XNjA5MzM2MTM2.html微风 ( weifengdq@ )。
keil4提示问题及解决办法汇总keil4 warning C316:unterminated conditionals像类似XX.C(99):warning C316:unterminated conditionals这种警告的话XX.c文件有一个凌乱的条件编译或预编译。
因为C语言中有些头文件中的预编译或宏定义,那么条件编译就避免不了。
写条件编译时,可能有忘写一个基本的语句。
比如说,你用了条件编译#ifndef而忘记写#endif。
因为他们本来就是配套的。
有前者必有后者。
不能丢掉其中任何一个。
一个include文件最后的#endif 少了# 前缀或者没有#endif,都会出现类似警告。
就像你写C语句,你不会写了int i 而不能忘记写 " ; " ,否者就不能把一个语句表达完整。
总之,出现上述问题。
先看看整个C文件中是否出现上述错误,或整个工程中自己写的那些头文件中里面的条件编译是否都写对了,即:前面写了#ifndef,后面是否有对应的#endif。
ERROR L105: PUBLIC REFERS TO IGNORED SEGMENT 的解决办法*** ERROR L107: ADDRESS SPACE OVERFLOWSPACE: DATASEGMENT: ?DT?USART_READWRITELENGTH: 007AH*** ERROR L118: REFERENCE MADE TO ERRONEOUSEXTERNALSYMBOL: USARTREADWAVEDATAMODULE: .\Timer_DAC.obj (TIMER_DAC)ADDRESS: 0367H*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENTSYMBOL: USARTREADWAVEDATASEGMENT: ?DT?USART_READWRITE*** ERROR L105: PUBLIC REFERS TO IGNORED SEGMENTSYMBOL: USARTDATACOUNTSEGMENT: ?DT?USART_READWRITEProgram Size: data=140.3 xdata=10 code=968Target not created上网查了下,找到了具体的原因及其相应的解决方案:====================================== ========================出现以上错误的原因主要是第一个原因,第一个原因导致了它下面所有错误,第一个原因是:ERROR L107: ADDRESS SPACE OVERFLOWSPACE: DATASEGMENT: ?DT?GMNS_3V4LENGTH: 0014H说明data空间已经不够用,原因是你可能有好多函数,而函数内部的局部变量又没有定义其空间,这种情况下,系统会将变量分配到你在Otions for Target 对话框里的设置的空间。
keil编译常见报错和解决方法Keil是一款常用的嵌入式开发工具,用于编写和调试嵌入式系统的程序。
在使用Keil编译时,我们常常会遇到一些报错信息。
本文将介绍一些常见的Keil编译报错及解决方法,帮助读者快速解决问题。
1. "Error: L6218E: Undefined symbol"错误这个错误通常是由于使用了未定义的变量或函数导致的。
解决方法是检查代码中使用的符号是否正确定义或是否包含了正确的头文件。
如果符号确实未定义,需要在代码中进行定义或者引入相关的头文件。
2. "Error: L6002U: Could not open file"错误这个错误表示编译器无法打开指定的文件。
解决方法是检查文件路径是否正确,文件是否存在,并且是否具有读取权限。
如果文件路径正确但是依然无法打开,可能是文件被其他程序占用或者权限设置不正确,需要解决这些问题后重新编译。
3. "Error: C2513: 'function' : no variable declared before '=' "错误这个错误表示在赋值语句中使用了未声明的变量。
解决方法是检查变量是否正确声明,并确保在赋值之前进行了声明。
如果变量确实未声明,需要在代码中添加相应的变量声明。
4. "Error: C2065: 'variable' : undeclared identifier"错误这个错误表示使用了未声明的变量。
解决方法是检查变量是否正确声明,并确保在使用之前进行了声明。
如果变量确实未声明,需要在代码中添加相应的变量声明。
5. "Error: C1083: Cannot open include file: 'header.h': No such file or directory"错误这个错误表示编译器无法找到指定的头文件。
keil4错误信息整合第七章错误信息本章列出了编程中可能遇到的致命错误语法错误和警告信息每节包括一个信息的主要说明和消除错误或警告条件可采取的措施致命错误致命错误立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不能访问一个特定的源包含文件时也产生致命错误致命错误信息采用下面的格式C51 FATAL-ERROR –ACTIONLINE:ERROR:C51 TERMIANTED.C51 FATAL-ERROR –ACTIONFILE:ERROR:C51 TERMIANTED.下面说明Action和Error中可能的内容Keil Software –Cx51 编译器用户手册—第七章错误信息190ActionsALLOCATING MEMORY编译器不能分配足够的存储区来编译指定的源文件CREATING LIST-FILE / OBJECT-FILE / WORKFILE编译器不能建立列表文件OBJ文件或工作文件这个错误的出现可能是磁盘满或写保护或文件已存在和只读GENERATING INTERMEDIATE CODE源文件包含的一个函数太大不能被编译器编译成虚拟代码尝试把函数分小或重新编译OPENING INPUT-FILE编译器不能发现或打开所选的源或包含文件PARSING INVOKE-/#PRAGMA-LINE当在命令行检测到参数计算或在一个#pragma中检测到参数计算就产生这样的错误PARSING SOURCE-FILE / ANALYZING DECLARATIONS源文件包含太多的外部参考减少源文件访问的外部变量和函数的数目WRITING TO FILE当写入列表文件OBJ文件或工作文件时遇到的错误Keil Software –Cx51 编译器用户手册—第七章错误信息191Errors‘(‘ AFTER CONTROL EXPECTED一些控制参数需要用括号包含一个参数当没有左括号时显示本信息‘)’ AFTER PARAMETER EXPECTED本信息表示包含没有参数的右括号BAD DIGIT IN NUMBER一个控制参数的数字参数包含无效字符只能是十进制数CAN’T CREATE FILE在FILE行定义的文件名不能建立CAN’T HAVE GERERAL CONTROL IN INVOCATION LINE一般控制例如EJECT 不能包含在命令行把这些控制用#pragma声明放在源文件中FILE DOES NOT EXIST没有发现定义在FILE行的文件FILE WRITE-ERROR因为磁盘空间不够写到列表预打印工作或目标文件时出错IDENTIFIER EXPECTED当DEFINE控制没有参数时产生本信息DEFINE要求一个参数作为标识符这和C语言的规则相同MEMORY SPACE EXHAUSTED编译器不能分配足够的存储区来编译指定的源文件如果始终出现这个信息应该把源文件分成两个或多个小文件再重新编译MORE THAN 100 ERRORS IN SOURCE-FILE在编译时检测到的错误超过100个这使编译器终止MORE THAN 256 SEGMENTS/EXTERNALS在一个源文件中的参考超过256个单个的源文件不能有超过256个函数或外部参考这是INTEL目标模块格式OMF-51 的历史的限制包含标量和/或bit声明的函数在OBJ文件中生成两个有时候三个段定义Keil Software –Cx51 编译器用户手册—第七章错误信息192NON-NULL ARGUMENT EXPECTED所选的控制参数需要用括号包含一个参数例如一个文件名或一个数字OUT OF RANGE NUMBER一个控制参数的数字参数超出范围例如OPTIMIZE控制只允许数字0到6 值7就将产生本错误信息PARSE STACK OVERFLOW解析堆栈溢出如果源程序包含很复杂的表达式或如果块的嵌套深度超过31级就会出现这个错误PREPROCESSOR LINE TOO LONG 32K一个中间扩展长度超过32K字符PREPROCESSOR MACROS TOO NESTED在宏扩展期间预处理器所用的堆栈太大这个信息通常表示一个递归的宏定义但也可表示一个宏嵌套太多RESPECIFIED OR CONFLICTING CONTROL一个命令行参数指定了两次或命令行参数冲突SOURCE MUST COME FROM A DISK-FILE源和包含文件必须存在控制台CON CI 或类似的设备不能作为输入文件UNKNOWN CONTROL所选的控制参数不认识Keil Software –Cx51 编译器用户手册—第七章错误信息193语法和语义错误语法和语义错误一般出现在源程序中它们确定实际的编程错误当遇到这些错误时编译器尝试绕过错误继续处理源文件当遇到更多的错误时编译器输出另外的错误信息但是不产生OBJ文件语法和语义错误在列表文件中生成一条信息这些错误信息用下面的格式*** ERROR number IN LINE line OF file:error message这里number 错误号line 对应源文件或包含文件的行号file 产生错误的源或包含文件名error message 对错误的叙述说明下表按错误号列出了语法和语义错误错误信息列出了主要说明和可能的原因和改正100 跳过不可打印字符0x??在源文件中发现一个非法字符注意不检查注释中的字符101 字符串没结束一个字符串没有用双引号终止102 字符串太长一个字符串不能超过4096个字符用串联符号\ 在逻辑上可延长字符串超过4096个字符这个模式的行终止符在词汇分析时是连续的103 无效的字符常数一个字符常数的格式无效符号\c 是无效的除非c是任何可打印的ASCII字符125 声明符太复杂20一个目标的声明可包含最多20个类型修饰符[ ] * 这个错误经常伴随着错误126Keil Software –Cx51 编译器用户手册—第七章错误信息194126 类型堆栈下溢类型声明堆栈下溢这个错误通常死错误125的副产品127 无效存储类一个目标用一个无效的存储空间标识符声明如果一个目标在一个函数外用存储类auto或register声明就会产生本错误129 在标记前缺少本错误通常表示前一行缺少分号当出现本错误时编译器会产生很多错误信息130 值超出范围在一个using或interrupt标识符后的数字参数是无效的using标识符要求一个0到3之间的寄存器组号interrupt标识符要求一个0到31之间的中断矢量号131 函数参数重复一个函数有相同的参数名在函数声明中参数名必须是唯一的132 没在正式的参数列表一个函数的参数声明用了一个名称没在参数名列表中例如char function(v0,v1,v2)char *v0,*v1,*v5;/* ‘v5’没在正式列表中*/{/* … */}134 函数的xdata/idata/pdata/data不允许函数通常位于code存储区不能在别的存储区运行函数默认定义为存储类型code135 bit的存储类错bit标量的声明可能包含一个static或extern存储类register或alien类是无效的136 变量用了voidvoid类型只允许作为一个不存在的返回值或一个函数的空参数列表void func(void) 或和一个指针组合void *138 Interrupt()不能接受或返回值一个中断函数被定义了一个或多个正式的参数或一个返回值中断函数不能包含调用参数或返回值140 位在非法的存储空间bit标量的定义可以包含可选的存储类型data 如果没有存储类型则默认为data 因为位通常在内部数据存储区当试图对一个bit标量定义别的数据类型时会产生本错误141 临近标志语法错误期待别的标志…编译器所见的标志是错误的参考所显示的期待的内容142 无效的基地址一个sfr或sbit声明的基地址是错误的有效的基地址范围在0x80到0xFF之间如果用符号基地址^位号声明则基地址必须是8的倍数Keil Software –Cx51 编译器用户手册—第七章错误信息195143 无效的绝对位地址sbit声明中的绝对位地址必须在0x80到0xFF之间144 基地址^位号无效的位号sbit声明中定义的位号必须在0到7之间145 未知的sfr146 无效sfr一个绝对位基地址^位号的声明包含一个无效的基地址标识符基地址必须是已经声明的sfr 任何别的名称是无效的147 目标文件太大单个目标文件不能超过65535 64K字节-1149 struct/union包含函数成员struct或union不能包含一个函数类型的成员但是指向函数的指针是可以的150 struct/union包含一个bit成员一个union不能包含bit类型成员这是8051的结构决定的151 struct/union自我关联一个结构不能包含自己152 位号超出位域位域声明中指定的位号超过给定基类的位号153 命名的位域不能为零命名的位域为零只要未命名的位域允许为零154 位域指针指向位域的指针不允许155 位域要求char/int位域的基类要求char或int unsigned char和unsigned int类型也行156 alien只允许对函数157 alien函数带可变参数存储类alien只对外部PL/M-51函数允许符号ch a r *,… 在alien 函数中是非法的PL/M-51函数通常要求一个固定的参数表158 函数包含未命名的参数一个函数的参数列表定义包含一个未命名的抽象类型定义这个符号只允许在函数原型中159 void后面带类型函数的原型声明可包含一个空参数列表例如int func(void) 在void后不能再有类型定义160 void无效void类型只在和指针组合或作为一个函数的不存在的返回值中是合法的161 忽视了正式参数在一个函数内一个外部函数的声明用了一个没有类型标识符的参数名列表例如extern yylex(a,b,c);Keil Software –Cx51 编译器用户手册—第七章错误信息196180 不能指向一个函数指向一个函数的类型是无效的尝试用指针指向一个函数181 操作数不兼容对给定的操作符至少一个操作数类型是无效的例如~float_type 183 左值不能修改要修改的目标位于code存储区或有const属性因此不能修改184 sizeof 非法操作数sizeof操作符不能确定一个函数或位域的大小185 不同的存储空间一个目标声明的存储空间和前一个同样目标声明的存储空间不同186 解除参照无效一个内部编译器问题会产生本信息如果本错误重复出现请和技术支持接洽187 不是一个左值所需的参数必须是一个可修改的目标地址188 未知目标大小因为没有一个数组的维数或间接通过一个void指针一个目标的大小不能计算189 & 对bit/sfr非法取地址符’&’ 不允许对bit目标或特殊函数寄存器sfr190 & 不是一个左值尝试建立一个指针指向一个未知目标193 非法操作类型193 对ptr非法add/sub193 对bit的非法操作193 错误操作数类型当对一个给定的操作符用了非法的操作数类型时产生本错误例如无效的表达式如bit*bit ptr+ptr 或ptr*anything 这个错误信息包括引起错误的操作符下面的操作对bit类型的操作数是可行的赋值=OR/复合OR | |=AND/复合AND & &=XOR/复合XOR ^ ^=bit比较= = !=取反~bit操作数可和别的数据类型在表达式中混用在这种情况类型转换自动执行194 * 间接指向一个未知大小的目标间接操作符*不能和void指针合用因为指针所指的目标的大小是未知的195 * 间接非法*操作符不能用到非指针参数Keil Software –Cx51 编译器用户手册—第七章错误信息197196 存储空间可能无效转换一个常数到一个指针常数产生一个无效的存储空间例如char *p=0x91234198 sizeof返回零sizeof操作符返回一个零199 ->’的左边要求struct/union指针->操作符的左边参数必须是一个struct指针或一个union指针200 . 左边要求struct/union.操作符的左边参数要求必须是struct或union类型201 未定义的struct/union给定的struct或union名是未知的202 未定义的标识符给定的标识符是未定义的203 错误的存储类参考名本错误表示编译器的一个问题如果重复出现请接洽技术支持204 未定义的成员给定的一个struct或union成员名是未定义的205 不能调用一个中断函数一个中断函数不能象一个正常函数一样调用中断的入口和退出代码是特殊的207 参数列表声明为void参数列表声明为void的函数不能从调用者接收参数208 太多的实参函数调用包含太多的实参209 太少的实参调用函数包含太少的实参210 太多的嵌套调用函数的嵌套调用不能超过10级211 调用不是对一个函数一个函数的调用项不是对一个函数或函数指针求值212 间接调用寄存器的参数不匹配通过一个指针的间接函数调用不包含实际的参数一个例外是当所有的参数可以通过寄存器传递这是由于Cx51所用的传递参数的方法被调用的函数名必须是已知的因为参数写到被调用函数的数据段但是对间接调用来说被调用函数的名称是未知的213 赋值符的左边不是一个左值赋值符的左边要求一个可修改目标的地址214 非法指针转换bit float或集合类型的目标不能转换为指针215 非法类型转换struct/union/void不能转换为任何别的类型Keil Software –Cx51 编译器用户手册—第七章错误信息198216 标号用在非数组中或维数超出一个数组引用包含太大的维数或目标不是一个数组217 非整数索引一个数组的维数表达式必须是char unsigned char int 或unsigned int类型别的类型都是非法的218 控制表达式用了void类型在一个while for 或do的限制表达式中不能用类型void219 long常数缩减为int一个常数表达式的值必须能用一个int类型表示220 非法常数表达式期望一个常数表达式目标名变量或函数不允许出现在常数表达式中221 非常数case/dim表达式一个case或一个维数[ ] 必须是一个常数表达式222 被零除223 被零取模编译器检测到一个被零除或取模225 表达式太复杂需简化一个表达式太复杂必须分成两个或多个子表达式226 重复的struct/union/enum标记一个struct union 或enum名早已定义227 表示一个union标记一个union名称早已定义为别的类型228 表示一个struct标记一个struct名早已定义为别的类型229 表示一个enum标记一个enum名早已定义为别的类型230 未知的struct/union/enum标记指定的struct union 或enum名未定义231 重复定义指定的名称已被定义232 重复标号指定的标号已定义233 未定义标号表示一个标号未定义有时候这个信息会在实际的标号的几行后出现这是所用的未定义标号的搜索方法引起的234 { 堆栈范围溢出31超过了最多31个嵌套块超出的嵌套块被忽略235 参数<数字> 不同类型函数声明的参数类型和函数原型中的不同Keil Software –Cx51 编译器用户手册—第七章错误信息199236 参数列表的长度不同函数声明中的参数数目和函数原型中的不同237 函数早已定义试图声明一个函数体两次238 重复成员239 重复参数试图定义一个已存在的struct成员或函数参数240 超出128个局部bit在一个函数内不能超过128个bit标量241 auto段太大局部目标所需的空间超过模式的极限最大的段大小定义如下SMALL 128字节COMPACT 256字节LARGE 65535字节242 太多的初始化软件初始化软件的数目超过初始化目标的数量243 字符串超出范围字符串中的字符数目超出字符串初始化的数目244 不能初始化错误的类型或类试图初始化一个bit或sfr245 未知的pragma 跳过本行#pragma状态未知所以整行被忽略246 浮点错误当一个浮点参数超出32位的范围就产生本错误32位IEEE值的范围是±1.175494E-38到±3.402823E+38247 非地址/常数初始化一个有效的初始化表达式必须是一个常数值求值或一个目标名加或减去一个常数248 集合初始化需要大括号给定struct或union初始化缺少大括号{}249 段<名> 段太大编译器检测到一个数据段太大一个数据段的最大的大小由存储空间决定250 \esc 值超过255一个字符串常数中的转义序列超过有效值范围最大值是255252 非法八进制数指定的字符不是一个有效的八进制数252 主要控制放错地方行被忽略主要控制必须被指定在C模块的开头在任何#include命令或声明前Keil Software –Cx51 编译器用户手册—第七章错误信息200253 内部错误ASMGEN\CLASS在下列情况下出现本错误一个内在函数例如_testbit_ 被错误激活这种情况是在没有函数原型存在和实参数目或类型错误对这种原因必须使用合适的声明文件INTRINS.H STRING.H 参考第八章中的instrinsic函数Cx51确认一个内部一致性问题请接洽技术支持255 switch表达式有非法类型在一个switch表达式没有合法的数据类型256 存储模式冲突一个包含alien属性的函数只能包含模式标识符small 函数的参数必须位于内部数据区这适用于所有的外部alien声明和alien函数例如alien plm_func(char c) large {…}产生错误256257 alien函数不能重入一个包含alien属性的函数不能同时包含reentrant属性函数参数不能跳过虚拟堆栈传递这适用于所有的外部alien声明和alien函数258 struct/union成员的存储空间非法非法空间的参数被忽略一个结构的成员或参数不能包含一个存储类型标识符但指针所指的目标可能包含一个存储类型例如struct vp{char code c;int xdata i; };产生错误258struct v1{char c;int xdata *i; };是正确的struct声明259 指针不同的存储空间一个空指针被关联到别的不同存储空间的空指针例如char xdata *p1;char idata *p2;p1 = p2; /* 不同的存储空间*/260 指针断开一个空指针被关联到一些常数值这些值超过了指针存储空间的值范围例如char idata *p1 = 0x1234; /* 结果是0x34 */Keil Software –Cx51 编译器用户手册—第七章错误信息201261 reentrant()内有bit一个可重入属性的函数的声明中不能包含bit目标例如int func1(int i1) reentrant {bit b1,b2; /* 不允许*/return(i1-1);}262 using/disable 不能返回bit值用using属性声明的函数和禁止中断#pragma disable 的函数不能返回一个bit 值给调用者例如bit test(void) using 3{bit b0;return(b0);}产生错误262263 保存/恢复堆栈保存溢出/下溢#pragma save的最大嵌套深度是八级堆栈的pragma save和restore工作根据LIFO 后进先出规则264 内在的<内在的名称> 声明/激活错误本错误表示一个内在的函数错误定义参数数目或省略号如果用标准的.H文件就不会产生本错误确认使用了Cx51所有的.H文件不要尝试对内在的库函数定义自己的原型265 对非重入函数递归调用非重入函数不能被递归调用因为这样会覆盖函数的参数和局部数据如果需要递归调用需声明函数为可重入函数267 函数定义需要ANSI类型的原型一个函数被带参数调用但是声明是一个空的参数列表原型必须有完整的参数类型这样编译器就可能通过寄存器传递参数和适合应用的调用机制268 任务定义错误任务ID/优先级/using任务声明错误271 asm/endasm 控制放错地方asm和endasm声明不能嵌套endasm要求一个汇编块前面用asm开头例如#pragma asm...汇编指令... #pragma endasmKeil Software –Cx51 编译器用户手册—第七章错误信息202272 asm 要求激活SRC控制在一个源文件中使用asm和endasm 要求文件用SRC控制编译那么编译器就会生成汇编源文件然后可以用A51汇编273 asm/endasm 在包含文件中不允许在包含文件中不允许asm和endasm 为了调试在包含文件不能有任何的可执行代码274 非法的绝对标识符绝对地址标识符对位目标函数和局部函数不允许地址必须和目标的存储空间一致例如下面的声明是无效的因为间接寻址的范围是0x00到0xFF idata int _at_ 0x1000;278 常数太大当浮点参数超出32位的浮点值范围就产生本错误32位IEEE值的范围是±1.175494E-38到±3.402823E+38279 多次初始化试图多次初始化一个目标280 没有使用符号/标号/参数在一个函数中声明了一个符号标号或参数但没有使用281 非指针类型转换为指针引用的程序目标不能转换成一个指针282 不是一个SFR引用本函数调用要求一个SFR作为参数283 asmparms 参数不适合寄存器参数不适合可用的CPU寄存器Keil Software –Cx51 编译器用户手册—第七章错误信息203284 <名称> 在可覆盖空间函数不再可重入一个可重入函数包含对局部变量的明确的存储类型标识符函数不再完全可重入300 注释未结束一个注释没有一个结束符*/301 期望标识符一个预处理器命令期望一个标识符302 误用#操作符字符操作符# 没有带一个标识符303 期望正式参数字符操作符# 没有带一个标识符表示当前所定义的宏的一个正式参数名304 错误的宏参数列表宏参数列表没有一个大括号逗号分开的标识符列表305 string/char 常数未结束一个字符串活字符常数是无效的典型的后引号丢失306 宏调用未结束预处理器在收集和扩展一个宏调用的实际的参数时遇到输入文件的结尾Keil Software –Cx51 编译器用户手册—第七章错误信息204307 宏名称参数计算不匹配在一个宏调用中实际的参数数目和宏定义的参数数目不匹配本错误表示指定了太少的参数308 无效的整数常数表达式一个if/elif 命令的数学表达式包含一个语法错误309 错误或缺少文件名在一个include 命令中的文件名参数是无效的或没有310 条件嵌套过多20源文件包含太多的条件编译嵌套命令最多允许20 级嵌套311 elif/else 控制放错地方312 endif 控制放错地方命令elif else 和endif 只有在if ifdef 或ifndef 命令中是合法的313 不能清除预定义的宏名称试图清除一个预定义宏用户定义的宏可以用#undef 命令删除预定义的宏不能清除314 #命令语法错误在一个预处理器命令中字符# 必须跟一个新行或一个预处理器命令名例如if/define/ifdef …315 未知的#命令名称预处理器命令是未知的316 条件未结束到文件结尾endif 的数目和if 或ifdef 的数目不匹配318 不能打开文件文件名指定的文件不能打开319 文件不是一个磁盘文件指定的文件不是一个磁盘文件文件不能编辑320 用户自定义的内容本错误号未预处理器的#error 命令保留#error 命令产生错误号320 送出用户定义的错误内容终止编译器生成代码321 缺少<字符>在一个include 命令的文件名参数中缺少结束符例如#include<stdio.h< bdsfid="531" p=""></stdio.h<>325 正参名称重复一个宏的正参只能定义一次326 宏体不能以## 开始或结束## 不能是一个宏体的开始或结束327 宏宏名超过50 个参数每个宏的参数数目不能超过50Keil Software –Cx51 编译器用户手册—第七章错误信息205警告警告产生潜在问题的信息他们可能在目标程序的运行过程中出现警告不妨碍源文件的编译警告在列表文件中生成信息警告信息用下面的格式*** WARNING number IN LINE line OF file: warning message 这里number 错误号line 在源文件或包含文件中的对应行号file 错误产生的源或包含文件名warning message 警告的内容下表按号列出了警告警告信息包括一个主要的内容和可能的原因和纠正措施173 缺少返回表达式一个函数返回一个除了int 类型以外的别的类型的值必须包含一个返回声明包括一个表达式为了兼容旧的程序对返回一个int 值的函数不作检查182 指针指向不同的目标一个指针关联了一个不同类型的地址185 不同的存储空间一个目标声明的存储空间和前面声明的同样目标的存储空间不同196 存储空间可能无效把一个无效的常数值分配给一个指针无效的指针常数是long 或unsigned long 编译器对指针采用24 位3 字节低16 位代表偏移高8 位代表选择的存储空间198 sizeof 返回零一个目标的大小计算结果为零如果目标是外部的或如果一个数组的维数没有全知道则值是错误的Keil Software –Cx51 编译器用户手册—第七章错误信息206 206 缺少函数原型因为没有原型声明被调用的函数是未知的调用一个未知的函数通常是危险的参数的数目和实际要求不一样如果是这种情况函数调用不正确没有函数原型编译器不能检查参数的数目和类型要避免这种警告应在程序中包含函数的原型函数原型必须在函数被调用前声明注意函数定义自动生成原型209 实参太少在一个函数调用中包含太少的实参219 long 常数被缩减为int一个常数表达式的值必须能被一个int 类型所表示245 未知的pragma 本行被忽略#pragma 声明是未知的因此整行程序被忽略258 struct/union 成员的存储空间方法参数的存储空间被忽略一个结构的成员或一个参数不能指定存储类型但是指针所指的目标可以包含一个存储类型例如struct vp{ char code c;int xdata i; };产生警告258struct v1{ char c;int xdata *i; };对struct 是正确的声明259 指针不同的存储空间两个要比较的指针没有引用相同的存储类型的目标260 指针折断把一个指针转换为一个更小偏移区的指针转换会完成但大指针的偏移会折断来适应小指针261 bit 在重入函数一个reentrant 函数不能包含bit 因为bit 标量不能保存在虚拟堆栈中265 名称对非重入函数递归调用发现对一个非重入函数直接递归这可能是故意的但对每个独立的情况进行功能性检查通过生成的代码间接递归由连接/定位器检查Keil Software –Cx51 编译器用户手册—第七章错误信息207271 asm/endams 控制放错地方asm 和endasm 不能嵌套endasm 要求一个以asm 声明开头的汇编块例如#pragma asm...汇编指令...#pragma endasm275 表达式可能无效编译器检测到一个表达式不生成代码例如void test(void) {int i1,i2,i3;i1,i2,i3; /* 死表达式*/i1 << i3; /* 结果未使用*/。
最近在做LPC1114芯片的开发,编译器用的Keil uVision4,如下问题:仿真器用的JLink的,运行开发板的例程,可以仿真。
Ctrl+F5后,代码区左边的箭头会指到程序的开始(main()函数的第一句)。
自己建了一个工程,Ctrl+F5后,看不到左边的箭头,调试工具栏的逐语句、逐过程等钮也是灰的即不能单步运行。
下面是Ctrl+F5后正常的截图:解决方法:在网上找到一个同样问题的帖子说是“是启动代码的配置问题。
跟startup.s里面的某一段汇编代码有关系。
”。
不过他用的芯片不是LPC1114。
/forum.php?mod=viewthread&tid=283475。
借鉴这哥们儿的方法,逐一查找自建的工程与正常工程的设置,弄了好一会儿,还是不行,有别的事就先放下了。
第二天一早,再对与正常工程的设置,发现有个地方没有打勾,option->Target里的Use MicroLIB复选框(查了关于MicroLIB的资料,还是不太明白,难道LPC1114芯片,编译不选这个,就不能仿真吗?),解决了问题,下面把正常设置的截图贴上。
Target:对我这个问题,这个是重点。
/////////////////////////////////////////////////////////Output://///////////////////////////////////////////////////////////// Listing://////////////////User://////////////////////////////////////////////////////////C/C++:下面红色框里是可选项,跟本问题应该没有关系。
////////////////////////////////////Asm: 打了Use MicroLIB后,下面框里就变了。
//////////////////////////////////////////////////// Linker://////////////////////////////////Debug://///////////////////////////////////////////////////////////////////////// Utilities:。
keil4常见编译错误解决Keil C编译器常见警告与错误信息解决方法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.CError:318:can’t open file‘beep.h’说明在编译C:\8051\MANN.C程序过程中由于main.c用了指令#i nclude“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()函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms()函数或利用条件编译#if…..#endif,可保留该函数并不编译6***WARNING6:XDATA SPACE MEMORY OVERLAPFROM:0025HTO:0025H说明外部资料ROM的0025H重复定义地址解决方法外部资料ROM的定义如下Pdata unsigned char XFR_ADC_at_0x25其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25处并修正它7WARNING206:’DelayX1ms’:missing function-prototype C:\8051\INPUT.CError267:’DelayX1ms‘:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用8***WARNING1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC函数但未将该函数的含扩档C加入到工程档Prj作编译和连接解决方法设MUSIC3函数在MUSIC C里将MUSIC C添加到工程文件中去9***ERROR107:ADDESS SPACE OVERFLOWSPACE:DATASEGMENT:_DATA_GOUP_LENGTH:0018H***ERROR118:REFERENCE MADE TO ERRONEOUS EXTERNAL SYMBOL:VOLUMEMODULE:C:\8051\OSDM.OBJ(OSDM)ADDRESS:4036H说明data存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL则局部变量先使用工作寄存器R2~R7作暂存当存储器不够用时则会以data型别的空间作暂存的个数超过0x7f时就会出现地址不够的现象解决方法将以data型别定义的公共变量修改为idata型别的定义说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享10定义了全局变量而没有外部External声明:reference made to erroneous external Ram空间不足:public refers to ignore segment外部变量:定义处不用加External,声明处要加External将以data型别定义的公共变量修改为idata型别的定义11***ERROR L118:REFERENCE MADE TO ERRONEOUS EXTERNAL定义了某某函数或全部变量在不同文件里面想调用它,却在包含头文件里面少了extern 语句,或只有主程序和包含头文件没有(EXTERN......定义语句(函数)).如果调试时有些if结构里的语句符合条件没有执行,或者某些语句不符合条件也被执行,那是因为if和else里有相同的语句,编译的时候作优化处理了。
keil 4 中的一些常见问题处理办法
keil 软件对于一个单片机编程者来说已经再熟悉不过了,我们都用得很多,但往往我们应用时总会遇到这样那样的问题,但又苦于无法解决,最终只能凑合着用。
下面我就个人经验对部分问题的解决方法给大家分享一下,也为初学者打点keil的应用基础。
不管他是哪个版本的,其处理办法基本都差不多,甚至可以说是完全一样的,下面我们就谈点实际的问题。
1、keil 4 中注释时,为什么不能打进汉字,都是方框?
其处理方法:Edit -> Configuration,点击Colors & Fonts选项卡,在Window列表中选择Editor C Files,在右侧选择字体Courier,Use color in Comments 不能打钩.
在做完上面的操作后,我来进行一下前后比较:
显示效果如下:
1、操作前:
如果后面注释的黑线是方框,操作一样,但要适当改变字体(eg:宋体、新宋体都行)。
2、操作后显示效果:
通过显示我们可以很直观的看到,注释中的文字已经清楚的显示了出来。
2、改变关键字颜色:
方法:Edit -> Configuration->Colors & Fonts->Editor C Files->keyword->选择foreground为任意你想要的颜色(蓝色)。
显示效果如下:
通过这一系列操作后,你可以将不同类型的数据改成你想要的颜色,方便你的编程和查错。
3、当前操作行底纹颜色和选中文字颜色设置:(1)当前工作行底纹和选中其文字设置:
显示效果:
(2)当前选中文字颜色和底纹显示:
显示效果:
通过该项操作后,你可以快速的找到你所编辑的区域,行数,甚至行段。
4、程序中空格显示为一点,如下图:
解决办法:
修改后显示效果:
该项操作可以让页面更漂亮,更能满足我们的视觉习惯,提高变成效率。
5、没有程序行数框架显示,如下图:
操作方法:
操作后显示结果:
其它操作方式基本类似,均可进行相应操作,达到自己想要的结果。
以上均是个人操作经验,均已被验证可行后才分享给大家的,也愿大家相互补充,使其所有操作更加完整,使更多得人学好keil,更希望你们的分享。
ZJK 2013.01.08
QQ:459576729。