keil预处理命令及方法
- 格式:ppt
- 大小:123.00 KB
- 文档页数:25
Keil条件编译是指在Keil C编译器中使用预处理指令来控制代码编译的一种方式。
条件编译允许您根据特定的条件来包含或排除代码块,以便在不同的编译环境中生成不同的代码。
在Keil C编译器中,条件编译主要使用预处理指令来实现。
这些预处理指令可以在编译之前对代码进行条件判断,并根据条件的结果决定是否包含或排除特定的代码块。
以下是一些常用的Keil条件编译预处理指令:#if、#elif、#else、#endif:这些指令用于根据条件判断来包含或排除代码块。
例如,您可以使用#if指令来检查某个宏定义是否存在,然后根据结果包含不同的代码。
c#if defined(MY_MACRO)// 如果MY_MACRO已定义,则编译此代码块// ...#else// 如果MY_MACRO未定义,则编译此代码块// ...#endif#ifdef、#ifndef:这些指令用于检查某个宏定义是否存在或不存在。
它们与#if和#else配合使用,以便在宏定义存在或不存在时包含不同的代码。
c#ifdef MY_MACRO// 如果MY_MACRO已定义,则编译此代码块// ...#endif#ifndef MY_MACRO// 如果MY_MACRO未定义,则编译此代码块// ...#endif#define、#undef:这些指令用于定义和取消定义宏。
通过使用这些指令,您可以在代码中创建自己的宏,并在条件编译中使用它们。
c#define MY_MACRO 1// ...#undef MY_MACRO#if defined(MACRO1) && defined(MACRO2):这些指令用于检查多个宏定义是否存在,并根据条件的结果包含不同的代码。
请注意,条件编译的具体语法和规则可能会因编译器和目标环境而有所不同。
Cx51编译器对传统和扩展的8051微处理器的优化的C 编译器和库参考用户手册09.2001Keil Software – Cx51编译器用户手册—ፉᑗኔፉᑗኔ由于本人的英语水平有限所以在使用KEIL C51的过程中老要去看那英文的手册总感到不是那么方便老要用词霸查来查去的烦的很因此在看到C51BBS上的倡议后就动了把它翻译出来的念头我想这对自己和别人都会带来些好处利用工作之余的时间经过几个月的努力终于把它翻译完了但由于水平所限文中肯定有很多不是十分恰当的地方或许没有用大家比较熟悉的惯用语或许可能引起误解所以在这里我请大家能指出其中的错误和不当之处请大家EMAIL告诉我使我能够作出改正对于大家的建议我会很高兴的接受我最大的愿望是希望我的翻译不会误导大家且能对大家有所帮助不明之处可以参考英文原文感谢C51BBS版主龙啸九天的帮助欢迎大家与我交流我的e-mail**************Keil Software声明本文档所述信息不属于我公司的承诺范围其内容的变化也不会另行通知本文档所述软件的出售必须经过授权或签订特别协议本文档所述软件的使用必须遵循协议约定在协议约定以外的任何媒体上复制本软件将触犯法律购买者可以备份为目的而做一份拷贝在未经书面许可之前本手册的任何一部分都不允许为了购买者个人使用以外的目的而以任何形式和任何手段(电子的机械的)进行复制或传播版权1988-2001所有者Keil Elektronik GmbH和Keil Software公司Keil C51™Keil CX51™,和uVision TM是Keil Elektronik GmbH的商标Microsoft®和Windows™是Microsoft Corporation的商标或注册商标IBM®PC®和PS/2®是International Business Machines Corporation的注册商标Intel®MCS®51MCS®251ASM-51®和PL/M-51®是Intel的注册商标我们尽全力去做来保证这本手册的正确从而保证我们个人公司和在此提及的商标的形象前言本手册讲述对8051的目标环境如何使用C x51优化C编译器编译C程序C x51编译器包可以用在所有的8051系列处理器上可以在WINDOWS 32位命令行中执行本手册假定你熟悉WINDOWS操作系统知道如何编程8051处理器并会用C语言编程注意本手册用条件窗口来指明32位WINDOWS版本是WINDOWS95WINDOWS98WINDOWS ME WINDOWS NT WINDOWS 2000或WINDWOS XP如果你对C编程有问题或者你想知道C语言编程的更多信息可参考16页的关于C 语言的书手册中讨论的许多例子和描述是从WINDOWS命令提示符下调用的这对在一个集成环境如µVision2中运行C x51的情况是不适用的本手册中的例子是通用的可以应用到所有编程环境手册组织本用户手册分成下面的章节和附录第一章介绍概述C x51编译器第二章用C x51编译解释怎样用C x51交叉编译器编译一个源文件本章叙述控制文件处理编译和输出的命令行提示第三章语言扩展叙述支持8051系统结构必须的C语言扩展本章提供一个在ANSI C说明中没有的命令函数和控制的详细列表第四章预处理器叙述C x51编译器预处理器的组成和包含的例子第五章派生的8051叙述C x51编译器支持的8051派生系列本章还包括能帮助提高目标程序性能的技巧第六章高级编程技术对有经验的开发人员的重要信息本章包括定制文件描述优化器详细资料和段名约定本章还讨论了C x51编译器产生的程序和别的8051编程语言如何接口第七章错误信息列出了在使用C x51编译器时可能遇到的致命错误语法错误和警告第八章库参考提高一个扩展的C x51库参考分类列出了库例程和相关的包含文件本章最后有一个按字母顺序的参考包括每个库例程的例子代码附录中包含不同编译器版本间的差异作品编号和别的有些信息文档约定本文档有下列约定README .TXT 粗体大写用在可执行程序名数据文件名源文件名环境变量和输入WINDOWS 命令行的命令上表示你必须手工输入的文本不一定要大写例CLS DIR BL51.EXELanguage Elements C 语言的构成包括关键词操作符和库函数用粗体例if != longisdigit main >>Courier 这种字体的文本代表显示在屏幕上或打印出的信息这字体也用在讨论或描述命令行中Variables 斜体字必须提供的信息例如在语法字符串中的projectfile 表示需要提供实际的工程文件名重复的成分…例子中使用的省略号…表示重复的成分省略代码 . . .垂直省略号用在源代码例子中表示省略一段程序例子void main(void ) {...while(1);[可选项]命令行中的可选参数和选择项用方括号表示例C51 TEST.C PRINT [(filename )]{opt1|opt2}大括号中的文本用竖线分隔代表一组选项必须从中选一项大括号中包含了所有选项竖线分隔选项KeysSans serif 字体的文本代表键盘的键例如按Enter 继续ContentsChapter 1. Introduction (15)Support for all 8051 Variants (15)Books About the C Language (16)Chapter 2. Compiling with the C x51 Compiler (17)Environment Variables (17)Running C x51 from the Command Prompt (18)ERRORLEVEL (19)C x51 Output Files (19)Control Directives (20)Directive Categories (20)Reference (23)AREGS / NOAREGS (24)ASM / ENDASM (26)BROWSE (28)CODE (29)COMPACT (30)COND / NOCOND (31)DEBUG (33)DEFINE (34)DISABLE (35)EJECT (37)FLOATFUZZY (38)INCDIR (39)INTERVAL (40)INTPROMOTE / NOINTPROMOTE (41)INTVECTOR / NOINTVECTOR (44)LARGE (46)LISTINCLUDE (47)MAXARGS (48)MOD517 / NOMOD517 (49)MODA2 / NOMODA2 (51)MODAB2 / NOMODAB2 (52)MODDA2 / NOMODDA2 (53)MODDP2 / NOMODDP2 (54)MODP2 / NOMODP2 (55)NOAMAKE (56)NOEXTEND (57)OBJECT / NOOBJECT (58)OBJECTADVANCE (59)OBJECTEXTEND (60)ONEREGBANK (61)OMF2 (62)OPTIMIZE (63)ORDER (65)PAGELENGTH (66)PAGEWIDTH (67)PREPRINT (68)PRINT / NOPRINT (69)REGFILE (70)REGISTERBANK (71)REGPARMS / NOREGPARMS (72)RET_PSTK, RET_XSTK (74)ROM (76)SAVE / RESTORE (77)SMALL (78)SRC (79)STRING (80)SYMBOLS (81)USERCLASS (82)VARBANKING (84)WARNINGLEVEL (85)XCROM (86)Chapter 3. Language Extensions (89)Keywords (89)Memory Areas (90)Program Memory (90)Internal Data Memory (91)External Data Memory (92)Far Memory (93)Special Function Register Memory (93)Memory Models (94)Small Model (94)Compact Model (95)Large Model (95)Memory Types (95)Explicitly Declared Memory Types (96)Implicit Memory Types (97)Data Types (97)Bit Types (98)Bit-addressable Objects (99)Special Function Registers (101)sfr (101)sfr16 (102)sbit (102)Absolute Variable Location (104)Pointers (106)Generic Pointers (106)Memory-specific Pointers (109)Pointer Conversions (111)Abstract Pointers (114)Function Declarations (118)Function Parameters and the Stack (119)Passing Parameters in Registers (120)Function Return Values (120)Specifying the Memory Model for a Function (121)Specifying the Register Bank for a Function (122)Register Bank Access (124)Interrupt Functions (125)Reentrant Functions (129)Alien Function (PL/M-51 Interface) (132)Real-time Function Tasks (133)Chapter 4. Preprocessor (135)Directives (135)Stringize Operator (136)Token-pasting operator (137)Predefined Macro Constants (138)Chapter 5. 8051 Derivatives (139)Analog Devices MicroConverter B2 Series (140)Atmel 89x8252 and Variants (141)Dallas 80C320, 420, 520, and 530 (142)Dallas 80C390, 80C400, 5240, and Variants (143)Arithmetic Accelerator (144)Infineon C517, C509, 80C537, and Variants (145)Data Pointers (145)High-speed Arithmetic (146)Library Routines (146)Philips 8xC750, 8xC751, and 8xC752 (147)Philips 80C51MX Architecture (148)Philips and Atmel WM Dual DPTR (148)Chapter 6. Advanced Programming Techniques (149)Customization Files (150)STARTUP.A51 (151)INIT.A51 (153)XBANKING.A51 (154)Basic I/O Functions (156)Memory Allocation Functions (156)Optimizer (157)General Optimizations (157)8051-Specific Optimizations (158)Options for Code Generation (158)Segment Naming Conventions (159)Data Objects (160)Program Objects (161)Interfacing C Programs to Assembler (163)Function Parameters (163)Parameter Passing in Registers (164)Parameter Passing in Fixed Memory Locations (165)Function Return Values (165)Using the SRC Directive (166)Register Usage (168)Overlaying Segments (168)Example Routines (168)Small Model Example (169)Compact Model Example (171)Large Model Example (173)Interfacing C Programs to PL/M-51 (175)Data Storage Formats (176)Bit Variables (176)Signed and Unsigned Characters, Pointers to data, idata, and pdata (177)Signed and Unsigned Integers, Enumerations, Pointers to xdata andcode (177)Signed and Unsigned Long Integers (177)Generic and Far Pointers (178)Floating-point Numbers (179)Floating-point Errors (182)Accessing Absolute Memory Locations (184)Absolute Memory Access Macros (184)Linker Location Controls (185)The _at_ Keyword (186)Debugging (187)Chapter 7. Error Messages (189)Fatal Errors (189)Actions (190)Errors (191)Syntax and Semantic Errors (193)Warnings (205)Chapter 8. Library Reference (209)Intrinsic Routines (209)Library Files (210)Standard Types (211)jmp_buf (211)va_list (211)Absolute Memory Access Macros (212)CBYTE (212)CWORD (212)DBYTE (213)DWORD (213)FARRAY, FCARRAY (214)FVAR, FCVAR, (215)PBYTE (216)PWORD (216)XBYTE (217)XWORD (217)Routines by Category (218)Buffer Manipulation (218)Character Conversion and Classification (219)Data Conversion (220)Math Routines (221)Memory Allocation Routines (223)Stream Input and Output Routines (224)String Manipulation Routines (226)Variable-length Argument List Routines (227)Miscellaneous Routines (227)Include Files (228)8051 Special Function Register Include Files (228)80C517.H (228)ABSACC.H (229)ASSERT.H (229)CTYPE.H (229)INTRINS.H (229)MATH.H (230)SETJMP.H (230)STDARG.H (230)STDDEF.H (230)STDIO.H (231)STDLIB.H (231)STRING.H (231)Reference (232)abs (233)acos / acos517 (234)asin / asin517 (235)assert (236)atan / atan517 (237)atan2 (238)atof / atof517 (239)atoi (240)atol (241)cabs (242)calloc (243)ceil (244)_chkfloat_ (245)cos / cos517 (246)cosh (247)_crol_ (248)_cror_ (249)exp / exp517 (250)fabs (251)floor (252)fmod (253)free (254)getchar (255)_getkey (256)gets (257)init_mempool (258)_irol_ (259)_iror_ (260)isalnum (261)isalpha (262)iscntrl (263)isdigit (264)isgraph (265)islower (266)isprint (267)ispunct (268)isspace (269)isupper (270)isxdigit (271)labs (272)log / log517 (273)log10 / log10517 (274)longjmp (275)_lrol_ (277)_lror_ (278)malloc (279)memccpy (280)memchr (281)memcmp (282)memcpy (283)memmove (284)memset (285)modf (286)_nop_ (287)offsetof (288)pow (289)printf / printf517 (290)putchar (296)puts (297)rand (298)realloc (299)scanf (300)setjmp (304)sin / sin517 (305)sinh (306)sprintf / sprintf517 (307)sqrt / sqrt517 (309)srand (310)sscanf / sscanf517 (311)strcat (313)strchr (314)strcmp (315)strcpy (316)strcspn (317)strlen (318)strncat (319)strncmp (320)strncpy (321)strpbrk (322)strpos (323)strrchr (324)strrpbrk (325)strrpos (326)strspn (327)strstr (328)strtod / strtod517 (329)strtol (331)strtoul (333)tan / tan517 (335)tanh (336)_testbit_ (337)toascii (338)toint (339)tolower (340)_tolower (341)toupper (342)_toupper (343)ungetchar (344)va_arg (345)va_end (347)va_start (348)vprintf (349)vsprintf (351)Appendix A. Differences from ANSI C (353)Compiler-related Differences (353)Library-related Differences (353)Appendix B. Version Differences (357)Version 6.0 Differences (357)Version 5 Differences (358)Version 4 Differences (359)Version 3.4 Differences (361)Version 3.2 Differences (362)Version 3.0 Differences (363)Version 2 Differences (364)Appendix C. Writing Optimum Code (367)Memory Model (367)Variable Location (369)Variable Size (369)Unsigned Types (370)Local Variables (370)Other Sources (370)Appendix D. Compiler Limits (371)Appendix E. Byte Ordering (373)Appendix F. Hints, Tips, and Techniques (375)Recursive Code Reference Error (375)Problems Using the printf Routines (376)Uncalled Functions (377)Using Monitor-51 (377)Trouble with the bdata Memory Type (378)Function Pointers (379)Glossary (383)Index (391)ጙᐺC语言是一个通用的编程语言它提供高效的代码结构化的编程和丰富的操作符C不是一种大语言不是为任何特殊应用领域而设计它一般来说限制较少可以为各种软件任务提供方便和有效的编程许多应用用C比其他语言编程更方便和有效优化的C x51 C编译器完整的实现了ANSI的C语言标准对8051来说C x51不是一个通用的C编译器它首先的目标是生成针对8051的最快和最紧凑的代码C x51具有C编程的弹性和高效的代码和汇编语言的速度C语言不能执行的操作如输入和输出需要操作系统的支持这些操作作为标准库的一部分提供因为这些函数和语言本身无关所以C特别适合对多平台提供代码既然C x51是一个交叉编译器C语言的某些方面和标准库就有了改变或增强以适应一个嵌套的目标处理器的特性更多的细节参考89页的第三章.语言扩展支持所有的8051变种8051系列是增长最快的微处理器构架之一从不同的芯片厂家提供了400多种芯片新扩展的8051芯片如PHILIPS 8051MX有几M字节的代码和数据空间可被用到大的应用中为了支持这些不同的8051芯片KEIL提供了几种开发工具如下表所列一个新的输出文件格式OMF2允许支持最多16MB代码和数据空间CX51编译器适用于新的PHILIPS 8051MX结构C51编译器A51宏汇编BL51连接器对传统的8051开发工具包括支持32 x64KB 的代码库C51编译器有OMF2输出AX51宏汇编LX51连接器对传统的8051和扩展的8051芯片如DALLAS 390的开发工具包括支持代码库和最多16MB代码和XDATA存储区CX51编译器AX51宏汇编LX51连接器对PHILIPS 8051MX的开发工具支持最多16MB 代码和XDATA存储区C x 51编译器在不同的包中提供上表是完整的8051开发工具参考注意Cx51指两种编译器C51编译器和CX51编译器C 语言的书有许多书介绍C 语言有更多的书详细介绍用C 完成的任务下面的列表不是一个完整的列表列表只是作为参考The C Programming Language, Second Edition Kernighan & RitchiePrentice-Hall, Inc.ISBN 0-13-110370-9C: A Reference Manual, Second EditionHarbison & SteelPrentice-Hall Software SeriesISBN 0-13-109810-1C and the 8051: Programming and MultitaskingSchultzP T R Prentice-Hall, Inc.ISBN 0-13-753815-4औᐺCx51ܠፉܠፉ本章说明怎样编译C源文件讨论编译器的控制命令这些命令可以命令C x51编译器产生列表文件控制包含在OBJ文件中的信息的数量指定优化级别和存储模式注意一般来说你应在µVision2 IDE中使用Cx51关于使用µVision2IDE的更多信息参考用户手册Getting Started with µVision2 and C51”.环境变量如果在µVision2IDE中运行Cx51编译器计算机不需要另外的设置如果想要在命令行中运行C x51编译器和工具必须手工创建下面的环境变量PATH\C51\BIN C51和CX51可执行程序的路径TMP编译器产生的临时文件的路径如果指定的路径不存在编译器会生成错误并停止编译C51INC\C51\INC Cx51头文件的路径C51LIB\C51\LIB Cx51库文件的路径对WINSOWS NT WINDOWS 2000和WINDOWS XP这些环境变量在Control Panel –System – Advanced – Environment Variables中输入对WINDOWS 95WINDOWS 98和WINDOWS ME这些设置放在AUTOEXEC.BAT中PATH=C\KEIL\C51\BIN;%PATH%SET TMP=D:\SET C51INC=C:\KEIL\C51\INCSET C51LIB=C:\KEIL\C51\LIB从命令行运行Cx51调用C51或CX51编译器在命令行输入C51或CX51在命令行中必须包含要编译的C源文件和必需的编译控制命令C x51命令行的格式C51 sourcefile [directives…]CX51 sourcefile [directives…]或C51 @commandfileCX51 @commandfile这里sourcefile要编译的源文件名directives用来控制编译器功能的命令参考20页的控制命令commandfile包含源文件名和命令的命令输入文件当C x51调用行较复杂超过了WINDOWS命令行的限制时使用commandfile下面的命令行例子调用C51指定源文件SAMPLE.C用控制DEBUG CODE和PREPRINTC51 SAMPLE.C DEBUG CODE PREPRINTC x51编译器在成功编译后显示下面的信息C51 COMPILER V6.10C51 COMPILATION COMPLETE. 0 WARNING S0 ERROR S错误级别在编译后错误和警告的数目输出在屏幕上C x51编译器设置ERRORLEVEL指示编译的状态值如下表所列0没有错误或警告1只有警告2错误和可能的警告3致命错误可以在批处理文件中访问ERRORLEVEL变量关于ERRORLEVEL或批处理文件可以参考WINDOWS命令索引或在线帮助Cx51输出文件C x51编译器在编译时产生许多输出文件缺省的输出文件和源文件同名但文件的扩展名不同下面的表列出了文件并有简短的说明Filename.LST列表文件包含格式化的源文件和编译中检测到的错误列表文件可以选择包含所用的符号和生成汇编代码更多的信息参考PRINT命令Filename.OBJ包含可重定位目标代码的OBJ模块OBJ模块用Lx51连接器连接到一个绝对的OBJ模块Filename.I包含由预处理器扩展的源文件所有的宏都扩展了所有的注释都删除了可参考PREPRINT命令Filename.SRC C源代码产生的汇编源文件可以用A51汇编可参考SRC命令控制命令C x51编译器提供许多控制命令控制编译除了指定的命令由一个或多个字母或数字组成在命令行中在文件名后指定或在源文件中用#pragma命令例如C51 testfile.c SYMBOLS CODE DEBUG#pragma SYMBOLS CODE DEBUG在说明的例子中SYMBOLS CODE和DEBUG都是控制命令testfile.C是要编译的源文件注意对命令行和#pragma语法是相同的在#pragma可指定多个选项典型的每个控制命令只在源文件的开头指定一次如果一个命令指定多次编译器产生一个致命错误退出编译可以指定多次的命令在下面部分注明命令种类控制命令可以分成三类源文件控制目标控制和列表控制源文件控制定义命令行的宏定义要编译的文件名目标控制影响产生的目标模块*.OBJ的形式和内容这些命令指定优化级别或在OBJ文件中包含调试信息列表控制管理列表文件*.LST的各种样式特别是格式和指定的内容上下表按字母顺序列出了控制命令有下划线的字母表示命令的缩写AREGS NOAREGS Object 使能或不使能绝对寄存器ARn地址ASM ENDASM Source 标志内嵌汇编块的开始和结束BROWSE †Object 产生浏览器信息CODE †Listing 加一个汇编列表到列表文件COMPACT †Object 设置COMPACT 存储模式COND NOCOND †Listing 包含或执行预处理器跳过的源程序行DEBUG †Object 在OBJ 文件中包含调试信息DEFINE Source 在Cx51调用行定义预处理器名DISABLE Object 在一个函数内不允许中断EJECTListing 在列表文件中插入一个格式输入字符FLOATFUZZY Object 在浮点比较中指定位数INCDIR †Source 指定头文件的附加路径名INTERVAL †Object 对SIECO 芯片指定中断矢量间隔INTPROMOTE NOINTPROMOTE†Object 使能或不使能ANSI 整数同时提升INTVECTOR NOINTVECTOR †Object 指定中断矢量的基地址或不使能矢量LARGE †Object 选择LARGE 存储模式LISTINCLUDE Listing 在列表文件中显示头文件MAXAREGS †Object 指定可变参数列表的大小MOD517NOMOD517Object 使能或不使能代码支持80C517和派生的额外的硬件特征MODA2NOMODA2Object 使能或不使能ATMEL 82x8252和变种的双DPTR 寄存器MODAB2NOMODAB2Object 使能或不使能模拟设备ADuC B2系列支持双DPTR 寄存器MODDA NOMODDA Object 使能或不使能DALLAS 80C39080C400和5240支持算法加速器MODDP2NOMODDP2Object 使能或不使能DALLAS 的320520530550和变种支持双DPTR 寄存器MODP2NOMODP2Object 使能或不使能PHILIPS 和ATMELWM 派生的支持双DPTR 寄存器NOAMAKE †Object 不记录µVision2更新信息NOEXTEND †Source Cx51不扩展到ANSI COBJECT NOOBJECT †Object 指定一个OBJ 文件或禁止OBJ 文件OBJECTEXTEND†Object 在OBJ 文件中包含变量类型信息ONEREGBANKObject假定在中断中只用寄存器组0OMF2†Object 产生OMF2输出文件格式OPTIMIZE Object 指定编译器的优化级别ORDER †Object 按源文件中变量的出现顺序分配PAGELENGTH †Listing 指定页的行数PAGEWIDTH †Listing 指定页的列数PREPRINT †Listing 产生一个预处理器列表文件扩展所有宏PRINTNOPRINT †Listing 指定一个列表文件名或不使能列表文件REGFILE †Object 对全局寄存器优化指定一个寄存器定义文件REGISTERBANK Object 为绝对寄存器访问选择寄存器组REGPARMS NOREGPARMS Object 使能或不使能寄存器参数传递RET_PSTK † RET_XSTK †Object 用重入堆栈保存返回地址ROM †Object AJMP/ACALL 指令产生控制SAVERESTORE Object 保存和恢复AREGS REGPARMS 和OPTIMIZE 命令设置SMALL†Object 选择SMALL 存储模式缺省SRC †Object 产生一个汇编源文件不产生OBJ 模块STRING †Object 定位固定字符串到XDATA 或远端存储区SYMBOLS †Listing 模块中所有符号的列表文件USERCLASS †Object 对可变的变量位置重命名存储区类VARBANKING †Object 使能FAR 存储类型变量WARNINGLEVEL†Listing 选择警告检测级别XCROM †Object对CONST XDATA 变量假定ROM 空间† 这些命令在命令行或源文件开头的#pragma中只指定一次在一个源文件中不能使用多次控制命令和参数除了用DEFINE 命令的参数是大小写无关的参考本章的余下部分按字母顺序描述C x51编译器控制命令他们分成如下部分缩写可以替代命令的缩写参数命令可选和要求的参数缺省命令的缺省设置µVision2控制怎样指定命令说明详细的说明命令和使用参考相关命令例子命令使用的例子有时也列出结果AREGS/NOAREGS缩写无参数无缺省AREGSµVision2控制Options – C51 – Don‘t use absolute register access说明AREGS控制使编译器对寄存器R0到R7用绝对寄存器地址绝对地址提高了代码的效率例如PUSH和POP指令只能用直接或绝对地址用AREGS命令可以直接PUSH或POP寄存器可用REGISTERBANK命令定义使用的寄存器组NOAREGS命令对寄存器R0到R7不使能绝对寄存器地址用NOAREGS编译的函数可以使用所有的8051寄存器组命令可用在被别的函数用不同的寄存器组调用的函数中注意虽然可能在一个程序中定义了几次AREGS/NOAREGS选项只有定义在函数声明为有效例子下面是一个使用NOAREGS 和AREGS 的源程序和代码的列表注意保存R7到堆栈中的不同方法函数noaregfunc 产生的代码是MOV A R7PUSHACC同时对aregfunc 函数的代码是PUSHAR7stmt levelsource1extern char func ();2char k;34#pragma NOAREGS 5noaregfunc (){61k =func ()+func ();71}89#pragma AREGS 10aregfunc (){111k =func ()+func ();121};FUNCTION noaregfunc (BEGIN);SOURCE LINE #60000120000E LCALL func 0003EF MOV A,R70004C0E0PUSH ACC 0006120000E LCALL func 0009D0E0POP ACC 000B 2F ADD A,R7000C F500R MOV k,A;SOURCE LINE #7000E22RET;FUNCTION noaregfunc (END);FUNCTION aregfunc (BEGIN);SOURCE LINE #110000120000E LCALL func 0003C007PUSH AR70005120000E LCALL func 0008D0E0POP ACC 000A 2F ADD A,R7000B F500R MOV k,A;SOURCE LINE #12000D22RET;FUNCTION aregfunc (END)ASM/ENDASM缩写无参数无缺省无µVision2控制本命令不能在命令行指定说明ASM命令标志一块源程序的开始它可以直接合并到由SRC命令产生的.SRC文件中这些源程序可以认为是内嵌的汇编然而它只输出到由SRC命令产生的源文件中源程序不汇编和输出到OBJ文件中在µVision2应对C源文件中包含ASM/ENDASM段如下设置一个文件指定选项右键点击PROJECT窗口 – 文件表中的文件选择Options for…打开选项 – 属性页使能Generate Assembler SRC file使能Assemble SRC file用这些设置µVision2产生一个汇编源文件.SRC并用汇编编译产生一个OBJ文件.OBJENDASM命令标志一个源程序块的结束注意ASM和ENDASM命令只能在源文件中使用且作为#pragma命令的一部分例子#pragma asm / #pragma endasm 下面是C 源文件产生下面的.SRC 文件...stmt levelsource1extern void test ();23main (){41test ();5161#pragma asm 71JMP $;endless loop 81#pragma endasm 91}..;ASM.SRC generated from:ASM.C NAME ASM PRmainASM SEGMENT CODE EXTRN CODE (test)EXTRN CODE (?C_STARTUP)PUBLIC main;extern void test ();;;main (){RSEG ?PR?main?ASM USING 0main:;SOURCE LINE #3;test ();;SOURCE LINE #4LCALL test;;#pragma asmJMP $;endless loop;#pragma endasm ;};SOURCE LINE #9RET ;END OF mainENDBROWSE缩写BR参数无缺省不创建浏览信息µVision2控制Options – Output – Browse Information说明用BROWSE编译器产生浏览信息浏览信息包括标识符包含预处理器符号他们的存储空间类型定义和参考列表信息可以在µVision2内显示选择View – Source Browser打开µVision2源浏览器参考µVision2用户手册第四章µVision2功能源浏览器例子C51 SAMPLE.C BROWSE#pragma browseCODE缩写CD参数无缺省不产生汇编代码列表µVision2控制Options – Listing – C Compiler Listing – Assembly Code说明CODE命令附加一个汇编助记符列表到列表文件汇编程序代码代表源程序中的每个函数缺省的在列表文件中没有汇编代码例子C51 SAMPLE.C CD#pragma code下面例子显示C源程序和它产生的OBJ结果代码和助记符在汇编间显示了产生代码的行号字符R和E代表可重定位和外部的stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61c=14+15*((b/c)+252);71}...ASSEMBLY LISTING OF GENERATED OBJECT CODE;FUNCTION main(BEGIN);SOURCE LINE#5;SOURCE LINE#60000E500E MOV A,b00028500F0R MOV B,c000584DIV AB000675F00F MOV B,#0FH0009A4MUL AB000A24D2ADD A,#0D2H000C F500R MOV c,A;SOURCE LINE#7000E22RET;FUNCTION main(END)COMPACT缩写CP参数无缺省SMALLµVision2控制Options – Target – Memory Model说明本命令选择COMPACT存储模式在COMPACT存储模式中所有的函数和程序变量和局部数据段定位在8051系统的外部数据存储区外部数据存储区可有最多256字节一页在本模式中外部数据存储区的短地址用@R0/R1不管什么存储类型可以在任何8051的存储范围内声明变量但是把常用的变量如循环计数器和数组索引放在内部数据存储区可以显著的提高系统性能注意函数调用所用的堆栈经常放在IDATA存储区参考SAMLL LARGE ROM例子C51 SAMPLE.C COMPACT#pragma compactCOND/NOCOND缩写CO参数无缺省CONDµVision2控制Options – Listing – C Compiler Listing - Conditional说明本命令定义这些部分的受条件编译影响的源程序是否显示在列表文件中COND命令在列表文件中包含编译省略的行行号和嵌套级不输出以便于阅读本命令影响预处理器删除的行NOCOND命令不在列表文件中包含编译省略的行例子下面的例子显示用COND命令编译产生的一个列表文件...stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61#if defined(VAX)c=13;#elif defined(__TIME__)91b=14;101a=15;111#endif121}..下面的例子用NOCOND命令编译产生的一个列表文件...stmt level source1extern unsigned char a,b;2unsigned char c;34main()5{61#if defined(VAX)91b=14;101a=15;111#endif121}...缩写DB参数无缺省不产生调试信息µVision2控制Options – Output – Debug Information说明DEBUG命令指示编译器在OBJ文件中包含调试信息缺省OBJ 文件不包含调试信息对程序的符号测试必需有调试信息信息包括全局和局部变量定义和地址和函数名和行号包含在目标模块中的调试信息在连接过程中仍有效这些信息可以被µVision2调试器或任何INTEL兼容的模拟器使用注意OBJECTEXTEND命令用来指示编译器在目标文件中包含附加的变量类型定义信息参考OBJECTEXTEND例子C51 SAMPLE.C DEBUG#pragma db缩写DF参数一个或多个符合C语言约定的的名称用逗号分隔对每个名称可有一个参数用DEFINE给出缺省无µVision2控制在Options –C x51 – Define输入名称说明DEFINE命令定义调用行的名称预处理器要用#if#ifdef和#ifndef查询这些名称定义的名称在输入后被复制这些命令是大小写相关的作为一个选项每个名称可跟一个值注意DEFINE命令只能在命令行中指定在一个C源程序中用C预处理器命令#define例子C51 SAMPLE.C DEFINE check,NoExtRamC51 MYPROG.C DF (X1=“1+5”,iofunc=“getkey()”)DISABLE缩写无参数无缺省无µVision2控制本命令不能在命令行中指定只能在源文件中指定说明DISABLE命令指示编译器在产生代码时在一个函数内不使能所有中断DISABLE必须在一个函数声明前一行用#pragma命令指定DISABLE控制只用到一个函数对每个新的函数必须重新指定注意DISABLE只能用#pragma命令指定不能在命令行指定DISABLE可在一个源文件中指定多次对每个函数只能指定一次执行后不使能中断一个不使能中断的函数不能对调用者返回一个位值例子本例子是一个用DISABLE命令函数的源程序和代码列表注意EA指定函数寄存器在函数进入时清除JBC EA C002在结尾时恢复MOV EA C...stmt level source1typedef unsigned char uchar;23#pragma disable/*Disable Interrupts*/4uchar dfunc(uchar p1,uchar p2){51return(p1*p2+p2*p1);61};FUNCTION_dfunc(BEGIN)0000D3SETB C000110AF01JBC EA,?C00020004C3CLR C0005?C0002:0005C0D0PUSH PSW;----Variable'p1'assigned to register'R7'----;----Variable'p2'assigned to register'R5'----;SOURCE LINE#4;SOURCE LINE#50007ED MOV A,R500088FF0MOV B,R7000A A4MUL AB000B25E0ADD A,ACC000D FF MOV R7,A;SOURCE LINE#6000E?C0001:000E D0D0POP PSW001092AF MOV EA,C001222RET;FUNCTION_dfunc(END)...EJECT缩写EJ参数无缺省无µVision2控制本命令不能在命令行中指定只能在源文件中指定说明EJECT命令在列表文件中插入一个格式输入字符注意EJECT只在源文件中出现必须是#pragma命令的一部分例子#pragma ejectFLOATFUZZY缩写FF参数0到7间的一个数字缺省FLOATFUZZY3µVision2控制Options - C x51 – Bits to round for float compare说明FLOATFUZZY命令在一个浮点比较前定义位数缺省值3指定最少有三个有效位例子C51 MYFILE.C FLOATFUZZY2#pragma FF(0)INCDIR缩写无参数指定头文件的路径缺省无µVision2控制Options - C x51 – Include Paths说明INCDIR命令指定Cx51编译器头文件的位置编译器最多50个路径声明如果需要多个路径路径名必须用分号分开如果指定#include“filename.h”Cx51编译器首先搜索当前目录然后是源文件目录当找不到或用了#include <filename.h>就搜索INCDIR指定的路径当仍找不到就使用C51INC环境变量指定的路径例子C51 SAMPLE.C INDIR C\KEIL\C51\MYINC;C:\CHIP-DIRINTERVAL缩写无参数对中断矢量表可选用括号括住缺省INTERV AL8µVision2控制Options - C x51 – Misc controls:enter the directive说明INTERV AL命令指定中断矢量的间隔指定间隔是SIECO-51派生系列要求的它定义中断矢量在3字节间隔用本命令编译器定位中断矢量在绝对地址如下计算(interval×n)+offset+3,这里interval INTERV AL命令的参数缺省为8n中断号offset INTVECTOR命令的参数缺省为0参考INTVECTOR/NOINTVECTOR例子C51 SAMPLE.C INTERV AL3#pragma interval(3)INTPROMOTE/NOINTPROMOTE缩写IP/NOIP参数无缺省INTPROMOTEµVision2控制Options - C x51 – Enable ANSI integer promotion rules说明INTPROMOTE命令使能ANSI整数提升规则如果提升声明了在比较前所用的表达式从小类型提升到整数表达式这使MICROSOFT C和BORLAND C改动很少就可用到Cx51上因为8051是8位处理器使用INTPROMOTE命令可能在某些应用中降低效率NOINTPROMOTE命令不使能自动整数提升整数提升使Cx51和别的ANSI编译器间有更大的兼容性然而整数提升可能降低效率例子C51 SAMPLE.C INTPROMOTE#pragma intpormoteC51 SAMPLE.C NOINTPROMOTE下面的代码示范用INTPROMOTE和NOINTPROMOTE命令产生的代码stmt lvl source1char c;2unsigned char c1,c2;3int i;45main(){61if(c==0xff)c=0;/*never true!*/71if(c==-1)c=1;/*works*/81i=c+5;91if(c1<c2+4)c1=0;101};FUNCTION main(BEGIN);SOURCE LINE#60000AF00MOV R7,c0002EF MOV A,R7000333RLC A000495E0SUBB A,ACC0006FE MOV R6,A0007EF MOV A,R70008F4CPL A00094E ORL A,R6000A7002JNZ?C0001000C F500MOV c,A000E?C0001:;SOURCE LINE#7000E E500MOV A,c0010B4FF03CJNE A,#0FFH,?C0002 0013750001MOV c,#01H0016?C0002:;SOURCE LINE#80016AF00MOV R7,c0018EF MOV A,R7001933RLC A001A95E0SUBB A,ACC001C FE MOV R6,A001D EF MOV A,R7001E2405ADD A,#05H0020F500MOV i+01H,A0022E4CLR A00233E ADDC A,R60024F500MOV i,A;SOURCE LINE#90026E500MOV A,c200282404ADD A,#04H002A FF MOV R7,A002B E4CLR A002C33RLC A002D FE MOV R6,A002E C3CLR C002F E500MOV A,c100319F SUBB A,R70032EE MOV A,R600336480XRL A,#080H0035F8MOV R0,A00367480MOV A,#080H003898SUBB A,R000395003JNC?C0004003B E4CLR A003C F500MOV c1,A;SOURCE LINE#10003E?C0004:003E22RET;FUNCTION main(END);FUNCTION main(BEGIN);SOURCE LINE#60000AF00MOV R7,c0002EF MOV A,R7000333RLC A000495E0SUBB A,ACC0006FE MOV R6,A0007EF MOV A,R70008F4CPL A00094E ORL A,R6000A7002JNZ?C0001000C F500MOV c,A000E?C0001:;SOURCE LINE#7000E E500MOV A,c0010B4FF03CJNE A,#0FFH,?C0002 0013750001MOV c,#01H0016;SOURCE LINE#80016E500MOV A,c00182405ADD A,#05H001A FF MOV R7,A001B33RLC A001C95E0SUBB A,ACC001E F500MOV i,A00208F00MOV i+01H,R7;SOURCE LINE#90022E500MOV A,c200242404ADD A,#04H0026FF MOV R7,A0027E500MOV A,c10029C3CLR C002A9F SUBB A,R7002B5003JNC?C0004002D E4CLR A002E F500MOV c1,A;SOURCE LINE#100030?C0004:003022RET;FUNCTION main(END)CODE SIZE = 63 Bytes CODE SIZE = 49 BytesINTVECTOR/NOINTVECTOR缩写IV/NOIV参数对中断矢量表一个可选的偏移在括号中缺省INTVECTOR0µVision2控制Options - C x51 – Misc controls:enter the directive说明INTVECTOR命令指示编译器对要求的函数产生中断矢量如果矢量表不从0开始需输入一个偏移用本命令编译器产生一个中断矢量入口根据ROM命令指定的程序存储区用AJMP或LJMP指令跳转NOINTVECTOR命令禁止产生中断矢量表这也许用户用别的编程工具提供中断矢量编译器通常用一个3字节跳转指令LJMP产生一个中断矢量矢量用绝对地址表示(interval × n) + offset + 3,这里n中断号interval INTERV AL命令的参数缺省为8offset INTVECTOR命令的参数缺省为0参考INTERV AL。
KEIL C编译器常见警告与错误信息的解决办法1. Warning 280:‟i‟:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:‟Music3‟:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\MANN.CError:318:can‟t open file …beep.h‟说明在编译C:\8051\MANN.C 程序过程中由于main.c 用了指令#include “beep.h”,但却找不到所致解决方法编写一个beep.h 的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\LED.CError 237:‟LedOn‟:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***W ARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***W ARNING 6 :XDA TA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 W ARNING 206:‟DelayX1ms‟: missing function-prototypeC:\8051\INPUT.CE rror 267 :‟DelayX1ms …:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h的包含档宣告成外部以便其它函数调用8 ***W ARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DA TASEGMENT: _DA TA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义--------------------------------------------------------------------------------------------------keil c编译器错误与解决方法2008-05-27 20:191. Warning 280:‟i‟:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:‟Music3‟:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :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 的工作目录中4 Compling:C:\8051\LED.CError 237:‟LedOn‟:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***W ARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?_DELAYX1MS?DELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***W ARNING 6 :XDA TA SPACE MEMORY OVERLAPFROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 W ARNING 206:‟DelayX1ms‟: missing function-prototypeC:\8051\INPUT.CError 267 :‟DelayX1ms …:requires ANSI-style prototype C:\8051\INPUT.C说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在delay.h 的包含档宣告成外部以便其它函数调用8 ***W ARNING 1:UNRESOLVED EXTERNAL SYMBOLSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\MUSIC.OBJ(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DA TASEGMENT: _DA TA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNALSYMBOL: VOLUMEMODULE: C:\8051\OSDM.OBJ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义说明如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享10.***W ARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1CALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?_SPI_SEND_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
keil μvision 5编译顺序Keil μVision 5 是一款应用广泛的嵌入式开发工具,特别适合于嵌入式系统的开发。
在使用Keil μVision 5 进行编程时,编译顺序是非常重要的。
编译顺序的正确性将直接影响开发的效率和结果。
本文将介绍Keil μVision 5 的编译顺序。
第一步:预处理在Keil μVision 5 中,预处理是编译过程中的第一步。
预处理的作用是去除代码中的注释和空格,并将 #include 等预处理指令所包含的头文件内容转换为代码。
这个步骤的输出结果是一个 .i 文件。
第二步:编译编译是将预处理生成的 .i 文件转换为 .asm 文件格式的代码。
在这个过程中,代码中的语法错误也将被检测出来。
这个步骤的输出结果是一个 .obj 文件。
第三步:汇编汇编是将编译生成的 .obj 文件生成可以在特定平台上运行的机器码的过程。
在这个过程中,Keil μVision 5 将根据特定的处理器类型和所选择的编译选项来选择适当的指令。
这个步骤的输出结果是一个 .o 文件。
第四步:链接链接是将多个 .o 文件组合成一个可执行文件的过程。
在这个过程中,Keil μVision 5 将解析符号并将其绑定到它们所引用的地址上。
这个步骤的输出结果是可执行文件。
总结以上便是Keil μVision 5 编译顺序的详细介绍。
正确的编译顺序对开发的效率和结果有着重要的影响。
希望通过本文的介绍可以让初学者更好地了解Keil μVision 5 的编译顺序和工作原理,为之后的项目开发打下更好的基础。
Keil C51使用详解第一章Keil C51开发系统基本知识 (6)第一节系统概述 (6)第二节Keil C51单片机软件开发系统的整体结构 (6)第三节Keil C51工具包的安装 (7)1. C51 for Dos 72. C51 for Windows的安装及注意事项: (7)第四节Keil C51工具包各部分功能及使用简介 (7)1. C51与A51. 72. L51和BL51. 83. DScope51,Tscope51及Monitor51. 84. Ishell及uVision. 9第二章Keil C51软件使用详解 (10)第一节Keil C51编译器的控制指令 (10)1. 源文件控制类 (10)2. 目标文件(Object)控制类: (10)3. 列表文件(listing)控制类: (10)第二节dScope51的使用 (11)1. dScope51 for Dos 112. dScope for Windows 12第三节Monitor51及其使用 (13)1. Monitor51对硬件的要求 (13)2. Mon51的使用 (13)3. MON51的配置 (13)4. 串口连接图: (13)5. MON51命令及使用 (14)第四节集成开发环境(IDE)的使用 (14)1. Ishell for Dos的使用 (14)2. uVision for windows的使用 (15)第三章Keil C51 vs 标准C.. 15第一节Keil C51扩展关键字 (15)第二节内存区域(Memory Areas): (16)1. Pragram Area: (16)2. Internal Data Memory: 163. External Data Memory. 164. Speciac Function Register Memory. 16第三节存储模式 (16)1. Small模式 (16)2. Compact模式 (17)3. large模式 (17)第四节存储类型声明 (17)第五节变量或数据类型 (17)第六节位变量与声明 (17)1. bit型变量 (17)2. 可位寻址区说明20H-2FH.. 18第七节Keil C51指针 (18)1. 一般指针 (18)2. 存储器指针 (18)3. 指针转换 (18)第八节Keil C51函数 (19)1. 中断函数声明: (19)2. 通用存储工作区 (19)3. 选通用存储工作区由using x声明,见上例。
keilC语⾔指令char 字符型
int 整型
long 长整型
short 短整型
float 浮点型
doublle 双精度浮点型
signed 有符号
unsigned ⽆符号
void 声明函数
register 声明寄存器
static 声明静态变量
struct 声明结构体
volatile 说明变量在程序执⾏中可被隐含的改变
const 只读变量
enum 声明枚举类型
auto 声明⾃动变量
extern 声明变量或函数是在其它⽂件或本⽂件的其他位置定义
union 声明共⽤体
if 条件语句
else 条件否定语句
for ⼀种循环语句
do 循环体
while 循环条件
switch 开关语句
case 开关分⽀
default 开关语句中的其他分⽀,不进⼊case,默认
break 跳出当前整个循环
continue 跳出本次循环,开始下⼀轮新循环
return 函数返回语句
typedef ⽤以给数据类型取别名
sfr 定义特殊功能寄存器
bit 定义位变量
sbit 定义特殊功能寄存器的某⼀位
code 定义代码区的范围
interrupt 指定中断向量⼊⼝
using 指定内部功能寄存器组
#include 调⽤头⽂件
#define 宏定义。
keil教程Keil是一款嵌入式开发环境,广泛应用于各种微控制器和单片机的软件开发中。
本教程将介绍Keil的基本使用方法,包括项目创建、代码编辑、编译和调试等。
项目创建:1. 打开Keil软件,点击“File”菜单,选择“New Project”创建一个新项目。
2. 在弹出的对话框中,选择目标设备型号,并为项目命名,然后点击“Save”按钮。
3. 选择项目存储路径,并点击“OK”按钮。
4. 在弹出的对话框中,选择需要包含的源文件和头文件,然后点击“Add”按钮。
5. 点击“Options”菜单,可以对项目进行各种配置,如选择编译器、优化选项等。
代码编辑:1. 在Keil的工作区中,双击打开需要编辑的源文件。
2. 在源文件中输入和编辑代码。
可以使用Keil提供的代码自动补全、语法提示等功能来提高编码效率。
3. 保存代码文件,可以使用快捷键“Ctrl+S”或点击工具栏上的“Save”按钮。
编译:1. 点击“Project”菜单,选择“Build Target”进行项目编译。
也可以直接点击工具栏上的“Build”按钮。
2. Keil会自动检查代码错误和警告,并生成目标文件和可执行文件。
调试:1. 连接目标设备到计算机上。
2. 点击“Debug”菜单,选择“Start/Stop Debug Session”进入调试模式。
3. 在调试模式下,可以设置断点、监视变量、单步执行等操作来调试程序。
4. 调试完成后,点击“Debug”菜单,选择“Stop Debug Session”停止调试。
本教程介绍了Keil的基本使用方法,包括项目创建、代码编辑、编译和调试等。
通过学习和掌握这些基本操作,您可以更好地利用Keil进行嵌入式软件开发。
KeilC51使用详解 (一)(2009-04-21 14:10:43)标签:keil单片机it分类:资源查询第一章 Keil C51开发系统基本知识第一节系统概述Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
下面详细介绍Ke il C51开发系统各部分功能和使用。
第二节 Keil C51单片机软件开发系统的整体结构C51工具包的整体结构,如图(1)所示,其中uVision与Ishell分别是C51 for Windows和for Dos的集成开发环境(IDE),可以完成编辑、编译、连接、调试、仿真等整个开发流程。
开发人员可用IDE本身或其它编辑器编辑C或汇编源文件。
然后分别由C51及A51编译器编译生成目标文件(.OBJ)。
目标文件可由LI B51创建生成库文件,也可以与库文件一起经L51连接定位生成绝对目标文件(.ABS)。
ABS文件由OH51转换成标准的Hex文件,以供调试器dScope51或tScope51使用进行源代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直接写入程序存贮器如EPROM中。
第三节 Keil C51工具包的安装1. C51 for Dos在Windows下直接运行软件包中DOS/C51DOS.exe然后选择安装目录即可。
完毕后欲使系统正常工作须进行以下操作(设C:/C51为安装目录):修改Autoexec.bat,加入path=C:/C51/BinSet C51LIB=C:/C51/LIBSe t C51INC=C:/C51/INC然后运行Autoexec.bat2. C51 for Windows的安装及注意事项:在Windows下运行软件包中WIN/Setup.exe,最好选择安装目录与C51 for Dos相同,这样设置最简单(设安装于C:/C51目录下)。
C51-keil编译常见错误和警告处理53keil错误;C51编译器识别错类型有三种:1、致命错误:伪指令控制行有错,访问不存在的原文;2、语法及语义错误:语法和语义错误都发生在原文件;3、警告:警告出现并不影响目标文件的产生,但执行;C_51FATAL_ERRORACTION:&l;ERROR:<错误信息>termin;FILE:<错误所在文件>;ERROR:<错误信息>keil错误C51编译器识别错类型有三种1、致命错误:伪指令控制行有错,访问不存在的原文件或头文件等。
2、语法及语义错误:语法和语义错误都发生在原文件中。
有这类错误时,给出提示但不产生目标文件,错误超过一定数量才终止编译。
3、警告:警告出现并不影响目标文件的产生,但执行时有可能发生问题。
程序员应斟酌处理。
D.1 致命错误C_51 FATAL_ERROR ACTION: <当前行为> LINE: <错误所在行>ERROR: <错误信息> terminated 或C_51 FATAL ERROR ACTION: <当前行为>FILE: <错误所在文件>ERROR: <错误信息> terminated C_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分析源程序时发现外部引用名太多。
keil中define的用法在Keil中,`#define`是一种预处理指令,它可以用来定义常量或简单的宏。
通过使用`#define`,我们可以在代码中使用符号来代替特定的数值或字符串,这有助于提高代码的可读性和维护性。
定义常量是`#define`指令的一种常见用法。
例如,我们可以使用以下方式定义一个常量:```#define MAX_VALUE 100```在上述代码中,我们定义了一个名为`MAX_VALUE`的常量,并将其值设置为100。
在代码的其他地方,我们可以使用`MAX_VALUE`来代替具体的数值100。
这样,如果我们希望修改最大值,只需更改一处定义即可,而不需要逐处搜索和替换。
另一个常见的用法是使用`#define`定义简单的宏。
宏是一种将代码片段替换为预定义的文本的方法。
例如,我们可以使用以下方式定义一个简单的宏:```#define SQUARE(x) ((x) * (x))```在上述代码中,我们定义了一个名为`SQUARE`的宏,它接受一个参数`x`并返回`x`的平方。
在后续的代码中,我们可以使用`SQUARE`宏来计算任意数字的平方,例如:```int result = SQUARE(5); // 等同于 int result = (5) * (5);```宏在编译时被直接替换,因此可以有效地减少代码量,并提高代码的可读性。
需要注意的是,使用`#define`定义常量或宏是在预处理阶段进行的,它们不会占用额外的内存空间。
因此,在使用`#define`时,需要确保定义的常量或宏的命名没有与其他变量或函数重复,以避免冲突和错误。
总结来说,在Keil中,`#define`的用法主要包括定义常量和定义简单的宏。
它们在提高代码可读性和维护性方面具有重要作用,并且不占用额外内存空间。
合理使用`#define`可以使代码更加清晰、简洁和易于调试。
keil initialization 语法Keil是由ARM公司开发的一款集成开发环境(IDE),用于编写和调试嵌入式系统的软件。
它提供了一个友好的用户界面以及广泛的功能集,包括编译和调试工具、文本编辑器和自动化构建工具等。
在使用Keil进行嵌入式系统开发时,初学者常常会遇到一些问题,特别是在项目的初始化过程中。
本文将详细介绍Keil初始化的语法,并提供一些示例代码和步骤,以帮助读者更好地理解和使用Keil。
在Keil中初始化一个项目,通常需要完成以下几个步骤,包括创建项目、添加源文件、配置编译选项和设置代码入口等。
下面将逐步介绍每个步骤的语法和用法。
1.创建项目在Keil中创建项目非常简单,只需按照下面的语法使用菜单或快捷键即可:File -> New -> Project然后选择适合的设备系列和型号,并设定项目名称和保存路径。
2.添加源文件在Keil中,源文件通常以.c或.cpp格式存在,因此我们需要向项目中添加这些源文件。
可以使用以下语法进行操作:Project -> Add Files to Project在弹出的对话框中,选择需要添加的源文件,并点击"Add"按钮。
3.配置编译选项编译选项用于控制编译器的行为,包括生成的目标文件类型、编译器优化选项、预处理器定义和编译器指令等。
通过以下语法可以打开编译选项窗口:Project -> Options for Target -> C/C++ -> C/C++在这个窗口中,可以根据需要设置各项编译选项。
4.设置代码入口在Keil中,代码入口指的是程序运行的起始点。
根据不同设备和编译器设置,这个入口可以是一个标准的C函数,也可以是一个特定于设备的指令。
以下是进入Startup.s文件的语法示例:Project -> Options for Target -> Target -> Target1 -> Device在这个窗口中,选择正确的设备系列和型号,并选择正确的Startup文件。
keil汇编程序指令介绍### Keil Assembly Language Instructions.MOV.The MOV instruction moves data between two locations. The syntax for the MOV instruction is:MOV destination, source.where:`destination` is the location to which the data is moved.`source` is the location from which the data is moved.ADD.The ADD instruction adds two numbers. The syntax forthe ADD instruction is:ADD destination, source.where:`destination` is the location to which the result is stored.`source` is the location of the number to be added.SUB.The SUB instruction subtracts two numbers. The syntax for the SUB instruction is:SUB destination, source.where:`destination` is the location to which the result is stored.`source` is the location of the number to be subtracted.MUL.The MUL instruction multiplies two numbers. The syntax for the MUL instruction is:MUL destination, source.where:`destination` is the location to which the result is stored.`source` is the location of the number to be multiplied.DIV.The DIV instruction divides two numbers. The syntax forthe DIV instruction is:DIV destination, source.where:`destination` is the location to which the result is stored.`source` is the location of the number to be divided.AND.The AND instruction performs a bitwise AND operation on two numbers. The syntax for the AND instruction is:AND destination, source.where:`destination` is the location to which the result is stored.`source` is the location of the number to be ANDed.OR.The OR instruction performs a bitwise OR operation on two numbers. The syntax for the OR instruction is:OR destination, source.where:`destination` is the location to which the result is stored.`source` is the location of the number to be ORed.XOR.The XOR instruction performs a bitwise XOR operation on two numbers. The syntax for the XOR instruction is:XOR destination, source.where:`destination` is the location to which the result is stored.`source` is the location of the number to be XORed.NOT.The NOT instruction performs a bitwise NOT operation on a number. The syntax for the NOT instruction is:NOT destination.where:`destination` is the location to which the result is stored.CMP.The CMP instruction compares two numbers. The syntax for the CMP instruction is:CMP destination, source.where:`destination` is the location of the first number.`source` is the location of the second number.LDR.The LDR instruction loads a value from memory into a register. The syntax for the LDR instruction is:LDR destination, [source]where:`destination` is the register to load the value into.`source` is the memory location to load the value from.STR.The STR instruction stores a value from a register into memory. The syntax for the STR instruction is:STR destination, [source]where:`destination` is the register to store the value from.`source` is the memory location to store the value into.B.The B instruction branches to a specified address. The syntax for the B instruction is:B label.where:`label` is the address to branch to.BL.The BL instruction branches to a specified address and links the return address. The syntax for the BL instruction is:BL label.where:`label` is the address to branch to.BX.The BX instruction branches to a specified register. The syntax for the BX instruction is:BX register.where:`register` is the register to branch to.中文回答:### Keil汇编指令介绍。
KEIL软件错误代码及错误信息一、运行错误信息运行错误分为四类:1-99为DOS错误;100-149为I/O错误,发生I/O后,如果使用了编译开关{$I+},程序将终止执行,否则编译开关为{$I-},程序继续执行,并由IOResult函数返回错误信息;150-199为严重错误,200-255为致命错误,致命错误将立即终止程序执行。
错误代码及错误信息错误释义error 1:Invalid function number 无效函数号error 2:File not found 文件未找到error 3:Path not found 找不到路径error 4:Too many open files 打开文件太多error 5:File access denied 文件不允许访问error 6:Invalid file handle 无效文件句柄error 12:Invalid file access code 无效文件存取代码error 15:Invalid drive number 无效驱动器号error 16:Cannot remove current directory 不能删除当前目录error 17:Cannot rename across drives 不能跨驱动器改名error 18:No more files 没有文件了error 100:Disk read error 读磁盘错error 101:Disk write error 写磁盘错error 102:File not assigned 文件变量未赋值error 103:File not open 文件未打开error 104:File not open for input 文件未打开为写方式error 105:File not open for output 文件未打开为读方式error 106:Invalid numeric format 无效数值格式error 150:Disk is write-protected 磁盘写保护error 151:Bad drive request struct length 错误的驱动器请求结构长度error 152:Drive not ready 驱动器未准备好error 154:CRC error in data 数据CRC校验错error 156:Disk seek error 磁盘定位错error 157:Unknown media type 未知的介质类型error 158:Sector Not Found 找不到扇区error 159:Printer out of paper 打印机缺纸error 160:Device write fault 设备写错误error 161:Device read fault 设备读错误error 162:Hardware failure 硬件故障error 200:Division by zero 被零除error 201:Range check error 范围检查出错error 202:Stack overflow error 栈溢出error 203:Heap overflow error 堆溢出error 204:Invalid pointer operation 无效的指针操作error 205:Floating point overflow 浮点运算上溢error 206:Floating point underflow 浮点运算下溢error 207:Invalid floating point operation 无效的浮点运算error 208:Overlay manager not installed 未安装覆盖管理程序error 209:Overlay file read error 读覆盖文件错误error 210:Object not initialized 对象未初始化error 211:Call to abstract method 调用抽象方法error 212:Stream registration error 流注_册错误error 213:Collection index out of range 集合下标越界error 214:Collection overflow error 集合上溢error 215:Arithmetic overflow error 算术运算上溢error 216:General Protection fault 一般保护性错误keil c编译器错误与解决方法1. Warning 280:’i’:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:’Music3’:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\\8051\\Error:318:can’t open file ‘’说明在编译C:\\8051\\ 程序过程中由于用了指令#i nclude “”,但却找不到所致解决方法编写一个的包含档并存入到c:\\8051 的工作目录中4 Compling:C:\\8051\\Error 237:’LedOn’:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERL AY PROCESSSEGMENT: PR_DELAYX1MSDELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP FROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:’DelayX1ms’:missing function-proto typeC:\\8051\\Error 267 :’DelayX1ms‘:requires ANSI-style prot otype C:\\8051\\说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在的包含档宣告成外部以便其它函数调用8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOL SYMBOL:MUSIC3MODULE:C:\\8051\\(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\\8051\\(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNA LSYMBOL: VOLUMEMODULE: C:\\8051\\ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义10.***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: PR_WRITE_GMVLX1_REGD_GMVLX1CALLER1: PRVSYNC_INTERRUPTMAINCALLER2: C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: PR_SPI_SEND_WORDD_SPICALLER1: PRVSYNC_INTERRUPTMAINCALLER2: C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: PRSPI_RECEIVE_WORDD_SPICALLER1: PRVSYNC_INTERRUPTMAINCALLER2: C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
Keil uv2软件操作指南1 点击Project(工程)菜单,选择New Project(新工程),在"文件名"中输入您的第一个程序项目名称,假定我们用"test"."保存"后的文件扩展名为uv2这是KEIL uVision2项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目.这时会弹出让你选择单片机型号的对话框,我们选择ATMEL---AT89C51。
注意我们实际使用的是89s51, 他们的资源基本是一致的,不必理会。
2汇编源文件的建立: 点击FILE(文件)菜单中的NEW...(新文件)命令新建一个文本编辑窗口,在里面输入一个程序范例如流水灯程序, 然后点击FILE(文件)菜单中的SAVE(保存)命令保存文件,注意必须输入文件的后缀名.asm,例如保存为d:/prog/001.asm(注意不要有中文目录,文件名不超过8个字符, 否则编译不通过!如果您是第一次使用,建议直接保存在c盘的根目录,文件名同样取001.ASM, 不要试图把他保存在桌面/我的文档等等!)3.点击Target 1(目标1)前面的”+”,出现Source Group 1,(源程序组1)选中右键点选”Add files Group Source Group 1”(增加文件到源程序组1)这时选择文件类型为Asm,再选中001.asm文件,再按Add添加,在随后的提示框中按”确定”4.仿真部分采用Mon51协议,在使用之前应必须对软件项目进行如下设置:单击"Project"(工程)菜单,再在下拉菜单中单击"options for target target 1"(目标1属性)在下图中,单击"Target"(目标)输入仿真器的工作频率(12MHz)。
5.选择output(输出)”Create HEX file”(产生hex文件)的选项,以便汇编后生成HEX代码,供编程器使用.6.在"Debug"(调试)中点选"KeilMonitor-51 Driver",同时选中加载代码到仿真器,运行到main0,然后点击设置7单击"Settings"(设置)选择要使用串口(必须和实际相符合,你的计算机可能是COM2或者其他,对此不能确定可以通过察看控制面板\硬件\端口\通讯端口来解决,同时注意电脑上不能够同时运行其他可能占用串口资源的软件例如XLISP下载软件,串口调试软件等等也必须退出,否则将引起冲突,如果您使用的是USB通信方式,那么选择系统分配的虚拟串口号)8.按以下两个向下小箭头的图标进行编译,(或者按F7快捷)编译成功后如会出现下图红箭头所指的文字,表示编译成功!此时就生成了hex文件,同时,有了这个hex文件,我们也可用isp方式烧写到单片机试验)。
序言用C语言来编写单片机程序,时下已是一种趋势。
C语言编写出来的程序其可读性、维护性、可移植性相对于汇编,其优势大很多。
C编译器有很多,单片机内核不同,其编译器也有很大的差别,但总的来说,C编程器基本上都有是从C语言的基础上增加一些针对单片机的特殊功能。
以下是本人使用过的C编译器,在编写单片机程序时的需主要了解的内容。
其内容的概述主要以下几方面:1、包含文件方式2、数据类型3、变量的声明(RAM的操作)4、常量的声明(ROM操作)5、函数的声明6、在线汇编及特殊ASM指令操作7、I/O端口操作方式8、中断操作方式9、堆栈的方式10、编译后的相关文件11、编写单片机C项目后的经验总结(单片机部分、C语言部分)附录A:入门篇——建第一个项目(包含相关主要设置)第一篇KEIL C51编译器1、包含文件方式1.1头文件(1)“xx.h”文件中可以提供给外部的变量与函数。
(2)“cstartup.a51”启动代码是指在执行main()函数之前清0内存单元,每次编译都会自动地加入在项目组中的第一个位置。
(3)在进行程序设计的时候,一般包含<xxxx.h>或<reg52.h>等,如是增加型51,则需用sfr来声明所增加的特殊功能寄存器。
例如:include <reg52.h> sfr ISP_CONTR =0XC7。
sbit CF =CCON^7,// CCON BIT,针对可位寻址的CCON寄存器。
1.2预处理(1)预处理命令必须放在一行的开头,而且必须以“#”为前缀。
#include “x.h”是指从当前目录中查找H文件。
而#include <x.h>是指从包含文件目录中查找H文件。
通常包含文件不带路径,文件为库文件时并被调用时,编译器按DOS设置的环境变量目录去寻找。
(2)define 格式:define 宏替换名字符串或数值宏替换名可以带形式参数,程序用到时输入实参。
一、运行错误信息运行错误分为四类:1-99为DOS错误;100-149为I/O错误,发生I/O后,如果使用了编译开关{$I+},程序将终止执行,否则编译开关为{$I-},程序继续执行,并由IOResult函数返回错误信息;150-199为严重错误,200-255为致命错误,致命错误将立即终止程序执行。
错误代码及错误信息错误释义error 1:Invalid function number 无效函数号error 2:File not found 文件未找到error 3:Path not found 找不到路径error 4:Too many open files 打开文件太多error 5:File access denied 文件不允许访问error 6:Invalid file handle 无效文件句柄error 12:Invalid file access code 无效文件存取代码error 15:Invalid drive number 无效驱动器号error 16:Cannot remove current directory 不能删除当前目录error 17:Cannot rename across drives 不能跨驱动器改名error 18:No more files 没有文件了error 100:Disk read error 读磁盘错error 101:Disk write error 写磁盘错error 102:File not assigned 文件变量未赋值error 103:File not open 文件未打开error 104:File not open for input 文件未打开为写方式error 105:File not open for output 文件未打开为读方式error 106:Invalid numeric format 无效数值格式error 150:Disk is write-protected 磁盘写保护error 151:Bad drive request struct length 错误的驱动器请求结构长度error 152:Drive not ready 驱动器未准备好error 154:CRC error in data 数据CRC校验错error 156:Disk seek error 磁盘定位错error 157:Unknown media type 未知的介质类型error 158:Sector Not Found 找不到扇区error 159:Printer out of paper 打印机缺纸error 160:Device write fault 设备写错误error 161:Device read fault 设备读错误error 162:Hardware failure 硬件故障error 200:Division by zero 被零除error 201:Range check error 范围检查出错error 202:Stack overflow error 栈溢出error 203:Heap overflow error 堆溢出error 204:Invalid pointer operation 无效的指针操作error 205:Floating point overflow 浮点运算上溢error 206:Floating point underflow 浮点运算下溢error 207:Invalid floating point operation 无效的浮点运算error 208:Overlay manager not installed 未安装覆盖管理程序error 209:Overlay file read error 读覆盖文件错误error 210:Object not initialized 对象未初始化error 211:Call to abstract method 调用抽象方法error 212:Stream registration error 流注_册错误error 213:Collection index out of range 集合下标越界error 214:Collection overflow error 集合上溢error 215:Arithmetic overflow error 算术运算上溢error 216:General Protection fault 一般保护性错误keil c编译器错误与解决方法1. Warning 280:’i’:unreferenced local variable说明局部变量i 在函数中未作任何的存取操作解决方法消除函数中i 变量的宣告2 Warning 206:’Music3’:missing function-prototype说明Music3( )函数未作宣告或未作外部宣告所以无法给其他函数调用解决方法将叙述void Music3(void)写在程序的最前端作宣告如果是其他文件的函数则要写成extern void Music3(void),即作外部宣告3 Compling :C:\8051\Error:318:can’t open file ‘’说明在编译C:\8051\ 程序过程中由于用了指令#i nclude “”,但却找不到所致解决方法编写一个的包含档并存入到c:\8051 的工作目录中4 Compling:C:\8051\Error 237:’LedOn’:function already has a body说明LedOn( )函数名称重复定义即有两个以上一样的函数名称解决方法修正其中的一个函数名称使得函数名称都是独立的5 ***WARNING 16:UNCALLED SEGMENT,IGNORED FOR OVERL AY PROCESSSEGMENT: PR_DELAYX1MSDELAY说明DelayX1ms( )函数未被其它函数调用也会占用程序记忆体空间解决方法去掉DelayX1ms( )函数或利用条件编译#if …..#endif,可保留该函数并不编译6 ***WARNING 6 :XDATA SPACE MEMORY OVERLAP FROM : 0025HTO: 0025H说明外部资料ROM 的0025H 重复定义地址解决方法外部资料ROM 的定义如下Pdata unsigned char XFR_ADC _at_0x25 其中XFR_ADC 变量的名称为0x25,请检查是否有其它的变量名称也是定义在0x25 处并修正它7 WARNING 206:’DelayX1ms’:missing function-proto typeC:\8051\Error 267 :’DelayX1ms‘:requires ANSI-style prot otype C:\8051\说明程序中有调用DelayX1ms 函数但该函数没定义即未编写程序内容或函数已定义但未作宣告解决方法编写DelayX1ms 的内容编写完后也要作宣告或作外部宣告可在的包含档宣告成外部以便其它函数调用8 ***WARNING 1:UNRESOLVED EXTERNAL SYMBOL SYMBOL:MUSIC3MODULE:C:\8051\(MUSIC)***WARNING 2:REFERENCE MADE TO UNRESOLVED EXTERNALSYMBOL:MUSIC3MODULE:C:\8051\(MUSIC)ADDRESS:0018H说明程序中有调用MUSIC 函数但未将该函数的含扩档C 加入到工程档Prj 作编译和连接解决方法设MUSIC3 函数在MUSIC C 里将MUSIC C 添加到工程文件中去9 ***ERROR 107:ADDESS SPACE OVERFLOWSPACE: DATASEGMENT: _DATA_GOUP_LENGTH: 0018H***ERROR 118: REFERENCE MADE TO ERRONEOUS EXTERNA LSYMBOL: VOLUMEMODULE: C:\8051\ (OSDM)ADDRESS: 4036H说明data 存储空间的地址范围为0~0x7f,当公用变量数目和函数里的局部变量如果存储模式设为SMALL 则局部变量先使用工作寄存器R2~R7 作暂存当存储器不够用时则会以data 型别的空间作暂存的个数超过0x7f 时就会出现地址不够的现象解决方法将以data 型别定义的公共变量修改为idata 型别的定义10.***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: PR_WRITE_GMVLX1_REGD_GMVLX1CALLER1: PRVSYNC_INTERRUPTMAINCALLER2: C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: PR_SPI_SEND_WORDD_SPICALLER1: PRVSYNC_INTERRUPTMAINCALLER2: C_C51STARTUP***WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: PRSPI_RECEIVE_WORDD_SPICALLER1: PRVSYNC_INTERRUPTMAINCALLER2: C_C51STARTUP该警告表示连接器发现有一个函数可能会被主函数和一个中断服务程序(或者调用中断服务程序的函数)同时调用,或者同时被多个中断服务程序调用。
keil的编译过程Keil是一款由德国公司Keil GmbH开发的集成开发环境(IDE),主要针对嵌入式系统开发。
它基于ARM、C51、C251和C166处理器架构。
Keil的编译过程主要包括以下几个步骤:1. 文件处理:首先,Keil会读取项目文件(.uvp)中的源文件(.c或.cpp),并对它们进行预处理。
预处理包括替换宏、声明头文件和处理条件编译等。
2. 编译预处理:接下来,Keil使用ARM编译器对预处理后的源文件进行编译。
编译过程中,编译器会将源代码转换为目标代码(.o文件)。
此外,编译器还会处理汇编代码、链接符号地址以及生成重定位信息等。
3. 汇编处理:如果项目中包含汇编文件(.asm),Keil会使用ARM 汇编器对汇编文件进行编译。
编译完成后,汇编器将生成汇编代码(.o 文件)。
4. 链接处理:在编译和汇编完成后,Keil会使用ARM链接器对目标文件进行链接。
链接过程中,链接器会合并多个目标文件,消除重定位,生成最终的可执行文件(.elf或.axf)。
此外,链接器还会处理库文件(.lib)和启动代码(.res)等。
5. 生成输出文件:最后,Keil会生成输出文件,如Makefile、HTML 文档、调试信息等。
这些输出文件可以帮助开发者更好地理解和调试项目。
6. 调试:Keil还提供了丰富的调试工具,如MDK-ARM Debugger、Simulator等。
开发者可以在调试过程中查看代码执行状态、实时数据和硬件资源等信息,以便找出潜在问题并加以解决。
总之,Keil的编译过程涵盖了文件处理、编译预处理、汇编处理、链接处理、生成输出文件和调试等多个环节。
通过这些步骤,Keil为嵌入式系统开发者提供了一个高效、便捷的开发环境。
keil条件编译一、Keil 条件编译简介Keil 条件编译是嵌入式开发中一种常用的技术,它允许开发者根据不同的条件编译生成不同的目标文件,从而实现针对特定硬件平台的代码优化。
这种方法极大地提高了开发效率,降低了开发成本。
二、Keil 条件编译的原理与应用Keil 条件编译的原理是基于预处理器指令,预处理器在编译过程中的第一阶段,会对源代码进行处理。
通过预处理器指令,我们可以根据不同的条件生成不同的目标文件。
1.预处理器指令介绍Keil 提供了丰富的预处理器指令,如`#if`、`#else`、`#elif`、`#endif` 等。
这些指令用于根据条件编译代码片段。
2.条件编译应用场景(1)平台相关代码:根据不同的硬件平台,编写针对性的代码,提高代码的移植性。
(2)功能扩展:在现有代码基础上,根据需求添加或删除特定功能。
(3)代码优化:根据运行环境或硬件资源,优化代码性能。
三、实例演示以下是一个简单的实例,演示如何使用Keil 条件编译实现代码的差异化编译。
```c#include "stm32f10x.h" void delay(unsigned int t); int main(void){unsigned int i;// 开启调试器#if defined (DEBUG)DebugInit();#endiffor (i = 0; i < 10; i++){delay(1000);printf("Hello World! ");}while (1){}}void delay(unsigned int t) {unsigned int i;for (i = 0; i < t; i++){// 空循环,消耗时间}}#if defined (DEBUG)void DebugInit(void){printf("Debug mode enabled!");}#endif```在这个实例中,我们使用`#if` 指令判断是否定义了`DEBUG` 符号。