MICROCHIP MPLAB C18 User Manual

MPLAB® C18
C 编译器用户指南
2004 Microchip Technology Inc. DS51288C_CN
请注意以下有关 Microchip 器件代码保护功能的要点:
•Microchip的产品均达到 Microchip 数据手册中所述的技术指标。
•Microchip确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一。
目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的操 作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。
•Microchip愿与那些注重代码完整性的客户合作。
•Microchip或任何其它半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。
代码保护功能处于持续发展中。 Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视 为违反了《数字器件千年版权法案(Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的软 件或其它受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。
本出版物中所述的器件应用信息及其它类似内容仅为您提供便 利,它们可能由更新之信息所替代。确保应用符合技术规范,是 您自身应负的责任。 Microchip 对这些信息不作任何明示或暗 示、书面或口头的声明或担保,包括但不限于针对其使用情况、 质量、性能、适销性或特定用途的适用性的声明或担保。 Microchip 对因这些信息及使用这些信息而引起的后果不承担任 何责任。未经 Microchip 书面批准,不得将 Microchip 的产品用 作生命维持系统中的关键组件。在 Microchip 知识产权保护下, 不得暗中或以其它方式转让任何许可证。
商标
Microchip 的名称和徽标组合、 Microchip 徽标、 Accuron dsPIC、 K
EELOQ、 microID、 MPLAB、 PIC、 PICmicro、
PICSTARTPRO MATEPowerSmartrfPIC SmartShunt
均为 Microchip Technology Inc. 在美国和其它国家或地区的注 册商标。
AmpLabFilterLabMXDEVMXLABPICMASTER rfPICSEEVALSmartSensor The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的注
册商标。
Analog-for-the-Digital AgeApplication Maestro dsPICDEMdsPICDEM.netdsPICworksECAN ECONOMONITORFanSenseFlexROMfuzzyLAB In-Circuit Serial Programming、 ICSP、 ICEPIC、 Migratable MemoryMPASMMPLIBMPLINKMPSIMPICkit PICDEMPICDEM.netPICLABPICtailPowerCal PowerInfoPowerMatePowerToolrfLABrfPICDEM Select ModeSmart Serial、SmartTel Total Endurance 均为 Microchip Technology Inc. 在美国和其它国家或地区的商标。
SQTP 是 Microchip Technology Inc. 在美国的服务标记。
在此提及的所有其它商标均为各持有公司所有。
© 2004, Microchip Technology Inc。版权所有。
Microchip Mountain View
过了 机、 器和模拟产品方面的质量体系流程均符合
Microchip 9001:2000
位于美国亚利桑那州
ISO/TS-16949:2002 KEELOQ
的全球总部、设计中心和晶圆生产厂均于
®
跳码器件、串行
在开发系统的设计和生产方面的质量体系也已通过了
认证。
Chandler和Te mp e
质量体系认证。公司在
EEPROM
、单片机外设、非易失性存储
ISO/TS-16949:2002
及位于加利福尼亚州
PICmicro
2003年10
®
8
位单片
。此外,
月通
ISO
DS51288C_CN ii  2004 Microchip Technology Inc.
MPLAB® C18 C 编译器
用户指南
目录
前 言 ................................................................................................................................. 1
1 章 简介
1.1 概述.............................................................................................................. 7
1.2 调用编译器 ................................................................................................... 7
1.2.1 生成输出文件 ................................................................................................. 8
1.2.2 显示诊断信息 ................................................................................................. 8
1.2.3 定义宏 ............................................................................................................ 9
1.2.4 选择处理器 ..................................................................................................... 9
1.2.5 选择模式......................................................................................................... 9
2 章 语法说明
2.1 数据类型及数值范围................................................................................... 11
2.1.1 整型.............................................................................................................. 11
2.1.2 浮点型 .......................................................................................................... 12
2.2 字节存储顺序 — Endianness ................................................................... 12
2.3 存储类别..................................................................................................... 13
2.3.1 Overlay......................................................................................................... 13
2.3.2 static 型函数参数 ..................................................................................... 14
2.4 存储限定符 ................................................................................................. 14
2.4.1 near/far 数据存储对象 ............................................................................. 14
2.4.2 near/far 程序存储对象 ............................................................................. 14
2.4.3 ram/rom 限定符 .......................................................................................... 15
2.5 包含文件搜索路径 ...................................................................................... 15
2.5.1 系统头文件 ................................................................................................... 15
2.5.2 用户头文件 ................................................................................................... 15
2.6 预定义宏名 ................................................................................................. 16
2.7 ISO 的差异............................................................................................. 16
2.7.1 整型的提升 ................................................................................................... 16
2.7.2 数字常量....................................................................................................... 16
2.7.3 字符串常量 ................................................................................................... 17
2.8 语言的扩展 ................................................................................................. 19
2.8.1 匿名结构....................................................................................................... 19
2.8.2 行内汇编....................................................................................................... 20
2.9 Pragma 伪指令........................................................................................... 21
2.9.1 #pragma sectiontype ........................................................................... 21
2.9.2 #pragma interruptlow fname /
#pragma interrupt fname .................................................................... 27
2.9.3 #pragma varlocate bank variable-name
#pragma varlocate "section-name" variable-name................... 31
2.10 针对处理器的头文件................................................................................... 33
2.11 针对处理器的寄存器定义文件 .................................................................... 35
2.12 配置字 ........................................................................................................ 35
2004 Microchip Technology Inc. DS51288C_CNiii
MPLAB® C18 C 编译器用户指南
3 章 运行时模型
3.1 存储模型 .................................................................................................... 37
3.2 关于调用的约定.......................................................................................... 38
3.2.1 返回值...........................................................................................................39
3.2.2 管理软件堆栈 ................................................................................................40
3.2.3 C 语言与汇编语言的混合编程.......................................................................40
3.3 启动代码 .................................................................................................... 45
3.3.1 默认操作 .......................................................................................................45
3.3.2 定制 ..............................................................................................................46
3.4 编译器管理的资源 ...................................................................................... 46
4 章 优化
4.1 合并相同的字符串 ...................................................................................... 49
4.2 转移优化 .................................................................................................... 50
4.3 存储区选择优化 ......................................................................................... 50
4.4 W 寄存器内容跟踪 ..................................................................................... 51
4.5 代码排序 .................................................................................................... 51
4.6 尾部合并 .................................................................................................... 52
4.7 删除执行不到的代码 .................................................................................. 53
4.8 复制传递 .................................................................................................... 53
4.9 冗余存储删除 ............................................................................................. 54
4.10 删除死代码................................................................................................. 55
4.11 过程抽象 .................................................................................................... 55
5 章 示例应用程序 附录 A COFF 文件格式
A.1 struct filehdr — 文件头 ................................................................... 61
A.1.1 unsigned short f_magic......................................................................61
A.1.2 unsigned short f_nscns.......................................................................61
A.1.3 unsigned long f_timdat........................................................................61
A.1.4 unsigned long f_symptr........................................................................61
A.1.5 unsigned long f_nsyms ..........................................................................61
A.1.6 unsigned short f_opthdr......................................................................61
A.1.7 unsigned short f_flags........................................................................62
A.2 struct opthdr — 可选文件头 .............................................................. 62
A.2.1 unsigned short magic ............................................................................62
A.2.2 unsigned short vstamp ..........................................................................62
A.2.3 unsigned long proc_type......................................................................62
A.2.4 unsigned long rom_width_bits...........................................................64
A.2.5 unsigned long ram_width_bits...........................................................64
A.3 struct scnhdr — 段头 ......................................................................... 64
A.3.1 union _s.....................................................................................................65
A.3.2 unsigned long s_size ............................................................................65
A.3.3 unsigned long s_scnptr........................................................................65
A.3.4 unsigned long s_relptr........................................................................65
A.3.5 unsigned long s_lnnoptr......................................................................65
A.3.6 unsigned short s_nreloc......................................................................65
A.3.7 unsigned short s_nlnno........................................................................65
A.3.8 unsigned long s_flags ..........................................................................66
DS51288C_CNiv  2004 Microchip Technology Inc.
目录
A.4 struct reloc 重定位记录 ................................................................. 66
A.4.1 unsigned long r_vaddr.......................................................................... 66
A.4.2 unsigned long r_symndx........................................................................ 66
A.4.3 short r_offset........................................................................................ 66
A.4.4 unsigned short r_type.......................................................................... 67
A.5 struct syment — 符号表记录............................................................... 68
A.5.1 union _n..................................................................................................... 68
A.5.2 unsigned long n_value.......................................................................... 68
A.5.3 short n_scnum.......................................................................................... 69
A.5.4 unsigned short n_type.......................................................................... 69
A.5.5 char n_sclass.......................................................................................... 70
A.5.6 char n_numaux.......................................................................................... 70
A.6 struct coff_lineno — 行号记录 ....................................................... 71
A.6.1 unsigned long l_srcndx........................................................................ 71
A.6.2 unsigned short l_lnno.......................................................................... 71
A.6.3 unsigned long l_paddr.......................................................................... 71
A.6.4 unsigned short l_flags........................................................................ 71
A.6.5 unsigned long l_fcnndx........................................................................ 71
A.7 struct aux_file 源文件的附加符号表记录.................................... 71
A.7.1 unsigned long x_offset........................................................................ 71
A.7.2 unsigned long x_incline ..................................................................... 71
A.7.3 unsigned char x_flags.......................................................................... 72
A.8 struct aux_scn — 段的附加符号表记录 .............................................. 72
A.8.1 unsigned long x_scnlen........................................................................ 72
A.8.2 unsigned short x_nreloc ..................................................................... 72
A.8.3 unsigned short x_nlinno ..................................................................... 72
A.9 struct aux_tag struct/union/enum 标记名的附加符号表记录 .72
A.9.1 unsigned short x_size.......................................................................... 72
A.9.2 unsigned long x_endndx........................................................................ 72
A.10 struct aux_eos struct/union/enum 结束的附加符号表记录...... 73
A.10.1 unsigned long x_tagndx...................................................................... 73
A.10.2 unsigned short x_size........................................................................ 73
A.11 struct aux_fcn 函数名的附加符号表记录........................................ 73
A.11.1 unsigned long x_tagndx...................................................................... 73
A.11.2 unsigned long x_lnnoptr ................................................................... 73
A.11.3 unsigned long x_endndx...................................................................... 73
A.11.4 short x_actscnum ................................................................................. 73
A.12 struct aux_fcn_calls 函数调用的附加符号表记录 ....................... 74
A.12.1 unsigned long x_calleendx............................................................... 74
A.12.2 unsigned long x_is_interrupt......................................................... 74
A.13 struct aux_arr 数组的附加符号表记录 ........................................... 74
A.13.1 unsigned long x_tagndx...................................................................... 74
A.13.2 unsigned short x_size........................................................................ 74
A.13.3 unsigned short x_dimen[X_DIMNUM]................................................ 74
A.14 struct aux_eobf 块或函数结尾的附加符号表记录 .......................... 75
A.14.1 unsigned short x_lnno........................................................................ 75
2004 Microchip Technology Inc. DS51288C_CNv
MPLAB® C18 C 编译器用户指南
A.15 struct aux_bobf 块或函数开头的附加符号表记录 ......................... 75
A.15.1 unsigned short x_lnno........................................................................75
A.15.2 unsigned long x_endndx......................................................................75
A.16 struct aux_var struct/union/enum 类型变量
的附加符号表记录 ...................................................................................... 75
A.16.1 unsigned long x_tagndx......................................................................75
A.16.2 unsigned short x_size........................................................................75
A.17 struct aux_field 位域的附加记录.................................................. 76
A.17.1 unsigned short x_size........................................................................76
附录 B 采用 ANSI 定义的方式
B.1 简介............................................................................................................ 77
B.2 标识符 ........................................................................................................ 77
B.3 字符............................................................................................................ 77
B.4 整型............................................................................................................ 78
B.5 浮点数 ........................................................................................................ 78
B.6 数组和指针................................................................................................. 79
B.7 寄存器 ........................................................................................................ 79
B.8 结构和联合................................................................................................. 79
B.9 位域............................................................................................................ 79
B.10 枚举............................................................................................................ 80
B.11 Switch 语句 ................................................................................................ 80
B.12 预处理伪指令 ............................................................................................. 80
附录 C 命令行概述 附录 D MPLAB C18 诊断
D.1 错误............................................................................................................ 83
D.2 警告............................................................................................................ 93
D.3 消息............................................................................................................ 95
附录 E 扩展模式
E.1 源代码兼容性 ............................................................................................. 97
E.1.1 栈帧大小.......................................................................................................97
E.1.2 static 型参数.............................................................................................97
E.1.3 overlay 关键字 ..........................................................................................97
E.1.4 行内汇编.......................................................................................................98
E.1.5 预定义宏.......................................................................................................98
E.2 命令行选项差别.......................................................................................... 99
E.3 COFF 文件差别.......................................................................................... 99
E.3.1 一般处理器 ...................................................................................................99
E.3.2 文件头的 f_flags 字段...............................................................................99
术语表...........................................................................................................................101
索引 ..............................................................................................................................107
全球销售及服务网点 .....................................................................................................114
DS51288C_CNvi 2004 Microchip Technology Inc.
简介
关于本指南
MPLAB® C18 C 编译器
用户指南
前 言
本文档论述 MPLAB® C18 编译器的技术细节,并讲解 MPLAB C18 编译器的所有功 能。 这里假定读者已经具备如下基本素质:
知道如何编写 C 程序
知道如何使用 MPLAB 集成开发环境创建和调试项目
已经阅读并理解了所使用单片机的数据手册
文档内容编排
文档内容编排如下:
1 章:简介 提供对 MPLAB C18 编译器的概述以及有关调用编译器的信息。
2 章:语法说明 论述 MPLAB C18 编译器与 ANSI 标准的不同之处。
3 章:运行时模型 — 论述MPLAB C18 编译器如何利用 PIC18 PICmicro
的资源。
4 章:优化 论述 MPLAB C18 编译器执行的优化功能。
5 章:示例应用程序 给出一个示例应用程序,并就本用户指南中论述的各主
题,对源代码进行了说明。
附录 ACOFF 文件格式 详细阐述了 Microchip COFF 格式。
附录B:采 用 ANSI 定义的方式 论述按照 ANSI 标准的要求,MPLAB C18实现所
定义的执行方式。
附录 C:命令行概述 列出了命令行选项以及论述每个命令行选项的参考章节。
附录 DMPLAB C18 诊断 列出了错误、警告和消息。
附录 E:扩展模式 论述非扩展模式和扩展模式之间的区别。
®
单片机
2004 Microchip Technology Inc. DS51288C_CN 第 1
MPLAB® C18 C 编译器用户指南
本指南中使用的约定
本用户指南使用如下文档约定:
文档约定
描述 表示 示例
代码 (Courier 字体): Courier 字体 示例源代码
文件名和路径 关键字 命令行选项
斜体 Courier 可变参数 file.o,其中 file 可以是任何有效的文件名 方括号 [ ] 可选的参数 省略号 ... 代替重复的文本示例
表示由用户提供的代码
0xnnnn
文档 (Arial 字体): 斜体字符 参考书籍
十六进制数,其中 n 代表 十六进制位
distance -= time * speed; c:\mcc18\h _asm, _endasm, static
-Opa+, -Opa-
mcc18 [options] file [options] var_name [, var_name...]
void main (void) { ... }
0xFFFF, 0x007A
MPLAB User’s Guide
文档更新
所有的文档将来都会过时,本指南也不例外。为满足客户的需要, MPLAB C18 在不断 发展之中,本文档中对于某些工具的描述可能与实际有所差别。请登录我公司网站获
得最新的文档。
文档命名约定
文档用 “DS”号编号。编号位于每页的页脚,在页码之前。 DS 号的命名约定为
DSXXXXXA DSXXXXXA_CN,其中:
XXXXX =
A=
_CN
文档号。 文档的版本。
= 文档为中文版。
DS51288C_CN 2  2004 Microchip Technology Inc.
PIC18 参考读物
前言
readme.c18
关于使用 MPLAB C18 C 编译器的最新信息,请阅读本软件自带的 readme.c18 文件
ASCII 文本)。此自述文件包含了本文档可能未提供的更新信息。
MPLAB
描述如何安装 MPLAB C18 编译器,如何编写简单的程序以及如何使用安装了编译器 的 MPLAB IDE
MPLAB
关于 MPLAB C18 库文件和预编译目标文件的参考指南。列出了随 MPLAB C18 C 提供 的所有库函数,并详细描述了这些库函数的使用。
MPLAB
描述如何安装 MPLAB IDE 软件,如何使用它来创建项目及烧写器件。
MPASM
讲述如何使用 Microchip PICmicro MCU 汇编器 (MPASM)、链接器 (MPLINK)和 库管理器 (MPLIB)。
PICmicro
重点介绍增强型单片机系列。说明了增强型单片机系列的架构和外设模块的工作原理, 但没有涉及到每个器件的具体细节。
PIC18 Device Data Sheets and Application Notes
讲述 PIC18 器件工作和电气特性的数据手册。应用笔记介绍了如何使用 PIC18 器件。 要获得上面列出的任何文档,请访问 Microchip 的网站 (www.microchip.com), 获 得
Adobe Acrobat .pdf)格式的文档。
®
C18 C 编译器入门 (DS51295C_CN
®
C18 C 编译器函数库 (DS51297C_CN
®
IDE V6.XX 快速入门指南 (DS51281C_CN
User’s Guide with MPLINK™ Linker and MPLIB™ Librarian (DS33014)
®
18C 单片机系列参考手册 (DS39500A_CN
2004 Microchip Technology Inc. DS51288C_CN 3
MPLAB® C18 C 编译器用户指南
C 语言参考读物
American National Standard for Information Systems – Programming Language – C.
American National Standards Institute (ANSI), 11 West 42nd. Street, New York, New York, 10036.
此标准规定了用 C 语言编写程序的格式,并对 C 程序进行了解释。其目的是提高 C 程序在多种计算机系统上的可移植性、可靠性、可维护性及执行效率。
Beatman, John B. Embedded Design with the PIC18F452 Microcontroller, First
Edition. Pearson Education, Inc., Upper Saddle River, New Jersey 07458.
重点介绍 Microchip 公司的 PIC18FXXX 系列单片机以及如何编写优化的应用代码。
Harbison, Samuel P. and Steele, Guy L., C A Reference Manual, Fourth Edition.
Prentice-Hall, Englewood Cliffs, New Jersey 07632.
详细地讲述了 C 编程语言。这本书是一本权威性的参考手册,它对 C 语言、运行时 库以及 C 编程的风格都进行了完整的描述,C 编程强调正确性、可移植性和可维护
性。
Kernighan, Brian W. and Ritchie, Dennis M. The C Programming Language, Second
Edition. Prentice Hall, Englewood Cliffs, New Jersey 07632.
对由 ANSI 标准定义的 C 语言进行了简明阐述。对于 C 程序员来说是一本出色的参 考书。
Kochan, Steven G. Programming In ANSI C, Revised Edition. Hayden Books,
Indianapolis, Indiana 46268.
学习 ANSI C 的另一本出色的参考书,用作大学教材。
Van Sickle, Ted. Programming Microcontrollers in C, First Edition. LLH Technology
Publishing, Eagle Rock, Virginia 24085.
尽管这本书主要讲的是 Motorola 单片机,但其中单片机 C 语言编程的基本原理是 很有用的。
DS51288C_CN 4 2004 Microchip Technology Inc.
MICROCHIP 网站
前言
Microchip 网站为您提供在线支持。客户很容易从 Microchip 网站上获得文件和信息。 要访问此网站,您必须能访问互联网并要安装
Netscape Navigator 使用您喜欢的 Internet 浏览器,可以访问 Microchip 的网站:
http://www.microchip.com
网站提供多种服务。用户从网站上可以下载到最新开发工具的文件、数据手册、应用 笔记、用户指南、文章和示例程序。也可以获得关于 Microchip 业务的具体信息,包括
销售办事处、分销商和工厂代表的列表。
技术支持
常见问题 (FAQ)
在线讨论组 关于产品、开发系统、技术信息及其它方面的讨论会。
• Microchip 顾问计划成员列表
到其它与 Microchip 产品相关的其它有用网站的链接
工程师工具箱
设计技巧
器件勘误表
®
Microsoft® Internet Explorer 等网络浏览器。
其它信息
最新 Microchip 新闻稿
研讨会和活动列表
招聘职位
开发系统客户通知服务
Microchip 启动了客户通知服务,来帮助客户轻松获得关于 microchip 产品的最新信 息。 订阅此项服务后,每当您指定的产品系列或感兴趣的开发工具有更改、更新、改
进或有勘误时,您都会收到电子邮件通知。 登录 Microchip 网站 (http://www.microchip.com),点击 “客户变更通知”。按照指
示注册。 开发系统产品组分类如下:
编译器
仿真器
在线调试器
• MPLAB IDE
编程器
2004 Microchip Technology Inc. DS51288C_CN 5
MPLAB® C18 C 编译器用户指南
下面是对这些类别的描述: 编译器 — 关于 Microchip C 编译器和其它语言工具的最新信息。这些工具包括 MPLAB
C17MPLAB C18 MPLAB C30 C 编译器; MPASM MPLAB ASM30 汇编器; MPLINK MPLAB LINK30 目标链接器; MPLIB MPLAB LIB30 目标库管理器。
仿真器 关于 Microchip 在线仿真器的最新信息。包括 MPLAB ICE 2000 MPLAB ICE 4000
在线调试器 — 关于 Microchip 在线调试器的最新信息,包括 MPLAB ICD 2。 MPLAB IDE — 关于 Microchip MPLAB IDE 的最新信息,它是开发系统工具的
Windows
项目管理器以及一般的编辑和调试功能。 编程器关于 Microchip 器件编程器的最新信息。包括 MPLAB PM3 PRO MATE
II 器件编程器,以及 PICSTART
客户支持
Microchip 产品的用户可通过下列渠道获得支持:
分销商或代表
当地销售办事处
应用工程师 (FAE
应用工程师 (CAE
热线
客户可以致电其分销商、代表或应用工程师 (FAE)寻求支持。请查看本手册后封面 的销售办事处及地址列表。
欲获得技术支持,可访问网站 http://support.microchip.com,也可致电应用工程师
CAE),中国大陆地区请拨打 800-820-6247
®
集成开发环境。重点介绍 MPLAB IDEMPLAB SIM 仿真器、MPLAB IDE
®
Plus 开发编程器。
®
此外还有系统信息和更新热线。此热线为系统用户提供开发系统软件产品最新版本的 列表。此热线还提供有关客户如何获得目前更新工具包的信息。
热线号码为: 美国和加拿大大部分地区,请拨打 1-800-755-2345
全球其它国家或地区,请拨打 1-480-792-7302
DS51288C_CN 6 2004 Microchip Technology Inc.

1.1 概述

MPLAB® C18 C 编译器
用户指南

1 章 简介

MPLAB C18 编译器是适用于 PIC18 PICmicro 单片机的独立而优化的 ANSI C 编译器。 仅在 ANSI 标准 X3.159-1989 与高效的 PICmicro 单片机支持有冲突的情况下,此编译 器才会与 ANSI 标准有所偏离。 此编译器是一个 32 位 Windows 平台应用程序,与
Microchip MPLAB IDE 完全兼容,它允许使用 MPLAB ICE 在线仿真器、 MPLAB ICD 2 在线调试器或 MPLAB SIM 软件模拟器进行源代码级调试。
MPLAB C18 编译器有以下特点:
ANSI '89 兼容
能集成到 MPLAB IDE,便于进行项目管理和源代码级调试
能生成可重定位的目标模块,增强代码的重用性
与由 MPASM 汇编器生成的目标模块兼容,允许在同一个项目中自由地进行汇编语 言和 C 语言的混合编程
对外部存储器的读 / 写访问是透明的
当需要进行实时控制时能很好地支持行内汇编
具有多级优化的高效代码生成引擎
拥有广泛的库支持,包括 PWM、SPI™、I
数学函数库
用户能对数据和代码的存储空间分配进行完全控制
2
C™UARTUSART、字符串操作和

1.2 调用编译器

MPLAB® C18 C
C18 编译器。也可以通过命令行调用编译器,命令行用法如下:
mcc18 [options] file [options]
可以指定一个源文件和任意个命令行选项。--help 命令行选项列出编译器接受的所有 命令行选项。 -verbose 命令行选项使编译器在编译结束时显示版本号以及错误、警 告和消息的总数等信息。
编译器入门》
DS51295C_CN)描述了如何在 MPLAB IDE 中使用
2004 Microchip Technology Inc. DS51288C_CN 7
MPLAB® C18 C 编译器用户指南
1.2.1 生成输出文件
默认情况下,编译器会生成一个名为 file.o 的输出目标文件,其中, file 是在命 令行上指定的源文件名,不包括扩展名。可通过-fo 命令行选项改变输出目标文件名。 例如:
mcc18 -fo bar.o foo.c
如果源文件有错误,那么编译器会生成一个名为 file.err 的错误文件,其中, file 是在命令行上指定的源文件名,不包括扩展名。可通过-fe 命令行选项改变错误
文件名。例如:
mcc18 -fe bar.err foo.c
1.2.2 显示诊断信息
诊断信息
可通过-w 和-nw 命令行选项控制。-w 命令行选项设置警告诊断的级别
12 3)。 表 1-1 列出了警告诊断的级别以及所表示的诊断类型。-nw 命令行选项
禁止特定的消息 (附录 D 或 --help-message-list 命令行选项列出由编译器生成 的所有消息)。 使用--help-message-all 命令行选项,可得到关于所有消息的帮 助。若要获得关于某个特定诊断的帮助,可使用 --help-message 命令行选项。例 如:
mcc18 --help-message=2068
会显示以下结果:
2068: obsolete use of implicit 'int' detected.
The ANSI standard allows a variable to be declared without a base type being specified, e.g., "extern x;", in which case a base type of 'int' is implied. This usage is deprecated by the standard as obsolete, and therefore a diagnostic is issued to that effect.
1-1 警告级别
警告级别 所表示的诊断
1
2
3
错误
致命的和非致命的
级别 1 加警告 级别 2 加消息
DS51288C_CN 8 2004 Microchip Technology Inc.
简介
1.2.3 定义宏
-D 命令行选项允许定义宏。可以用如下两种方式之一指定-D 命令行选项:-Dname
-Dname=value。-Dname定义宏名为name并设定其值为1-Dname=value定义宏名
name 并设定其值为 value。例如:
mcc18 -DMODE 定义了宏 MODE,其值为 1,而: mcc18 -DMODE=2
定义宏 MODE 的值为 2。 使用-D 命令行选项的一个例子是条件编译,例如:
#if MODE == 1
x = 5;
#elif MODE == 2
x = 6;
#else
x = 7;
#endif
1.2.4 选择处理器
默认情况下, MPLAB C18 针对一般的 PIC18 PICmicro 单片机编译应用程序。可以利 用-pprocessor 命令行选项指定为某个特定的处理器生成目标文件,其中 processor 指定要使用的处理器型号。例如,要生成仅供 PIC18F452 使用的目标文 件,应该使用命令行选项-p18f452。命令行选项-p18cxx 明确指定针对一般的 PIC18 PICmicro 单片机编译源文件。
1.2.5 选择模式
编译器可工作在如下两种不同的工作模式: 扩展模式和非扩展模式。工作在扩展模式 时,编译器使用扩展指令 (即 ADDFSRADDULNKCALLWMOVSFMOVSS
PUSHLSUBFSR SUBULNK)和立即数变址寻址,这种寻址方式通常需要较少的指 令来访问基于堆栈的变量 (因此占用较小的程序存储空间)。工作在非扩展模式时, 编译器不使用扩展指令或立即数变址寻址。 --extended --no-extended 命令行 选项告知编译器工作模式。表 1-2 概括了基于所指定命令行选项的编译器工作模式。
2004 Microchip Technology Inc. DS51288C_CN 9
MPLAB® C18 C 编译器用户指南
1-2 模式选择
-p extended
--extended
--no-extended
不指定 非扩展 非扩展 非扩展 非扩展
注: 如果使用 mcc18 --help 调用编译器,将显示关于编译器工作在非扩展模式的帮
助;但是,当编译器工作在非扩展模式时,不是所有的命令行选项都有效。要查看 关于编译器工作在扩展模式时的帮助,应该使用命令行选项 mcc18 --extended
--help
扩展 错误 扩展 扩展
非扩展 非扩展 非扩展 非扩展
注: 其它命令行选项将在本用户指南的后面部分中论述,在附录 C 中可以找到
对所有命令行选项的概括。
-p no-extended
-p18cxx
不指定 编译器
DS51288C_CN 10 2004 Microchip Technology Inc.

2.1 数据类型及数值范围

2.1.1 整型
MPLAB C18 编译器支持由 ANSI 定义的标准整型。标准整型的数值范围如表 2-1 示。另外, MPLAB C18 还支持 24 位整型 short long int (或 long short int),分为有符号和无符号两种类型。表 2-1 也列出了 24 位整型的数值范围。
2-1 整型数据的长度及数值范围
(1,2)
char signed char
unsigned char int unsigned int short unsigned short short long unsigned short long long unsigned long
1: 若 char 前没有符号说明,则默认为有符号型。
2: 可通过-k 命令行选项使无符号说明的 char 默认为无符号型。
MPLAB® C18 C 编译器
用户指南

2 章 语法说明

类型 长度 最小值 最大值
8
8 8
16 16 16
16 24 24
32 32
-2,147,483,648 2,147,483,647
-128 127
-128 127
0255
-32,768 32,767
0 65535
-32,768 32,767
0 65,535
-8,388,608 8,388,607
0 16,777,215
0 4,294,967,295
2004 Microchip Technology Inc. DS51288C_CN 11
MPLAB® C18 C 编译器用户指南
2.1.2 浮点型
MPLAB C18 来说, double float 数据类型都是 32 位浮点型。表 2-2 列出了 浮点型数据的数值范围。
2-2 浮点型数据的长度及数值范围
类型 长度 最小指数 最大指数 规格化的最小值 规格化的最大值
float double
32
32
MPLAB C18 的浮点数格式是 IEEE 754 格式的改进形式。 MPLAB C18 格式和 IEEE 754 格式的不同之处在于数据表示的最高 9 位。 IEEE 754 格式的最高 9 位循环左移一
次将转换为 MPLAB C18 格式。同理,MPLAB C18 格式最高 9 位循环右移一次将转换 为 IEEE 754 格式。表 2-3 对这两种格式作了比较。
2-3 MPLAB C18 浮点格式与 IEEE 754 格式的对比
-126 128
-126 128
2
2
–126
1.17549435e - 38 2
–126
1.17549435e - 38 2
128
128
* (2-2
* (2-2
–15
) 6.80564693e + 38
–15
) 6.80564693e + 38
标准 指数字节
IEEE 754
MPLAB C18
se0e1e2e3e4e5e
e0e1e2e3e4e5e6e
图注: s = 符号位
d = 尾数 e = 指数
2.2 字节存储顺序 — ENDIANNESS
Endianness 指多字节数据中的字节存储顺序。 MPLAB C18 采用低字节低地址
little-endian)格式存储数据,低字节存储在较低地址中 (即数据是按 “低字节先
存”的方式存储的)。例如:
#pragma idata test=0x0200 long l=0xAABBCCDD;
数据在存储器中的存放结果如下:
地址 内容
0x0200 0x0201 0x0202 0x0203
0xDD 0xCC 0xBB 0xAA
字节 0 字节 1 字节 2
e7ddd dddd dddd dddd dddd dddd
6
sddd dddd dddd dddd dddd dddd
7
DS51288C_CN 12  2004 Microchip Technology Inc.

2.3 存储类别

语法说明
MPLAB C18 支持 ANSI 标准的存储类别 (autoexternregisterstatictypedef)。
2.3.1 Overlay
MPLAB C18 编译器引入了 overlay (重叠)存储类别,仅当编译器工作在非扩展模 式 (参见 1.2.5 节 “选择模式”)时才使用此存储类别。 overlay 存储类别可用于局
部变量 (但不能用于形式参数、函数定义或全局变量)。 overlay 存储类别将相关变 量分配到一个特定于函数的静态重叠存储区。这种变量是静态分配存储空间的,但每
次进入函数时都要被初始化。例如:
void f (void) { overlay int x = 5; x++; }
尽管 x 的存储空间是静态分配的, x 在每次进入函数时都会被初始化为 5。如果没有 初始化,那么进入函数时其值是不确定的。
MPLINK 链接器将使不同时运行的函数中定义为 overlay 的局部变量共享存储空间。 例如,在下面的函数中:
int f (void) { overlay int x = 1; return x; }
int g (void) { overlay int y = 2; return y; }
如果 f 和 g 永远不会同时运行,则 x 和 y 共享相同的存储空间。但是,在下面的函数 中:
int f (void) { overlay int x = 1; return x; }
int g (void) { overlay int y = 2; y = f ( ); return y; }
由于 f 和 g 可能会同时运行, x 和 y 不能共享相同的存储空间。使用 overlay 局部 变量的优点是,其存储空间是静态分配的,也就是说,在一般情况下,存取这种变量
所需要的指令较少 (因此所生成代码占用的程序存储空间也较小)。 同时,由于一些 变量可以共享相同的存储空间,这些变量所需分配的总的数据存储空间比定义为
static 时要小。
2004 Microchip Technology Inc. DS51288C_CN 13
MPLAB® C18 C 编译器用户指南
如果 MPLINK 链接器检测到包含 overlay 局部变量的递归函数,就会发出错误并中 止编译。如果 MPLINK 链接器检测到,在任意模块中有通过指针进行的函数调用,在
任意模块 (不一定和上述模块是同一模块)中有存储类别为 overlay 的局部变量, 就会发出错误并中止编译。
局部变量默认的存储类别是 auto。可以使用关键字 static overlay 显式地定义 存储类别,或使用-scs static 局部变量)或-sco overlay 局部变量) 命令行 选项隐式地定义存储类别。为保持完整性, MPLAB C18 也支持-sca 命令行选项,该 选项允许把局部变量的存储类别显式地定义为 auto 型。
2.3.2 static 型函数参数
函数参数的存储类别可以是 auto 型或 static 型。 auto 型参数存放在软件堆栈中, 允许重入。 static 型参数是全局分配存储空间的,允许直接访问,通常所需代码较
少。 static 型参数仅当编译器工作在非扩展模式 (参见 1.2.5 节 “选择模式”)时 有效。
函数参数默认的存储类别是 auto 型。可以使用关键字 static 显式地定义存储类别 或使用-scs 命令行选项隐式地定义存储类别。-sco 命令行选项也可以隐式地把函数
参数的存储类别改变为 static 型。

2.4 存储限定符

除 ANSI 标准的存储限定符 (const, volatile)外, MPLAB C18 编译器还引入了 farnearrom ram 存储限定符。在语句构成上,这些新限定符与标识符之间的
约束关系与 ANSI C const volatile 限定符与标识符的关系相同。表 2-4 表 明,定义对象时所指定的存储限定符决定了对象在存储器中的位置。对于一个没有用 显式的存储限定符定义的对象,其默认的存储限定符是 far ram
2-4 存储限定符指定对象在存储器中的位置
rom ram
far near 在程序存储器中的地址小于 64K
程序存储器中的任何位置 数据存储器中的任何位置 (默认)
存取存储区
2.4.1 near/far 数据存储对象
far 限定符表示变量存储在数据存储器的存储区中,访问这一变量之前需要存储区切换 指令。 near 限定符表示变量存储在存取 RAM 中。
2.4.2 near/far 程序存储对象
far 限定符表示变量可以位于程序存储器中的任何位置,或者,如果是一个指针变量, 那么它能访问 64K 或者更大的程序存储空间。 near 限定符表示变量只能位于地址小 于 64K 的程序存储空间,或者,如果是一个指针变量,那么它只能访问不超过 64K
程序存储空间。
DS51288C_CN 14 2004 Microchip Technology Inc.
语法说明
2.4.3 ram/rom 限定符
因为 PICmicro 单片机使用独立的程序存储器和数据存储器地址总线,所以 MPLAB C18 需要一些扩展来区分数据是位于程序存储器还是位于数据存储器。 ANSI/ISO C
准允许代码和数据位于不同的地址空间,但并不能定位代码空间中的数据。为此,
MPLAB C18 引入了 rom ram 限定符。 rom 限定符表示对象位于程序存储器中,而 ram 限定符表示对象位于数据存储器中。
指针既可以指向数据存储器 (ram 指针),也可以指向程序存储器 (rom 指针)。一 般将指针视为 ram 指针,除非定义为 rom。指针的长度取决于指针的类型,如表 2-5
所示。
注: rom 变量时,编译器使用一个 TBLWT 指令;但可能还需要附加的应用代码,
这取决于所使用的存储器类型。详情请参阅数据手册。
2-5 指针长度
指针类型 例子 长度
数据存储器指针 char * dmp; 16
Near 程序存储器指针 rom near char * npmp; 16 Far 程序存储器指针 rom far char * fpmp; 24

2.5 包含文件搜索路径

2.5.1 系统头文件
MCC_INCLUDE 环境变量中指定的路径和由-I 命令行选项指定的目录中搜索用 #include <filename> 包含的源文件。MCC_INCLUDE 环境变量和-I 值都是由分号
界定的搜索目录列表。如果被包含的文件在 MCC_INCLUDE 环境变量列出的目录和-I 命令行选项列出的目录中都存在,那么将从由-I 命令行选项列出的目录中包含此文 件,而忽略 MCC_INCLUDE 环境变量列出的目录。
2.5.2 用户头文件
先在引用被包含文件的源文件所在目录中搜索用 #includefilename包含的源文 件。如果找不到,则采用搜索系统头文件的方式搜索此文件 (参见 2.5.1 节 “系统头
文件”)。
2004 Microchip Technology Inc. DS51288C_CN 15
MPLAB® C18 C 编译器用户指南

