Keil编译常见问题
keil软件编译常见错误解释总结和中文翻译
keil软件编译常见错误解释总结和中文翻译Keil编译时出现错误和警告的总结和C 编译器错误信息中文翻译(1)L15重复调用***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?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 ! *)上面的指令防止了该函数使用的内存区被其他函数覆盖。
150!单片机编译器KEIL的常见错误汇总(中英对照)
150!单片机编译器KEIL的常见错误汇总(中英对照)error 1:Out of memory 内存溢出error 2:Identifier expected 缺标识符error 3:Unknown identifier 未定义的标识符error 4:Duplicate identifier 重复定义的标识符error 5:Syntax error 语法错误error 6:Error in real constant 实型常量错误error 7:Error in integer constant 整型常量错误error 8:String constant exceeds line 字符串常量超过一行error 10:Unexpected end of file 文件非正常结束error 11:Line too long 行太长error 12:Type identifier expected 未定义的类型标识符error 13:T oo many open files 打开文件太多error 14:Invalid file name 无效的文件名error 15:File not found 文件未找到error 16:Disk full 磁盘满error 17:Invalid compiler directive 无效的编译命令error 18:T oo many files 文件太多error 19:Undefined type in pointer def 指针定义中未定义类型error 20:Variable identifier expected 缺变量标识符error 21:Error in type 类型错误error 22:Structure too large 结构类型太长error 23:Set base type out of range 集合基类型越界error 24:File components may not be files or objectsfile分量不能是文件或对象error 25:Invalid string length 无效的字符串长度error 26:Type mismatch 类型不匹配error 27:Invalid subrange base type 无效的子界基类型error 28:Lower bound greater than upper bound 下界超过上界error 29:Ordinal type expected 缺有序类型】error 30:Integer constant expected 缺整型常量error 31:Constant expected 缺常量error 32:Integer or real constant expected 缺整型或实型常量error 33:Pointer Type identifier expected 缺指针类型标识符error 34:Invalid function result type 无效的函数结果类型error 35:Label identifier expected 缺标号标识符error 36:BEGIN expected 缺BEGINerror 37:END expected 缺ENDerror 38:Integer expression expected 缺整型表达式error 39:Ordinal expression expected 缺有序类型表达式error 40:Boolean expression expected 缺布尔表达式error 41:Operand types do not match 操作数类型不匹配error 42:Error in expression 表达式错误error 43:Illegal assignment 非法赋值error 44:Field identifier expected 缺域标识符error 45:Object file too large 目标文件太大error 46:Undefined external 未定义的外部过程与函数error 47:Invalid object file record 无效的OBJ文件格式error 48:Code segment too large 代码段太长error 49:Data segment too large 数据段太长error 50:DO expected 缺DOerror 51:Invalid PUBLIC definition 无效的PUBLIC定义error 52:Invalid EXTRN definition 无效的EXTRN定义error 53:T oo many EXTRN definitions 太多的EXTRN定义error 54:OF expected 缺OFerror 55:INTERFACE expected 缺INTERFACEerror 56:Invalid relocatable reference 无效的可重定位引用error 57:THEN expected 缺THENerror 58:TO or DOWNTO expected 缺TO或DOWNTOerror 59:Undefined forward 提前引用未经定义的说明error 61:Invalid typecast 无效的类型转换error 62:Division by zero 被零除error 63:Invalid file type 无效的文件类型error 64:Cannot read or write variables of this type 不能读写此类型变量error 65:Pointer variable expected 缺指针类型变量error 66:String variable expected 缺字符串变量error 67:String expression expected 缺字符串表达式error 68:Circular unit reference 单元UNIT部件循环引用error 69:Unit name mismatch 单元名不匹配error 70:Unit version mismatch 单元版本不匹配error 71:Internal stack overflow 内部堆栈溢出error 72:Unit file format error 单元文件格式错误error 73:IMPLEMENTATION expected 缺IMPLEMENTATION error 74:Constant and case types do not match 常量和CASE类型不匹配error 75:Record or object variable expected 缺记录或对象变量error 76:Constant out of range 常量越界error 77:File variable expected 缺文件变量error 78:Pointer expression expected 缺指针表达式error 79:Integer or real expression expected 缺整型或实型表达式error 80:Label not within current block 标号不在当前块内error 81:Label already defined 标号已定义error 82:Undefined label in preceding statement part 在前面未定义标号error 83:Invalid @ argument 无效的@参数error 84:UNIT expected 缺UNITerror 85:';' expected 缺“;”error 86:':' expected 缺“:”error 87:',' expected 缺“,”error 88:'(' expected 缺“(”error 89:')' expected 缺“)”error 90:'=' expected 缺“=”error 91:':=' expected 缺“:=”error 92:'[' or '(.' Expected 缺“[”或“(.”error 93:']' or '.)' expected 缺“]”或“.)”error 94:'.' expected 缺“.”error 95:'..' expected 缺“..”error 96:T oo many variables 变量太多error 97:Invalid FOR control variable 无效的FOR循环控制变量error 98:Integer variable expected 缺整型变量error 99:Files and procedure types are not allowed here 该处不允许文件和过程类型error 100:String length mismatch 字符串长度不匹配error 101:Invalid ordering of fields 无效域顺序error 102:String constant expected 缺字符串常量error 103:Integer or real variable expected 缺整型或实型变量error 104:Ordinal variable expected 缺有序类型变量error 105:INLINE error INLINE错误error 106:Character expression expected 缺字符表达式error 107:Too many relocation items 重定位项太多error 108:Overflow in arithmetic operation 算术运算溢出error 112:CASE constant out of range CASE常量越界error 113:Error in statement 表达式错误error 114:Cannot call an interrupt procedure 不能调用中断过程error 116:Must be in 8087 mode to compile this 必须在8087模式编译error 117:Target address not found 找不到目标地址error 118:Include files are not allowed here 该处不允许INCLUDE文件error 119:No inherited methods are accessible here 该处继承方法不可访问error 121:Invalid qualifier 无效的限定符error 122:Invalid variable reference 无效的变量引用error 123:Too many symbols 符号太多error 124:Statement part too large 语句体太长error 126:Files must be var parameters 文件必须是变量形参error 127:Too many conditional symbols 条件符号太多error 128:Misplaced conditional directive 条件指令错位error 129:ENDIF directive missing 缺ENDIF指令error 130:Error in initial conditional defines 初始条件定义错误error 131:Header does not match previous definition 和前面定义的过程或函数不匹配error 133:Cannot evaluate this expression 不能计算该表达式error 134:Expression incorrectly terminated 表达式错误结束error 135:Invalid format specifier 无效格式说明符error 136:Invalid indirect reference 无效的间接引用error 137:Structured variables are not allowed here 该处不允许结构变量error 138:Cannot evaluate without System unit 没有System 单元不能计算error 139:Cannot access this symbol 不能存取符号error 140:Invalid floating point operation 无效的符号运算error 141:Cannot compile overlays to memory 不能编译覆盖模块至内存error 142:Pointer or procedural variable expected 缺指针或过程变量error 143:Invalid procedure or function reference 无效的过程或函数调用error 144:Cannot overlay this unit 不能覆盖该单元error 146:File access denied 不允许文件访问error 147:Object type expected 缺对象类型error 148:Local object types are not allowed 不允许局部对象类型error 149:VIRTUAL expected 缺VIRTUALerror 150:Method identifier expected 缺方法标识符error 151:Virtual constructors are not allowed 不允许虚构造函数error 152:Constructor identifier expected 缺构造函数标识符error 153:Destructor identifier expected 缺析构函数标识符error 154:Fail only allowed within constructors 只能在构造函数内使用Fail标准过程error 155:Invalid combination of opcode and operands 操作数与操作符无效组合error 156:Memory reference expected 缺内存引用指针error 157:Cannot add or subtract relocatable symbols 不能加减可重定位符号error 158:Invalid register combination 无效寄存器组合error 159:286/287 instructions are not enabled 未激活286/287指令error 160:Invalid symbol reference 无效符号指针error 161:Code generation error 代码生成错误error 162:ASM expected 缺ASMerror 166:Procedure or function identifier expected 缺过程或函数标识符error 167:Cannot export this symbol 不能输出该符号error 168:Duplicate export name 外部文件名重复error 169:Executable file header too large 可执行文件头太长error 170:Too many segments 段太多END。
Keil5编译问题
cannot open source input file “core cm4.h”解决方法装了比MDK5.11A更高版本的MDK后,可能出现编译标准例程报如下错误:..\SYSTEM\sys\stm32f4xx.h(470): error: #5: cannot open source input file "core_cm4.h": No such file or directory实际出错是在stm32f4xx.h,如图1所示:图1 找不到core_cm4.h路径.该core_cm4.h文件在stm32f4xx.h里面被引用,实际上是ARM CMSIS的东西,路径在MDK 安装路径下,为: MDK安装目录\ARM\Pack\ARM\CMSIS\4.1.1\CMSIS\Include一般来说,装了CMSIS支持包就应该可以找到才对,但是部分客户电脑无法找到,原因未知.不过,我们可以通过手动制定路径的办法,解决这个问题.添加方法:点击魔术棒-->C/C++选项卡-->Include Paths ,选择我们MDK安装目录,找到\ARM\Pack\ARM\CMSIS\4.1.1\CMSIS\Include,如图2所示:图2 手动添加CMSIS头文件路径.之后,多次点击确认,回到主界面.再重新编译,即可解决问题.方法二:个人建议,当找到上述的路径之后,可以看到include目录,所以可以直接将当前的目录拷贝出来(不过要注意MDK版本),直接放到当前工程的目录下,通过魔术棒-◊C++-◊include 包含以下编译就OK,(以后对新工程的使用方便快捷(MDK版本没有发生变化的情况下)),具体的操作见下图:keil5 编译程序出现错误Error: L6411E: No compatible library exists with a definition of startup symbol __mainError: L6411E: No compatible library exists with a definition of startup symbol __main.之前装过ADS,ADS与MDK冲突,依据网友提供的资料,最终的解决办法如下在我的电脑点击属性>高级系统设置>高级>环境变量>在系统变量中>新建(如果我的电脑只是快捷方式则属性中不会出现环境变量,需要在屏幕空白处右击,选择个性化,主题,找到桌面图标设置(系统不同,位置不一定一样,在个性化中可以找到),将计算机选项勾选即可)变量名:ARMCC5LIB变量值:F:\Keil_v5\ARM\ARMCC\lib(变量值是keil的安装目录,本人安装目录在F:\Keil_v5,剩下的目录是安装时系统自己建立,直接相同即可)。
KEIL常见编译错误大全
KEIL常见编译错误大全KEIL常见编译错误大全【致命错误】立即终止编译这些错误通常是命令行指定的无效选项的结果当编译器不能访问一个特定的源包含文件时也产生致命错误致命错误信息采用下面的格式C51FATAL-ERROR–ACTION:LINE:ERROR:C51TERMIANTED.C51FATAL-ERROR–ACTION:FILE:ERROR:C51TERMIANTED.下面说明Action和Error中可能的内容Actions ALLOCATING 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文件,或工作文件时遇到的错误.Errors‘(‘AFTER CONTROL E XPECTED一些控制参数需要用括号包含一个参数.当没有左括号时显示本信息.‘)’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 THAN100ERRORS IN SOURCE-FILE在编译时检测到的错误超过100个.这使编译器终止.MORE THAN256SEGMENTS/EXTERNALS在一个源文件中的参考超过256.个单个的源文件不能有超过256个函数或外部参考.这是INTEL目标模块格式(OMF-51)的历史的限制.包含标量和/或bit声明的函数在OBJ文件中生成两个,有时候三个段定义NON-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所选的控制参数不认识.【语法和语义错误】语法和语义错误一般出现在源程序中.它们确定实际的编程错误.当遇到这些错误时,编译器尝试绕过错误继续处理源文件.当遇到更多的错误时,编译器输出另外的错误,信息但是不产生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个类型修饰符[]*这个错误经常伴随着错误126类型堆栈下溢类型声明堆栈下溢这个错误通常死错误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存储区不能在别的存储区运行函数默认定义为存储类型code135bit的存储类错bit标量的声明可能包含一个static或extern存储类register或alien类是无效的136变量用了voidvoid类型只允许作为一个不存在的返回值或一个函数的空参数列表voidfunc(void)或和一个指针组合void*138Interrupt()不能接受或返回值一个中断函数被定义了一个或多个正式的参数或一个返回值中断函数不能包含调用参数或返回值140位在非法的存储空间bit标量的定义可以包含可选的存储类型data如果没有存储类型则默认为data因为位通常在内部数据存储区当试图对一个bit标量定义别的数据类型时会产生本错误141临近标志语法错误期待别的标志…编译器所见的标志是错误的参考所显示的期待的内容142无效的基地址一个sfr或sbit声明的基地址是错误的有效的基地址范围在0x80到0xFF之间如果用符号基地址^位号声明则基地址必须是8的倍数143无效的绝对位地址sbit声明中的绝对位地址必须在0x80到0xFF之间144基地址^位号无效的位号sbit声明中定义的位号必须在0到7之间145未知的sfr146无效sfr一个绝对位基地址^位号的声明包含一个无效的基地址标识符基地址必须是已经声明的sfr任何别的名称是无效的147目标文件太大单个目标文件不能超过6553564K字节-1149struct/union包含函数成员struct或union不能包含一个函数类型的成员但是指向函数的指针是可以的150struct/union包含一个bit成员一个union不能包含bit类型成员这是8051的结构决定的151struct/union自我关联一个结构不能包含自己152位号超出位域位域声明中指定的位号超过给定基类的位号153命名的位域不能为零命名的位域为零只要未命名的位域允许为零154位域指针指向位域的指针不允许155位域要求char/int位域的基类要求char或int unsigned char 和unsigned int类型也行156alien只允许对函数157alien函数带可变参数存储类alien只对外部PL/M-51函数允许符号char*,…在alien函数中是非法的PL/M-51函数通常要求一个固定的参数表158函数包含未命名的参数一个函数的参数列表定义包含一个未命名的抽象类型定义这个符号只允许在函数原型中159void后面带类型函数的原型声明可包含一个空参数列表例如int func(void)在void 后不能再有类型定义160void无效void类型只在和指针组合或作为一个函数的不存在的返回值中是合法的161忽视了正式参数在一个函数内一个外部函数的声明用了一个没有类型标识符的参数名列表例如extern yylex(a,b,c);180不能指向一个函数指向一个函数的类型是无效的尝试用指针指向一个函数181操作数不兼容对给定的操作符至少一个操作数类型是无效的例如~float_type 183左值不能修改要修改的目标位于code存储区或有const属性因此不能修改184sizeof非法操作数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*间接非法*操作符不能用到非指针参数196存储空间可能无效转换一个常数到一个指针常数产生一个无效的存储空间例如char *p=0x91234198sizeof返回零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不能转换为任何别的类型216标号用在非数组中或维数超出一个数组引用包含太大的维数或目标不是一个数组217非整数索引一个数组的维数表达式必须是char unsigned char int或unsigned int类型别的类型都是非法的218控制表达式用了void类型在一个while for或do的限制表达式中不能用类型void219long常数缩减为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参数<数字>不同类型函数声明的参数类型和函数原型中的不同236参数列表的长度不同函数声明中的参数数目和函数原型中的不同237函数早已定义试图声明一个函数体两次238重复成员239重复参数试图定义一个已存在的struct成员或函数参数240超出128个局部bit在一个函数内不能超过128个bit标量241auto段太大局部目标所需的空间超过模式的极限最大的段大小定义如下SMALL128字节COMPACT256字节LARGE65535字节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命令或声明前253内部错误ASMGEN\CLASS在下列情况下出现本错误,一个内在函数例如_testbit_被错误激活这种情况是在没有函数原型存在和实参数目或类型错误对这种原因必须使用合适的声明文件,INTRINS.H STRING.H参考第八章中的instrinsic函数,Cx51确认一个内部一致性问题请接洽技术支持255switch表达式有非法类型在一个switch表达式没有合法的数据类型256存储模式冲突一个包含alien属性的函数只能包含模式标识符small函数的参数必须位于内部数据区这适用于所有的外部alien声明和alien函数,例如:alien plm_func(char c)large{…}产生错误256。
Keil编译与下载设置及常见问题解决方案
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编译环境下经常出现的错误
Keil编译环境下经常出现的错误问题使用XC164单片机在Keil环境下编译程序时经常出现一些问题,希望得到帮助.回答以下有一些Keil C166 编译器使用过程中常见问题,请参考.1. 在C环境下能访问到16M范围吗?可以的.通过huge 和xhuge 类型就可以访问到16M地址空间. Huge存储类型使用16位地址计算,所以最大范围为64K,但这是最优的一种存储方式.xhuge存储类型没有大小的限制.2. 如何修改系统堆栈的大小和位置?需要编辑START166.A66文件.修改STK_SIZE=7,然后设置SSTSZ为自己设定的值.例如SSTSZ EQU 200H 则设置了系统堆栈大小为200H BYTES 但要注意系统堆栈要放到IDATA存储区内.3. 能不能在运行或编译时确定程序的大小?不可以.但可以在程序的结尾放一个变量,这一变量并非自动生成并需要在程序中放置所有变量,然后把”E OF”变量放到最后.4. 如何在函数中禁止中断?可以用#pragma disable来禁止中断,例如:#pragma disablevoid function(void){ if (flag==0){ flag=1;flag2=1;}}在进入函数时禁止中断,在退出函数时恢复中断.5. Keil C166编译器是否支持C164?是的, Keil C166编译器可以支持80C166,C167,C165,C164,C163,C161,XC164和ST10系列.6. 如何使能XBUS外围设备?通过修改\C166\LIB中的START166.A66来实现的.设置INIT_XPERCON为1并将XRAM设置为需要的值.7. 当声明一位作为外部变量时得到如下错误信息提示: *** ERROR C102 IN LINE 4 OF .\MAIN.C: 'mybit0': different const/volatile qualifiers在MIAN.H头文件中定义 extern bit mybit0; /* bit 0 of ibase */MAIN.C如下 #include "main.h"int bdata ibase; /* Bit-addressable int */sbit mybit0 = ibase ^ 0; /* bit 0 of ibase */void main (void){}错误出现的原因是sbit实际上并非一个位变量.解决的方法必须声明一个外部的位变量,与sfr不同时定义,最简单的方法是用#define,例如:在MAIN.H#ifndef SBITSextern bit mybit0; /* Bit 0 of ibase */#endif在MAIN.C#define SBITS#include "main.h"int bdata ibase; /* Bit-addressable int */sbit mybit0 = ibase^0;void main (void){mybit0 = 0;}在JUNK.C#include "main.h"void junk (void){mybit0 = 1;}8. Keil C166编译器时候支持浮点数运算?时候有库文件来声明浮点变量?C166编译器支持单精度和双精度浮点数,所有的操作与ANSI C中的浮点数运算相同.默认情况下C166编译器以IEEE形式存储32位浮点数,给出7位小数点精度.当需要高于7位精度时可以用C166的FLOAT64指令使能64位双精度.也可以通过Project>-Optioin for Target>-Double-precision floating-point来设置.。
Keil常见编译错误
Keil编译常见错误Part 1 Warningswarning: #167-D: argument of type "XXXX" is incompatible with parameter of type "YYYY"意义: 类型为XXXX的参数(实参)与类型为YYYY的参数(形参)不一致。
说明: 编译器在编译过程中会检查函数调用时的实参与形参数据类型的匹配情况。
当发现两者不一致时,给出警告。
warning: #177-D: variable "XXXX" was declared but never referenced. 意义: 定义的变量XXXX从未被使用过。
warning: #223-D: function "XXXX" declared implicitly意义: 函数XXXX采用了隐含式的声明。
说明: 函数XXXX在调用时没有定义或编译器没有看到该函数的声明,于是编译器将使用了缺省的数据类型作为该函数的定义。
常见问题:1.函数的定义出现在函数调用之后。
2.函数没有定义warning: #513-D: a value of type "XXXX" cannot be assigned to an entity of type "YYYY"意义: 类型为XXXX的值不能赋值给一个YYYY的实体。
说明: 按照C语言的规则,变量和数值都被赋予一定的数据类型。
在赋值操作时,变量的类型与其所赋的值的类型必须一致。
遇到这类问题时,要仔细观察和思考两者是否存在冲突。
常见问题:warning: #1295-D: Deprecated declaration XXXX - give arg types.意义: 弃用的声明XXXX, 请给出参数的数据类型。
说明: 按照最新C语言标准的要求,函数在声明时必须说明所有参数的类型,以及返回值的类型。
C51-keil编译常见错误和警告处理
keil错误C51编译器识别错类型有三种1、致命错误:伪指令控制行有错,访问不存在的原文件或头文件等。
2、语法及语义错误:语法和语义错误都发生在原文件中。
有这类错误时,给出提示但不产生目标文件,错误超过一定数量才终止编译。
3、警告:警告出现并不影响目标文件的产生,但执行时有可能发生问题。
程序员应斟酌处理。
D.1 致命错误C_51 FATAL_ERRORACTION: <当前行为>LINE: <错误所在行>ERROR: <错误信息> terminated或C_51 FA TAL ERRORACTION: <当前行为>FILE: <错误所在文件>ERROR: <错误信息> terminatedC_51 TERMINATED C_51(1) ACTION 的有关信息*PARSING INVOKE-/#PRAGMA_LINE在对#pragma 指明的控制行作此法分析时出错。
*ALLOCATING MEMORY系统分配存储空间时出错。
编译较大程序需要512k空间。
*OPENING INPUT_FILE打开文件时,未找到或打不开源文件/头文件。
*CREATE LIST_FILE/OBJECT_FILE/WORK_FILE不能创建上述文件。
可能磁盘满或文件已存在而且写保护。
*PARSING SOURCE_FILE/ANALYZING DECLARATIONS分析源程序时发现外部引用名太多。
*GENERATING INTERMEDIATE CODE源代码被翻译成内部伪代码,错误可能来源于函数太大而超过内部极限。
*WRITING TO FILE在向文件(work,list,prelist或object file)写时发生错误。
(2)ERROR的有关信息*MEMORY SPACE EXHAUSTED所有可用系统空间耗尽。
至少需要512k 字节空间。
Keil编译常见问题
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)的语法。
附录B KeilC51编译常见错误与警告
317附录B Keil C51 编译常见错误与警告在利用Keil C51进行单片机软件程序的编写、调试过程中,经常会出现这样的现象,因为疏忽大意或是对于程序编写规则的不熟悉等原因,工程编译不能正常通过,导致最终未能生成单片机用于下载烧片所需的.hex 文件。
以下列举出了一些在工程编译过程中,常见的警告或错误的提示信息,以及解决这些警告或错误的具体方法;给出了常见编译器错误信息的查找方法和Keil C51编译器常见错误与警告提示信息中英文对照表,供读者在工程调试和编译过程中参考。
一、常见错误与警告现象现象一:部分程序如下:{…ET0=1 ET1=1; … }错误编号:C141原因:程序LED.C 第49行语句前缺少分号。
解决方法:语句 ET0=1后加";"即:ET0=1; 现象二:部分程序如下:{ …ET0=1; ET1=1; … }错误编号:C100、C141原因:程序LED.C 里53行有中文标点符号“;”。
解决方法:将中文符号改变成英文符号“;” 现象三:318警告编号:L16原因:delay2( )函数未被其它函数调用,它会占用程序存放空间。
解决方法:(1)删除delay2( )函数;(2)检查程序,某调用该子函数;(3)利用注释“/* … */”将整个delay2()函数体包含,可保留该函数但不被编译。
现象四:警告/错误编号:C206,C267,C231原因:‘delay ’函数未定义,即未编写程序内容或函数已定义但未作声明。
解决方法:(1)将该子函数放在调用它的主调函数前;(2) 在调用它的主调函数前,对该函数进行声明。
现象五:警告编号:C318原因:在编译main.c 程序过程中由于main.c 使用了头文件包含#include “buzzer.h ”,但编译器却找不见buzzer.h 头文件。
解决方法:找到相应的buzzer.h 或编写buzzer.h 文件,并存入到c:\keil 的相关目录中。
keil文件太大编译失败
Keil文件太大编译失败1.引言在使用K ei l进行嵌入式系统的开发时,我们可能会遇到K eil文件太大而无法成功编译的问题。
本文将详细介绍这一问题的原因以及解决方法。
2.问题描述在使用K ei l进行编译时,我们可能会遇到如下错误提示:"程序存储器不足"或"编译失败,无法完成链接"。
这些错误提示表明我们的K ei l文件体积超过了编译器所能处理的限制。
3.问题原因K e il编译器有其自身的存储器限制,无法处理过大的文件。
主要的原因包括以下几点:3.1资源消耗较大的K ei l文件占用了较多的存储器资源,当存储器资源超过编译器的限制时,编译器将无法继续处理。
3.2优化设置编译器中的优化设置会影响生成的目标文件大小。
当我们开启了过多的优化选项时,生成的目标文件可能会超过编译器的存储器限制。
3.3代码冗余在编写程序时,我们可能会产生一些冗余的代码,例如未被使用的函数或库文件。
这些冗余代码会增加Ke il文件的体积,导致编译失败。
4.解决方法针对这个问题,我们可以采取以下方法来解决:4.1优化代码结构与算法通过重构代码结构和算法,我们可以尽量减小Ke il文件的体积。
合理地使用函数和变量,减少冗余代码量,有助于缩减文件大小。
4.2关闭无用优化选项在编译器设置中,关闭一些无关紧要的优化选项,有助于减小生成目标文件的大小。
合理地选择优化选项,既可以满足项目需求,又可以避免编译失败的问题。
4.3删除未使用的函数和库文件通过删除未使用的函数和库文件,可以进一步减小Ke il文件的体积。
在进行代码审查时,有针对性地删除未使用的代码,能够显著减小编译器的负担。
4.4调整编译器设置根据项目的需求,适当调整编译器的设置。
例如,调整编译器的存储器分配大小,以适应较大的K ei l文件。
5.总结本文介绍了K ei l文件太大编译失败的问题,并针对该问题提供了解决方法。
通过优化代码结构与算法、关闭无用优化选项、删除未使用的函数和库文件以及调整编译器设置,我们能够成功解决K ei l文件过大无法编译的问题。
KEIL常见问题解答
如果出现编译不成功,请按照下面修改尝试一下:
第一种:是设置问题
你可能会遇到这样的问题:
那么解决办法是:
第二种:是破解问题
正常破解完成,应该出现下面两条中的最下面那一条。
否则属于没有破解成功!
如果出现烧写不成功,请按照下面修改尝试一下:第一步:选择use:jlink(如图中2所示),然后点击2所示的按钮:
然后,确保你的设置如下图所示:
还有:
如果是windows8.1的电脑
更改办法:
1,将电脑的用户名改为英文。
2,更改环境变量(如下图所示)把TMP路径改下,改到某个可写的路径
当编译出现无下列文件时:
1,你需要安装相应的库文件:(试过没用,可以忽略此步骤)
然后重新打开编译。
2.从别的电脑上(WIN7)系统拷贝keil(keil5的安装目录)中的ARM/ARMCC 中的include文件夹,然后把这个放在你电脑里面的keil中的ARM/ARMCC 中。
重新编译
BY 启天科技团队。
keil编译常见报错和解决方法
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"错误这个错误表示编译器无法找到指定的头文件。
附录B-KeilC51编译常见错误和警告
附录B Keil C51 编译常见错误与警告在利用Keil C51进行单片机软件程序的编写、调试过程中,经常会出现这样的现象,因为疏忽大意或是对于程序编写规则的不熟悉等原因,工程编译不能正常通过,导致最终未能生成单片机用于下载烧片所需的.hex文件。
以下列举出了一些在工程编译过程中,常见的警告或错误的提示信息,以及解决这些警告或错误的具体方法;给出了常见编译器错误信息的查找方法和Keil C51编译器常见错误与警告提示信息中英文对照表,供读者在工程调试和编译过程中参考。
一、常见错误与警告现象现象一:部分程序如下:{…ET0=1ET1=1;…}错误编号:C141原因:程序LED.C第49行语句前缺少分号。
解决方法:语句 ET0=1后加";"即:ET0=1;现象二:部分程序如下:{…ET0=1;ET1=1;…}错误编号:C100、C141原因:程序LED.C里53行有中文标点符号“;”。
解决方法:将中文符号改变成英文符号“;”现象三:警告编号:L16原因:delay2( )函数未被其它函数调用,它会占用程序存放空间。
解决方法:(1)删除delay2( )函数;(2)检查程序,某调用该子函数;(3)利用注释“/* … */”将整个delay2()函数体包含,可保留该函数但不被编译。
现象四:警告/错误编号:C206,C267,C231原因:‘delay’函数未定义,即未编写程序内容或函数已定义但未作声明。
解决方法:(1)将该子函数放在调用它的主调函数前;(2) 在调用它的主调函数前,对该函数进行声明。
现象五:警告编号:C318原因:在编译main.c 程序过程中由于main.c 使用了头文件包含#include “buzzer.h”,但编译器却找不见buzzer.h头文件。
解决方法:找到相应的buzzer.h或编写buzzer.h文件,并存入到c:\keil的相关目录中。
现象六:错误编号:C237原因:‘delay’函数名称重复定义,即有两个重名的函数。
keilc编译常见错误
.error: #18:6.error: #18: expected a ")"如果是出现在c文件中, 多半是因为少了一个")",或者错误行有编译器不识别的字符如果出现在头文件中,错误行又是一个函数声明,多半是因为在函数声明中有编译器不认识的字符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: L6200EError: L6200E: Symbol temp multiply defined (by wenshidu.o and main.o).在编译的时候出现了这个问题,但是检查不出来,希望各位大侠帮帮忙什么变量你给付了两次值你看看是不是那个外部变量你又给赋值了main.c申明,其他.c文件对应的.h文件中用extern引用warning: #223-D..\..\source\CCxx00_New.C(718): warning: #223-D: function "_NOP_" declared implicitly在使用的文件中添加extern void _NOP_();既可warning: #1295-D..\..\include\CCxx00_New.h(20): warning: #1295-D: Deprecated declaration CC_XCal - give arg types没有用形参定时时用void CC_XCal(void);即可Error: L6218E: Undefined symbol.\Obj\output.axf: Error: L6218E: Undefined symbol FSMC_NORSRAMCmd (referred from tft_lcd.o)..\Obj\output.axf: Error: L6218E: Undefined symbol FSMC_NORSRAMInit (referred from tft_lcd.o).Target not created请教高人,我该如何处理。
Keil最常见编译错误和警告
今天在EINT的范例里添加了一个函数,即eint.c中添加了一个datawrite()的函数,并在主函数main.c中调用,编译便警告warning: #223-D: function "datawrite()" declared implicitly很奇怪,在eint.c中也有初始化函数EINTInit()同样在main.c中调用没有问题,问什么偏偏这个不行。
但毕竟是个警告,还不是错误,做了个测试IO,while(1){FIO1SET = 1<<19;delaySysTick(10);Data_write(0xff00, 0xff);FIO1CLR = 1<<19;delaySysTick(10);}下载执行后发现,此IO根本没有输出。
看来这个警告还是不能回避的,在网上差了下,有类似问题说是库的原因,具体是什么也没说清楚。
于是尝试着一一打开库文件,打开eint.h,恍然大悟,这里赫然写着extern void EINT0_IRQHandler(void) __irq;extern DWORD EINTInit( void );原来在这里将eint.c中的函数与main.c相关联,也就是在eint.c中添加了新函数,还有在这里声明调用才行。
eint.h中,添加extern void Data_write(WORD addr, BYTE data);即可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 谁能说说,哪里错了你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
keil编译出错问题
【09.08.15】Keil中C语言与汇编语言混合编程需要注意的几个地方在keil C语言与汇编语言的混合编程中曾经遇到过的一些问题,写下来留作以后参考。
(本文写于09.08.15,在8.18日加入了第4点的内容)1、C语言中加入汇编语言模块的方法:例子:void func(){C语言代码……#pragma asmMOV R6,#23DELAY2: MOV R7,#191DELAY1: DJNZ R7,DELAY1DJNZ R6,DELAY2RET#pragma endasmC语言代码……}其中红色为C语言部分,绿色为嵌入的汇编语言部分。
汇编部分需要用#pragma asm和#pragma endasm 包起来2、Keil提示“asm/endasm”出错的解决方法如果只是像1中那样直接加入汇编代码的话,编译将会报错,错误如下:compiling sendata.c...sendata.c(81): error C272: 'asm/endasm' requires src-control to be activesendata.c(87): error C272: 'asm/endasm' requires src-control to be activeTarget not created解决方法如下:首先右键单击包含有汇编部分的c语言文件名,然后在如上图所示的菜单中选择带有红色方框的选项在弹出的对话框中,将上图中红色方框选中的两项打上勾(默认的情况下,前面的勾是灰色的,要让这两项前的勾变为黑色的),点击确定。
3、?C_START等相关警告的处理按照2中的方法处理完之后,再编译不会出现错误信息了,但是会出现如下的警告信息:linking...*** WARNING L1: UNRESOLVED EXTERNAL SYMBOLSYMBOL: ?C_STARTMODULE: STARTUP.obj (?C_STARTUP)*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL: ?C_STARTMODULE: STARTUP.obj (?C_STARTUP)ADDRESS: 000DH处理方法如下:在如上图所示的“Source Group 1”上点右键,在菜单中选择“Add Files to Group 'Source Group 1' ”找到你的KEIL安装目录,选择其中的“C51”目录下的“LIB”目录下的“C51S.LIB”文件,点击Add,然后Close 即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Error: L6200EError: L6200E: Symbol temp multiply defined (by and .在编译的时候出现了这个问题,但是检查不出来,希望各位大侠帮帮忙什么变量你给付了两次值你看看是不是那个外部变量你又给赋值了申明,其他.c文件对应的.h文件中用extern引用error: #20error: #20: identifier "TIM2_IRQChannel" is undefined 谁能说说,哪里错了你的固件库里的库文件没有添加进工程里面,所以出现未定义的情况。
TIM2_IRQChannel指定时器2的中断通道没有定义,其实在固件库对这些参数都有定义,宏定义代替了一串寄存器地址数据。
需要将.C文件添加到工程文件中warning: #1-D(7): warning: #1-D: last line of file ends without a newline当使用keil编译时,弹出这样的警告信息:(7): warning: #1-D: last line of file ends without a newline这个是由于在main函数的“}”后,没有加回车。
只要在main函数的“}”后加回车键,此警告信息即可消除。
error:#65...(27):error:#65:expected a ";"分数送你了,问题在你回答之前已经解决了,头文件里的结构体定义里的最后一行没有加";" 如 NB menu{..};error: #1113:折腾了大半天,才搞明白一个空操作的指令先在网上查有的说是__asm{NOP;},从里调用,可犄角旮旯全找了,也没看到什么的文件。
如果直接用,就出现error: #1113: Inline assembler not permitted when generating Thumb cod e最后搜索这条错误,知道是因为__asm("指令");这种语法是内联汇编(inline assembly)的语法。
而RMDK下,内联汇编仅支持ARM汇编语言,不支持Thumb或者Thumb-2汇编语言;但内嵌汇编器支持Thumb和Thumb-2。
__asm放到一个单独的子函数再被调用就没问题了如下:__asm void nop(void){NOP}然后在之后的C代码中调用该函数:void main(){...nop();...}最新更新来自KEIL官网warning: #223-D..\..\source\(718): warning: #223-D: function "_NOP_" declared implicitly在使用的文件中添加extern void _NOP_();既可warning: #1295-D..\..\include\(20): warning: #1295-D: Deprecated declaration CC_XCal - give arg types没有用形参定时时用void CC_XCal(void);即可Error: L6218E: Undefined symbol.\Obj\: Error: L6218E: Undefined symbol FSMC_NORSRAMCmd (referred from ..\Obj\: Error: L6218E: Undefined symbol FSMC_NORSRAMInit (referred from . Target not created请教高人,我该如何处理。
你看看tft_lcd里面有没有添加之类的头文件,这个错误是说你使用的函数没有被定义。
一般只要添加相应的头文件即可v1.0 可编辑可修改error: #101:error: #101: has already been declared in the current scope将#ifndef __STM32F10x_LIB_H#define __STM32F10x_LIB_H#endif调整到最后!error: #247: function "DelayUs" has already been defined有一个同名的DelayUs类已经被定义过了error: #109: expression must have (pointer-to-) function type这个问题就是那19个error中的大部分,意思是表达式需要一个(指针)函数参数,我一开始以为是自己函数声明或者调用上的错误,但是看了下发现并没有错,后来查了好久发现原来是犯了一个很低级的错误:将宏定义和函数名重名了。
因为我一开始想的是每一个宏定义对应一个函数名,这样做起来就比较清晰,但是我却很傻逼地将函数名每次直接复制到宏名,导致了这种蛋碎的结果。
warning: #61-Dwarnin g: #68-D:在KeilARM的LPCARM,存在(1<<31)编译警告问题(174): warning: #61-D: integer operation result is out of range(174): warning: #68-D: integer conversion resulted in a change of sign由于编译器默认signed int即32位有符号整数类型,而1<<31实际为0x,这样就有可能改写了符号位(最高位)依此类推,(2<<30),(3<<29)...等都会出现编译警告问题.解决办法为: ((unsigned int)1<<31),((unsigned int)2<<30),...warning: #1295-D:warning: #1295-D: Deprecated declaration ShowSendTime - give arg types解决方法:将void ShowSendTime()改为void ShowSendTime(void)warning: #550-D:warning: #550-D: variable "d" was set but never used描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.error: #159:.error: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)void a(void) .}这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.解决方法:在函数a调用函数b之前,对函数b进行声明,如:void b(void); .}error: #70:error: #70: incomplete type is not allowed原来是重复定义了,包含了两次的psock的定义,所以才会出现这种情况。
因为我发现psock 和pt是一样定义的,但是pt是不报错的,所以我就试图删除头文件中include头文件的那一行,错误消除了,谢谢你了,还是实践出真知啊,有些时候不能死编,要思考,哈哈。
keil MDK编译器警告和错误详解(不定期更新)工作后从单片机转成ARM,刚开始用编译器,用了一段时间,因为我接手的项目的老程序正是用ADS编译的,部门也大都在用.在学单片机的时候用的是keil c51编译器,ads和这个编译器在易用性上真是无法比较.后来渐渐知道keil已经被arm公司收购,现在keil MDK成为了arm官方编译器,所以决定重新投奔keil,利用平时的时间,将原程序重新用mdk编译.mdk的优点就没必要说了,在这里把平时遇到的编译器给出的警告和错误信息给出详解,希望给初学者一点帮助,发现错误,需要补充的欢迎留言.warning: #550-D:: #550-D: variable "d" was set but never used描述:变量'd'定义但从未使用,或者是,虽然这个变量你使用了,但编译器认为变量d所在的语句没有意义,编译器把它优化了.解决:仔细衡量所定义的变量d是否有用,若是认定变量d所在语句有意义,那么尝试用volatile关键字修饰变量d,若是真的没有用,那么删除掉以释放可能的内存.warning: #1-D:: #1-D: last line of file ends without a newline描述:文件最后一行不是新的一行.编译器要求程序文件的最后一行必须是空行,想了半天没想通为什么要这样.解决:可以不理会.若是觉得出现警告不爽,那么在出现警告的文件的最后一行敲个回车,空出一行.warning: #111-D:3. warning: #111-D: statement is unreachable描述:声明不可能到达.多出现在这种场合:int main(void){...while(1) .}return 0;warning: C3017W:4. warning: C3017W: data may be used before being set描述:变量'data'在使用前没有明确的赋值.如:uint8 i,data; 个警告应引起足够重视.应养成变量赋初值的习惯,好在有编译器给把关. warning: #177-D: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 referencedwarning: #940-D:6. warning: #940-D: missing return statement at end of non-void function "DealwithInspect2" 描述:返回非空的函数"DealwithInspect2"的最后缺少返回值声明.如:int DealwithInspect2(uint32 test){.........arning: #1295-D:7..warning: #1295-D: Deprecated declaration lcd_init - give arg types描述:在定义函数的时候,如果你写上函数参数,就会有这个警告,比如void timer_init(); 这里就没有形参,如果这样的话,编译器会给出警告.error: #65:1. error: #65: expected a ";"描述:缺少分号.大多是漏忘';'.解决:双击错误行,在定位到错误点的附近找到没加';'号的语句,加上分号.并不一定在定位到的错误行才却分号,可能是这行的上一行,也可能是下一行.error: #65: error: #202. error: #65: expected a ";"和 error: #20: identifier "xxxx" is undefined一块出现,而且后面的error: #20错误可能一大堆描述:这个错误对于第一次遇上的人来说绝对是个噩梦,当错误出现,满怀希望的双击错误提示,来到错误行时却愕然发现,错误行绝对没有错,于是找找错误行的上一行,下一行,没有错误,再找上上行,下下行...让人无比郁闷的事情出现了:编译提示的所有错误行都不可能有错误出现.其实这最可能是你在.h文件声明外部变量或者函数时,没有在声明语句的最后加分号!如果你有很多模块,如,,...有很多头文件,如,,若是在文件声明函数时没有加分号,那么这种错误可能定为到中,所以要检查所有头文件.解决:仔细检查.h文件,将分号补上.Error: L6200E:3. Error: L6200E: Symbol flagu multiply defined (by and .描述:变量(也是一种符号)flagu多处定义(在中和都定义了).通常错在全局变量定义重复.比如:在中定义全局变量flagu:uint8 flagu=0;在中也用到该变量,于是声明此变量,我通常都是先复制定义的变量再在变量前面加关键字extern修饰:extern uint8 flagu=0;然后编译,就会出现上面的连接错误,原因在于,我在中是又定义了一个变量,而不是声明变量,因为我给变量赋了初值"flagu=0",这样就重复定义了变量flag.正确的声明方法是去掉赋值部分:extern uint8 flagu;解决办法:找到重复定义的变量,看情况修改一处.error: #159:: #159: declaration is incompatible with previous "wr_lcd" (declared at line 40)描述:在wr_lcd函数还没有声明之前就已经使用了.多出现在两种情况:第一种,wr_lcd函数体还没有写,就已经用到了它,这种情况多出现在写一个程序的大体结构中,只是简单写一下框架.第二种情况比较常见,函数a调用函数b,但函数b的函数体在函数a的下面:void a(void) .}这样如果点编译,就会产生error: #159的错误,因为当函数a调用函数b时,发现在这之前都没有函数b的任何声明.解决方法:在函数a调用函数b之前,对函数b进行声明,如:void b(void); .}error: #137:5. error: #137: expression must be a modifiable lvalue描述:表达式必须是一个可以修改的左值.主要出现在这种现象:a=NUM;NUM是一个数值或表达式,a为一个变量,但a被定义为像const这种不可更改的类型,导致NUM不能赋值给变量a.解决方法:要么放弃赋值,要么修改变量属性..error: #18:: #18: expected a ")"如果是出现在c文件中, 多半是因为少了一个")",或者错误行有编译器不识别的字符如果出现在头文件中,错误行又是一个函数声明,多半是因为在函数声明中有编译器不认识的字符。