2.6 预定义宏名

除了标准的预定义宏名外, MPLAB C18 还提供了如下预定义宏:
__18CXX 常数 1,用来表明使用的是 MPLAB C18 编译器。 __PROCESSOR 如果是为某个处理器进行编译的话,则相应的值为常数 1。例如
如果是用-p18c452 命令行选项编译,那么 __18C452 为常数 1。 如果是用-p18f258 命令行选项编译,那么 __18F258 为常数 1。
__SMALL__ 若是用-ms 命令行选项编译,为常数 1 __LARGE__ 若是用-ml 命令行选项编译,为常数 1
__TRADITIONAL18__ 如果使用非扩展模式 (参见 2.5.1 节 “系统头文件”), 为 常
1
__EXTENDED18__ 如果使用扩展模式 (参见 2.5.1 节 “系统头文件”),为常数 1

2.7 ISO 的差异

2.7.1 整型的提升
根据 ISO 的要求,所有算术运算都以 int 精度或更高精度进行。在默认情况下, MPLAB C18 的算术运算以最大操作数的长度进行,即使两个操作数长度都小于 int
也不例外。可通过-Oi 命令行选项设定按 ISO 标准进行运算。例如:
unsigned char a, b; unsigned i;
a = b = 0x80; i = a + b; /* ISO requires that i == 0x100, but in C18 i == 0 */
注意,常数也存在同样的差异。为常数选择的类型是所有合适的类型中长度最小的类 型,所谓合适的类型指能无溢出地表示常数值的类型。
例如:
#define A 0x10 /* A will be considered a char unless -Oi specified */ #define B 0x10 /* B will be considered a char unless -Oi specified */ #define C (A) * (B)
unsigned i; i = C; /* ISO requires that i == 0x100, but in C18 i == 0 */
2.7.2 数字常量
MPLAB C18 支持指定十六进制 (0x)和八进制 (0)值的标准前缀,另外还支持用 前缀 0b 来指定二进制值。例如,数值 237 可以表示为二进制常数 0b11101101
DS51288C_CN 16 2004 Microchip Technology Inc.
语法说明
2.7.3 字符串常量
程序存储器中的数据主要是静态字符串。为此, MPLAB C18 自动把所有字符串常量存 放在程序存储器中。这种类型的字符串常量是 “位于程序存储器的 char 数组”
const rom char [])。 .stringtable 段是一个包含所有常量字符串的
romdata (参见 2.9.1 节“#pragma sectiontype”)段。例如,如下的字符串
hello 将被置于 .stringtable 段:
strcmppgm2ram (Foo, "hello");
由于常量字符串存放在程序存储器中,所以标准字符串处理函数有多种形式。例如, strcpy 函数就有四种形式,允许把数据存储器或程序存储器中的字符串拷贝到数据
存储器或程序存储器:
/* * Copy string s2 in data memory to string s1 in data memory */ char *strcpy (auto char *s1, auto const char *s2);
/* * Copy string s2 in program memory to string s1 in data * memory */ char *strcpypgm2ram (auto char *s1, auto const rom char *s2);
/* * Copy string s2 in data memory to string s1 in program * memory */ rom char *strcpyram2pgm (auto rom char *s1, auto const char *s2);
/* * Copy string s2 in program memory to string s1 in program * memory */ rom char *strcpypgm2pgm (auto rom char *s1, auto const rom char *s2);
当使用 MPLAB C18 时,程序存储器中的一个字符串表可以定义为 :
rom const char table[][20] = { "string 1", "string 2", "string 3", "string 4" }; rom const char *rom table2[] = { "string 1", "string 2",
"string 3", "string 4" }; table 定义为一个由四个字符串组成的数组,每个字符串的长度为 20 个字符,所以在
程序存储器中占据 80 个字节。 table2 定义为一个指向程序存储器的指针数组。 * 面的 rom 限定符表示把指针数组也存放在程序存储器中。 table2 中的所有字符串长 度均为 9 个字节,而数组有 4 个元素,所以 table2 在程序存储器中共占用了
9*4+4*2 = 44 个字节。然而,对 table2 的存取可能会比对 table 的存取效率要
低,这是由于指针需要附加的间接寻址指令。 MPLAB C18 独立地址空间的一个重要影响是指向程序存储器中数据的指针与指向数据
存储器中数据的指针不兼容。只有当两种指针指向兼容类型的对象,而且指向的对象 位于相同的地址空间时,两种指针才会兼容。例如,一个指向程序存储器中字符串的
指针与一个指向数据存储器中字符串的指针是不兼容的,因为它们指向不同的地址空 间。
2004 Microchip Technology Inc. DS51288C_CN 17
MPLAB® C18 C 编译器用户指南
把一个字符串从程序存储器拷贝到数据存储器的函数可以这样编写:
void str2ram(static char *dest, static char rom *src) { while ((*dest++ = *src++) != '\0') ; }
下面的代码利用 PICmicro 单片机 C 库函数把一个位于程序存储器的字符串送到 PIC18C452 USART。库函数 putsUSART(const char *str) 用来把字符串送到 USART,它把指向一个字符串的指针作为其参数,但是此字符串必须位于数据存储器
中。
rom char mystring[] = "Send me to the USART";
void foo( void ) { char strbuffer[21]; str2ram (strbuffer, mystring); putsUSART (strbuffer); }
另一种方法是,可以把库函数修改为从程序存储器中读字符串。
/* * The only changes required to the library routine are to * change the name so the new routine does not conflict with * the original routine and to add the rom qualifier to the * parameter. */ void putsUSART_rom( static const rom char *data ) { /* Send characters up to the null */ do { while (BusyUSART()) ;
/* Write a byte to the USART */ putcUSART (*data); } while (*data++); }
DS51288C_CN 18  2004 Microchip Technology Inc.

2.8 语言的扩展

语法说明
2.8.1 匿名结构
MPLAB C18 支持联合内的匿名结构。匿名结构有以下形式:
struct { member-list };
匿名结构定义未命名的对象。匿名结构的成员名不能与定义此匿名结构的作用域内其 它名称相同。在此作用域内,可以直接使用成员而无需使用通常的成员访问语法。
例如:
union foo { struct { int a; int b; }; char c; } bar; char c;
...
bar.a = c; /* 'a' is a member of the anonymous structure located inside 'bar' */
定义了对象或指针的结构不是匿名结构。例如:
union foo { struct { int a; int b; } f, *ptr; char c; } bar; char c:
...
bar.a = c; /* error */ bar.ptr->a = c; /* ok */
bar.a 的赋值是非法的,因为此成员名与任何特定的对象都没有关联。
2004 Microchip Technology Inc. DS51288C_CN 19
MPLAB® C18 C 编译器用户指南
2.8.2 行内汇编
MPLAB C18 提供了一个内部汇编器,它使用和 MPASM 汇编器相似的语法。汇编代码 块必须以 _asm 开头,以 _endasm 结尾。其语法如下:
[label:] [<instruction> [arg1[, arg2[, arg3]]]]
内部汇编器与 MPASM 汇编器的差别如下:
不支持伪指令
注释必须使用 C C++ 符号
表格读 / 写必须使用全文本助记符,即:
- TBLRD
- TBLRDPOSTDEC
- TBLRDPOSTINC
- TBLRDPREINC
- TBLWT
- TBLWTPOSTDEC
- TBLWTPOSTINC
- TBLWTPREINC
没有默认的指令操作数 — 必须完整地指定所有操作数
默认的数制是十进制。
使用 C 的数制符号表示常数,而不是 MPASM 汇编器的符号。例如,一个十六进制 数应表示为 0x1234,而不是 H’1234’
标号必须包含冒号
不支持变址寻址语法 (即 [])— 必须指定立即数和存取位 (例如指定为 CLRF
2,0,而不是 CLRF [2]
例如:
_asm /* User assembly code */ MOVLW 10 // Move decimal 10 to count MOVWF count, 0
/* Loop until count is 0 */ start: DECFSZ count, 1, 0 GOTO done BRA start done: _endasm
一般情况下,建议尽量少使用行内汇编。编译器不会优化任何包含行内汇编的函数。 如果要编写大段的汇编代码,应使用 MPASM 汇编器,并用 MPLINK 链接器把汇编模 块链接到 C 模块。
DS51288C_CN 20 2004 Microchip Technology Inc.

2.9 PRAGMA 伪指令

2.9.1 #pragma sectiontype
段声明 pragma 伪指令将当前段更改为 MPLAB C18 分配相关类型的信息的段。 段是位于特定存储器地址的应用程序的一部分。段可以包含代码或数据,可以位于程
序存储器或数据存储器中。对于每种存储器,都有两种段类型。
程序存储器
- code – 包含可执行指令
- romdata包含变量和常量
数据存储器
- udata包含静态分配的未初始化用户变量
- idata包含静态分配的已初始化用户变量
段分为绝对的、已分配的或未分配的。绝对段是指通过段声明 pragma 伪指令的
=address 明确赋予了地址的段。已分配段是指已通过链接器描述文件中的 SECTION 伪指令分配到某个特定段的段。未分配段既不属于绝对段,也不属于已分配段。
2.9.1.1 语法
段伪指令:
# pragma udata [ | # pragma idata [ | # pragma romdata [overlay] [section-name [=address]] | # pragma code [overlay] [section-name [=address]]
属性列表
属性列表
语法说明
] [section-name [=address]]
] [section-name [=address]]
属性列表:
属性
|
属性列表 属性
属性:
access | overlay
section-name address
整型常量
C 标识符
2004 Microchip Technology Inc. DS51288C_CN 21
MPLAB® C18 C 编译器用户指南
2.9.1.2 段内容 code 段包含可执行的内容,位于程序存储器中。 romdata 段包含分配到程序存储器
的数据 (一般是用 rom 限定符定义的变量)。若需要有关 romdata 用法 (例如存储 器映射外设) 的更多信息,请参阅 MPASM™ User's Guide with MPLINK™ and
MPLIB™ (DS33014) 中的 MPLINK linker 部分。 udata 段包含静态分配到数据存储 器的未初始化全局数据。 idata 段包含静态分配到数据存储器的已初始化全局数据。
2-6 列出了下例中的每个对象位于哪个段中:
rom int ri; rom char rc = 'A';
int ui; char uc;
int ii = 0; char ic = 'A';
void foobar (void) { static rom int foobar_ri; static rom char foobar_rc = 'Z'; ... } void foo (void) { static int foo_ui; static char foo_uc; ... }
void bar (void) { static int bar_ii = 5; static char bar_ic = 'Z'; ... }
DS51288C_CN 22 2004 Microchip Technology Inc.
2-6 对象的段位置
对象 位置
ri romdata rc romdata foobar_ri romdata foobar_rc romdata ui udata uc udata foo_ui udata foo_uc udata ii idata ic idata bar_ii idata bar_ic idata foo code bar code foobar code
2.9.1.3 默认段
MPLAB C18 中,每种段类型都存在默认段 (见表 2-7 )。
语法说明
2-7 默认段名
段类型 默认名称
code .code_filename romdata .romdata_filename udata .udata_filename idata .idata_filename
注: filename 是所生成目标文件的名称。例如,
mcc18 foo.c -fo=foo.o 将生成一个目标文件,默认代码段名为.code_foo.o”。
指定一个先前声明过的段名将使 MPLAB C18 重新把相关类型的数据分配到指定的段。 段属性必须与先前的声明一致,否则会产生错误 (请参见附录 D.1“错误”。)
2004 Microchip Technology Inc. DS51288C_CN 23
MPLAB® C18 C 编译器用户指南
不带段名的段 pragma 伪指令把相关类型的数据分配到当前模块的默认段。例如:
/* * The following statement changes the current code * section to the absolute section high_vector */ #pragma code high_vector=0x08 ...
/* * The following statement returns to the default code * section */ #pragma code ...
MPLAB C18 编译器开始编译一个源文件时,初始化的数据和未初始化的数据都有默认 数据段。 这些默认段位于存取 RAM 或非存取 RAM,这取决于是否使用了-Oa+ 选项调
用编译器。仅当编译器工作在非扩展模式 (参见 1.2.5 节 “选择模式”)时才使 用-Oa+ 命令行选项。当在源代码中遇到一个 #pragma idata [access] name
指令时,当前未初始化数据段的名称就成为 name,它位于存取 RAM 或非存取 RAM, 这取决于是否指定了可选的 access 属性。对于当前已初始化数据段,当遇到一个
#pragma idata [access] name 伪指令时,与上述情况相同。 当对象定义中有显式的初始化时,对象被放入当前已初始化数据段中。当对象定义中
没有显式的初始化时,对象被放入当前未初始化数据段中。例如,在以下的代码片段 中, i 将放入当前已初始化数据段中,而 u 将被放在当前未初始化数据段中。
int i = 5; int u;
void main(void) { ... }
如果对象的定义有显式的 far 限定符 (参见 2.4 节 “存储限定符”),对象存放在非 存取存储区。类似地,显式的 near 限定符 (参见 2.4 节 “存储限定符”)告知编译
器对象位于存取存储区。如果对象的定义既没有 near 限定符也没有 far 限定符,则 编译器将查看是否在命令行中指定了-Oa+ 选项
DS51288C_CN 24 2004 Microchip Technology Inc.
Loading...
+ 90 hidden pages