MICROCHIP MPLAB C30 User Manual

MPLAB® C30
C 编译器
用户指南
2006 Microchip Technology Inc. DS51284E_CN
请注意以下有关 Microchip 器件代码保护功能的要点:
Microchip 的产品均达到 Microchip 数据手册中所述的技术指标。
Microchip 确信:在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一。
目前,仍存在着恶意、甚至是非法破坏代码保护功能的行为。就我们所知,所有这些行为都不是以 Microchip 数据手册中规定的 操作规范来使用 Microchip 产品的。这样做的人极可能侵犯了知识产权。
Microchip 愿与那些注重代码完整性的客户合作。
Microchip 或任何其他半导体厂商均无法保证其代码的安全性。代码保护并不意味着我们保证产品是 “牢不可破”的。
代码保护功能处于持续发展中。 Microchip 承诺将不断改进产品的代码保护功能。任何试图破坏 Microchip 代码保护功能的行为均可视 为违反了 《数字器件千年版权法案 (Digital Millennium Copyright Act)》。如果这种行为导致他人在未经授权的情况下,能访问您的 软件或其他受版权保护的成果,您有权依据该法案提起诉讼,从而制止这种行为。
提供本文档的中文版本仅为了便于理解。请勿忽视文档中包含 的英文部分,因为其中提供了有关 Microchip 产品性能和使用
情况的有用信息。Microchip Technology Inc. 及其分公司和相 关公司、各级主管与员工及事务代理机构对译文中可能存在的 任何差错不承担任何责任。建议参考 Microchip Technology Inc. 的英文原版文档。
本出版物中所述的器件应用信息及其他类似内容仅为您提供便 利,它们可能由更新之信息所替代。确保应用符合技术规范,
是您自身应负的责任。Microchip 对这些信息不作任何明示或 暗示、书面或口头、法定或其他形式的声明或担保,包括但不
限于针对其使用情况、质量、性能、适销性或特定用途的适用 性的声明或担保。 Microchip 对因这些信息及使用这些信息而
引起的后果不承担任何责任。如果将 Microchip 器件用于生命 维持和 / 或生命安全应用,一切风险由买方自负。买方同意在 由此引发任何一切伤害、索赔、诉讼或费用时,会维护和保障 Microchip 免于承担法律责任,并加以赔偿。在 Microchip 知识 产权保护下,不得暗中或以其他方式转让任何许可证。
商标
Microchip 的名称和徽标组合、 Microchip 徽标、 Accuron dsPIC、 K
EELOQ、 microID、 MPLAB、 PIC、 PICmicro、
PICSTARTPRO MATEPowerSmart、 rfPIC 和 SmartShunt 均为 Microchip Technology Inc. 在美国和其他国
家或地区的注册商标。
AmpLabFilterLabMigratable MemoryMXDEV MXLABSEEVALSmartSensor The Embedded Control Solutions Company 均为 Microchip Technology Inc.在美国的
注册商标。
Analog-for-the-Digital AgeApplication Maestro dsPICDEMdsPICDEM.netdsPICworksECAN ECONOMONITORFanSenseFlexROMfuzzyLAB In-Circuit Serial Programming、 ICSP、 ICEPIC、 Linear
Active Thermistor、 Mindi、 MiWi、 MPASM、 MPLIB、 MPLINKPICkitPICDEMPICDEM.netPICLAB PICtailPowerCalPowerInfoPowerMatePowerTool
REAL ICE、rfLAB、rfPICDEM、Select Mode、Smart Serial SmartTelTotal EnduranceUNI/OWiperLock ZENA
均为 Microchip Technology Inc. 在美国和其他国家或地区的商 标。
SQTP Microchip Technology Inc. 在美国的服务标记。
在此提及的所有其他商标均为各持有公司所有。
© 2006, Microchip Technology Inc.版权所有。
Microchip Gresham
晶圆生产厂均通过了 单片机、 存储器和模拟产品方面的质量体系流程均符合 外,
ISO 9001:2000
®
KEELOQ
Microchip
在开发系统的设计和生产方面的质量体系也已通过了
认证。
Chandler和Tem p e
ISO/TS-16949:2002
跳码器件、串行
Mountain View
认证。公司在
EEPROM
、位于俄勒冈州
的全球总部、设计中心和
、单片机外设、非易失性
ISO/TS-16949:2002
PICmicro
®
。此
8
DS51284E_CN ii 2006 Microchip Technology Inc.
MPLAB® C30
用户指南
目录
前言 ................................................................................................................................. 1
1 章 编译器概述
1.1 简介 ................................................................................................................ 7
1.2 主要内容 ......................................................................................................... 7
1.3 MPLAB C30 介绍 ............................................................................................ 7
1.4 MPLAB C30 及其他开发工具 .......................................................................... 7
1.5 MPLAB C30 的功能 ........................................................................................ 9
2 MPLAB C30 ANSI C 的差别
2.1 简介 .............................................................................................................. 11
2.2 主要内容 ....................................................................................................... 11
2.3 关键字差别 ................................................................................................... 11
2.4 语句差别 ....................................................................................................... 27
2.5 表达式差别 ................................................................................................... 28
3 章 使用 MPLAB C30 C 编译器
3.1 简介 .............................................................................................................. 29
3.2 主要内容 ....................................................................................................... 29
3.3 概述 .............................................................................................................. 29
3.4 文件命名约定 ................................................................................................ 30
3.5 选项 .............................................................................................................. 30
3.6 环境变量 ....................................................................................................... 55
3.7 预定义常量 ................................................................................................... 56
3.8 通过命令行编译单个文件 .............................................................................. 57
3.9 通过命令行编译多个文件 .............................................................................. 58
4 MPLAB C30 C 编译器运行时环境
4.1 简介 .............................................................................................................. 59
4.2 主要内容 ....................................................................................................... 59
4.3 地址空间 ....................................................................................................... 59
4.4 代码段和数据段 ............................................................................................ 61
4.5 启动和初始化 ................................................................................................ 63
4.6 存储空间 ....................................................................................................... 64
4.7 存储模型 ....................................................................................................... 65
4.8 定位代码和数据 ............................................................................................ 67
4.9 软件堆栈 ....................................................................................................... 68
4.10 C 堆栈使用 ................................................................................................. 69
4.11 C 堆使用 ..................................................................................................... 71
2006 Microchip Technology Inc. DS51284E_CN 第 iii
MPLAB® C30 用户指南
4.12 函数调用约定 .............................................................................................. 72
4.13 寄存器约定 ................................................................................................. 74
4.14 位反转寻址和模寻址 ................................................................................... 75
4.15 程序空间可视性 (PSV)的使用 ................................................................ 75
5 章 数据类型
5.1 简介 .............................................................................................................. 77
5.2 主要内容 ....................................................................................................... 77
5.3 数据表示 ....................................................................................................... 77
5.4 整型 .............................................................................................................. 77
5.5 浮点型 .......................................................................................................... 78
5.6 指针 .............................................................................................................. 78
6 章 器件支持文件
6.1 简介 .............................................................................................................. 79
6.2 主要内容 ....................................................................................................... 79
6.3 处理器头文件 ................................................................................................ 79
6.4 寄存器定义文件 ............................................................................................ 80
6.5 使用特殊功能寄存器 ..................................................................................... 81
6.6 使用宏 .......................................................................................................... 83
6.7 从 C 代码访问 EEDATA——仅适用于 dsPIC30F DSC ................................. 84
7 章 中断
7.1 简介 .............................................................................................................. 87
7.2 主要内容 ....................................................................................................... 87
7.3 编写中断服务程序 ........................................................................................ 88
7.4 写中断向量 ................................................................................................... 90
7.5 中断服务程序现场保护 ............................................................................... 100
7.6 中断响应时间 .............................................................................................. 100
7.7 中断嵌套 ..................................................................................................... 100
7.8 允许 / 禁止中断 ........................................................................................... 101
7.9 中断服务程序和一般代码共用存储空间 ...................................................... 102
8 章 汇编语言和 C 模块混合编程
8.1 简介 ............................................................................................................ 107
8.2 主要内容 ..................................................................................................... 107
8.3 在汇编语言中使用 C 变量和 C 函数 ............................................................ 107
8.4 使用行内汇编 .............................................................................................. 109
附录 A 实现定义的操作
A.1 简介 ............................................................................................................ 115
A.2 翻译 ............................................................................................................ 116
A.3 环境 ............................................................................................................ 116
A.4 标识符 ........................................................................................................ 117
A.5 字符 ............................................................................................................ 117
A.6 整型 ............................................................................................................ 118
A.7 浮点型 ........................................................................................................ 118
DS51284E_CNiv 2006 Microchip Technology Inc.
目录
A.8 数组和指针 ................................................................................................. 119
A.9 寄存器 ........................................................................................................ 119
A.10 结构、联合、枚举和位域 ......................................................................... 120
A.11 限定符 ...................................................................................................... 120
A.12 声明符 ...................................................................................................... 120
A.13 语句 .......................................................................................................... 120
A.14 预处理伪指令 ........................................................................................... 121
A.15 库函数 ...................................................................................................... 122
A.16 信号 .......................................................................................................... 123
A.17 流和文件 ................................................................................................... 123
A.18 tmpfile ...................................................................................................... 124
A.19 errno ......................................................................................................... 124
A.20 存储器 ...................................................................................................... 124
A.21 abort ......................................................................................................... 124
A.22 exit ........................................................................................................... 124
A.23 getenv ...................................................................................................... 125
A.24 系统 .......................................................................................................... 125
A.25 strerror ..................................................................................................... 125
附录 B MPLAB C30 C 编译器诊断
B.1 简介 ............................................................................................................ 127
B.2 错误 ............................................................................................................ 127
B.3 警告 ............................................................................................................ 146
附录 C MPLAB C18 MPLAB C30 C 编译器
C.1 简介 ............................................................................................................ 167
C.2 数据格式 .................................................................................................... 168
C.3 指针 ............................................................................................................ 168
C.4 存储类别 .................................................................................................... 168
C.5 堆栈使用 .................................................................................................... 168
C.6 存储限定符 ................................................................................................. 169
C.7 预定义宏名 ................................................................................................. 169
C.8 整型的提升 ................................................................................................. 169
C.9 字符串常量 ................................................................................................. 169
C.10 匿名结构 .................................................................................................. 170
C.11 快速存取存储区 ........................................................................................ 170
C.12 行内汇编 .................................................................................................. 170
C.13 Pragma 伪指令 ......................................................................................... 170
C.14 存储模型 .................................................................................................. 171
C.15 调用约定 .................................................................................................. 171
C.16 启动代码 .................................................................................................. 172
C.17 编译器管理的资源 .................................................................................... 172
C.18 优化 .......................................................................................................... 172
C.19 目标模块格式 ........................................................................................... 172
C.20 实现定义的操作 ........................................................................................ 172
C.21 位域 .......................................................................................................... 173
2006 Microchip Technology Inc. DS51284E_CN 第 v
MPLAB® C30 用户指南
附录 D 不赞成使用的特性
D.1 简介 ........................................................................................................... 175
D.2 主要内容 .................................................................................................... 175
D.3 预定义常量 ................................................................................................ 175
附录 E ASCII 字符集 附录 F GNU 自由文档许可证
术语表 ..........................................................................................................................185
索引 .............................................................................................................................193
全球销售及服务网点 ....................................................................................................202
DS51284E_CNvi 2006 Microchip Technology Inc.
MPLAB® C30
用户指南
前言
客户须知
所有文档均会过时,本文档也不例外。 Microchip 的工具和文档将不断演变以满足客户的需求,因此 实际使用中有些对话框和 / 或工具说明可能与本文档所述之内容有所不同。请访问我们的网站
www.microchip.com)获取最新文档。
文档均标记有 “DS”编号。该编号出现在每页底部的页码之前。 DS 编号的命名约定为
DSXXXXXA”,其中 “XXXXX”为文档编号,“A”为文档版本。
欲了解开发工具的最新信息,请参考 MPLAB
(主题),打开现有在线帮助文件列表。
简介
本文档的目的是帮助大家使用 Microchip 针对 dsPIC®数字信号控制器 (Digital Signal
ControllersDSC)的 MPLAB C30 C 编译器开发应用程序。MPLAB C30 是一款基于 GNU 编译器集 (GNU Compiler Collection, GCC)的语言工具,以来自 Free Software Foundation (FSF)的源代码为基础。关于 FSF 的信息可登陆网站 WWW.FSF.ORG
您还可从 Microchip 获得其他 GNU 语言工具:
• MPLAB ASM30 汇编器
• MPLAB LINK30 链接器
• MPLAB LIB30 库管理器 / 归档程序
本章涉及以下内容:
关于本指南
推荐读物
疑难解答
• Microchip 网站
开发系统变更通知客户服务
客户支持
®
IDE 在线帮助。从 Help (帮助)菜单选择 Topics
2006 Microchip Technology Inc. DS51284E_CN1
MPLAB® C30 用户指南
关于本指南
文档编排
本文档介绍如何使用 MPLAB C30 来开发固件。内容安排如下:
1 章: 编译器概述 介绍 MPLAB C30、开发工具和功能。
2 章: MPLAB C30 ANSI C 的区别 描述 MPLAB C30 语法支持的 C 语言和
标准 ANSI-89 C 之间的区别。
3 章: 使用 MPLAB C30 介绍怎样通过命令行使用 MPLAB C30
4 章: MPLAB C30 运行时环境 介绍 MPLAB C30 运行时模型,包括段信息、
初始化、存储器模式和软件堆栈等。
5 章: 数据类型 介绍 MPLAB C30 整型、浮点型和指针型数据类型。
6 章: 器件支持文件 介绍 MPLAB C30 的头文件和寄存器定义文件,以及怎样
使用特殊功能寄存器。
7 章: 中断 介绍怎样使用中断。
8 章: C 语言与汇编语言的混合编程 为使用 MPLAB C30 MPLAB ASM30
汇编语言模块提供指导。
附录 A:实现定义的操作 详细描述 ANSI 标准中描述为实现定义的、特定于 MPLAB C30 的参数。
附录 BMPLAB C30 诊断信息 列出由 MPLAB C30 产生的错误和警告消息。
附录 CMPLAB C18 MPLAB C30 的区别 介绍 PIC18XXXXX 编译器
MPLAB C18)和 dsPIC DSC 编译器 (MPLAB C30)的主要区别。
附录 D:不赞成使用的特性 详述视为过时的特性。
附录 EASCII 字符集 介绍 ASCII 字符集。
附录 FGNU 自由文档许可证 Free Software Foundation 的使用许可证。
DS51284E_CN2 2006 Microchip Technology Inc.
前言
本文档中使用的约定
本手册使用如下文档约定:
文档约定
说明 涵义 示例
Arial 字体: 斜体字 参考书目
需强调的文字 ...
首字母大写 窗口 Output 窗口
对话框 Settings 对话框
菜单选项 选择 Enable Programmer 引号 窗口或对话框中的字段名 Save project before build” 带右尖括号且有下划线的斜体文字菜单路径
粗体字 对话框按钮 单击 OK
选项卡 单击 Power 选项卡
‘bnnnn 尖括号 < > 括起的文字 键盘上的按键 <Enter> <F1>
Courier 字体: 常规 Courier New 源代码示例
斜体 Courier New 可变参数 file.o 其中 file 可以是任
0xnnnn
方括号 [ ] 可选参数
花括号和竖线: { | } 选择互斥参数; “或”选择 省略号 ... 代替重复文字
图标
二进制数, n 是一个数字
文件名
文件路径
关键字
命令行选项
位值
常数 0xFF, ‘A’
十六进制数, n 是一个十六进
制数字
仅完全版软件支持的功能。
MPLAB® IDE User's Guide
仅有
的编译器 ...
File>Save
‘b00100, ‘b10
#define START
autoexec.bat
c:\mcc18\h
_asm, _endasm, static
-Opa+, -Opa-
0, 1
一有效文件名 0xFFFF 0x007A
mcc18 [options] file [options]
errorlevel {0|1}
var_name [, var_name...]
并非所有的器件都支持此功
能。所支持器件将在标题或正
文中列出。
2006 Microchip Technology Inc. DS51284E_CN3
MPLAB® C30 用户指南
推荐读物
本文档介绍如何使用 MPLAB C30 编译器。下面列出了其他有用的文档。 Microchip 提 供了如下文档,推荐将这些文档作为补充参考资料。
README 文件 关于 Microchip 工具的最新信息,请阅读软件附带的相关 README 文件 (ASCII 文本
文件)。
®
dsPIC
指导安装和使用 Microchip dsPIC 数字信号控制器 (DSC)的语言工具 (MPLAB ASM30MPLAB LINK30 MPLAB C30)。还提供了使用 dsPIC DSC 软件模拟器 MPLAB SIM30 的示例。
MPLAB
指导使用 dsPIC DSC 汇编器、MPLAB ASM30dsPIC DSC 链接器、MPLAB LINK30 和各种 dsPIC DSC 实用程序,包括 MPLAB LIB30 归档程序 / 库管理器。
dsPIC30F Data Sheet General Purpose and Sensor Families DS70083) 这是 dsPIC30F 数字信号控制器 (DSC)的数据手册。总体介绍了器件及其架构。详
细介绍了存储器的构成、 DSP 操作和外设功能。还包括器件的电气参数。 dsPIC30F 系列参考手册 (DS70046D_CN) 该系列的参考指南,介绍了 dsPIC30F 系列 DSC 的架构和外设。 dsPIC30F/33F 程序员参考手册 (DS70157B_CNdsPIC30F/33F 器件的编程人员指南。包括编程模型和指令集。
C 标准信息
American National Standard for Information Systems – Programming Language – C.
DSC 语言工具入门 (DS70094C_CN
®
ASM30MPLAB LINK30 和实用程序用户指南 (DS51317D_CN
American National Standards Institute (ANSI), 11 West 42nd. Street, New York, New York, 10036.
此标准规定了用 C 语言编写程序的格式,并对 C 程序进行了解释。其目的是提高 C 程序在多种计算机系统上的可移植性、可靠性、可维护性及执行效率。
C 参考书籍
Harbison, Samuel P., and Steele, Guy L., C A Reference Manual,第四版,
Prentice-Hall, Englewood Cliffs, N.J. 07632.
Kernighan, Brian W., and Ritchie, Dennis M., The C Programming Language,第二
版。 Prentice Hall, Englewood Cliffs, N.J. 07632.
Kochan, Steven G., Programming In ANSI C,修订版。 Hayden Books, Indianapolis,
Indiana 46268.
Plauger, P.J., The Standard C Library, Prentice-Hall, Englewood Cliffs, N.J. 07632.
Van Sickle, Ted., Programming Microcontrollers in C,第一版。 LLH Technology
Publishing, Eagle Rock, Virginia 24085.
DS51284E_CN4 2006 Microchip Technology Inc.
疑难解答
在本文中找不到的常见问题信息可以查阅 README 文件。
MICROCHIP 网站
Microchip 网站 (www.microchip.com)为客户提供在线支持。客户可通过该网站方便 地获取文件和信息。只要使用常用的因特网浏览器即可访问。网站提供以下信息:
产品支持——数据手册和勘误表、应用笔记和样本程序、设计资源、用户指南以及 硬件支持文档、最新的软件版本以及存档软件
一般技术支持——常见问题 (FAQ)、技术支持请求、在线讨论组以及 Microchip 顾问计划成员名单
Microchip 业务——产品选型和订购指南、最新 Microchip 新闻稿、研讨会和活动安 排表、 Microchip 销售办事处、代理商以及工厂代表列表
开发系统变更通知客户服务
Microchip 的客户通知服务有助于客户了解 Microchip 产品的最新信息。注册客户可在 他们感兴趣的某个产品系列或开发工具发生变更、更新、发布新版本或勘误表时,收 到电子邮件通知。
欲注册,请登录 Microchip 网站 www.microchip.com,点击 “变更通知客户
Customer Change Notification)”服务并按照注册说明完成注册。
开发系统产品的分类如下:
编译器——Microchip C 编译器及其他语言工具的最新信息,包括 MPLAB C18 MPLAB C30 C 编译器、 MPASM MPLAB LINK30 目标链接器,以及 MPLIB
仿真器——Microchip 在线仿真器的最新信息,包括 MPLAB ICE 2000 MPLAB ICE 4000
在线调试器——Microchip 在线调试器 MPLAB ICD 2 的最新信息。
MPLAB MPLAB IDE 的最新信息,主要针对 MPLAB IDEMPLAB SIM 模拟器、 MPLAB IDE 项目管理器以及一般编辑和调试功能。
编程器——Microchip 编程器的最新信息,包括 MPLAB PM3 和 PRO MATE 编程器以及 PICSTART
®
前言
TM
MPLAB ASM30 汇编器、 MPLINKTM和
TM
MPLAB LIB30 目标库管理器。
IDE——关于支持开发系统工具的 Windows®集成开发环境 Microchip
®
®
Plus 和 PICkit® 1 开发编程器。
II 器件
2006 Microchip Technology Inc. DS51284E_CN 第 5
MPLAB® C30 用户指南
客户支持
Microchip 产品的用户可通过以下渠道获得帮助:
代理商或代表
当地销售办事处
应用工程师 (FAE
技术支持
客户应联系其代理商、代表或应用工程师 (FAE)寻求支持。当地销售办事处也可为 客户提供帮助。本文档后附有销售办事处的联系方式。
也可通过 http://support.microchip.com 获得网上技术支持。
DS51284E_CN6 2006 Microchip Technology Inc.

1.1 简介

1.2 主要内容

MPLAB® C30
用户指南

1 章 编译器概述

dsPIC®数字信号控制器 (DSC)系列将 DSP 应用所需的高性能和嵌入式应用所需的
标准单片机功能融合在一起。也可以将不带 DSP 功能的其他高性能单片机 (MCU) 用于其他应用。
所有这些器件得到了一套完整的软件开发工具的充分支持,包括一个优化的 C 编译 器、一个汇编器、一个链接器和一个归档程序 / 库管理器。
本章总体介绍了这些工具以及优化的 C 编译器的功能,包括 C 编译器如何与 MPLAB ASM30 汇编器和 MPLAB LINK30 链接器配合工作。汇编器和链接器在
ASM30
本章将介绍如下内容:
• MPLAB C30 介绍
• MPLAB C30 及其他开发工具
• MPLAB C30 的功能
MPLAB LINK30
和实用程序用户指南》
DS51317D_CN)中有详细介绍。
MPLAB®

1.3 MPLAB C30 介绍

MPLAB C30 是一个遵循 ANSI x3.159-1989 标准的优化 C 编译器,它包括针对 dsPIC DSC 嵌入式控制应用的语言扩展。这个编译器是基于 Windows
序,它为开发 C 代码提供了一个平台。它是来自 Free Software Foundation GCC 编译器。

1.4 MPLAB C30 及其他开发工具

MPLAB C30 C 源文件进行编译,生成汇编语言文件。由编译器生成的文件与其他 目标文件和库文件进行汇编和链接以产生最终的应用程序,应用程序格式为 COFF ELF 文件格式。 COFF ELF 文件可以载入 MPLAB IDE 中进行测试和调试,或使用 转换实用程序将 COFF ELF 文件转换为 Intel 器件编程器。图 1-1 概括了软件开发的数据流图。
®
操作系统的应用程
®
hex 格式,以便载入命令行模拟器或
2006 Microchip Technology Inc. DS51284E_CN 第 7
MPLAB® C30 用户指南

1-1 软件开发工具数据流图

C 源文件
*.c
C 编译器
源文件(*.s
编译器 驱动程序
汇编源文件
*.s
归档程序(库管理器)
目标文件库
*.a
汇编器
COFF/ELF 目标文件
*.o
链接器
可执行文件
*.exe
MPLAB IDE 调试工具
命令行
模拟器
DS51284E_CN8 2006 Microchip Technology Inc.

1.5 MPLAB C30 的功能

MPLAB C30 C 编译器是一个全功能的优化编译器,可将标准的 ANSI C 程序翻译为 dsPIC DSC 汇编语言源代码。同时它还支持许多命令行选项和语言扩展,可以对
dsPIC DSC 器件的硬件功能进行完全访问,以便更好地控制代码的生成。这一节介绍
了编译器的主要功能。

1.5.1 ANSI C 标准

MPLAB C30 编译器是一个完全经过验证的编译器,符合 ANSI C 标准,该标准由 ANSI 规范定义并在 Kernighan Ritchie C Programming Language (第二版)中
有详细说明。 ANSI 标准包括对原始 C 定义的扩展,这些扩展现在成为 C 语言的标准 功能。这些扩展增强了 C 语言的可移植性,同时增强了功能。

1.5.2 优化

编译器使用一套采用多种先进技术的高级优化,将 C 源代码编译为高效而紧凑的代 码。优化包括适用于所有 C 代码的高级优化,以及利用 dsPIC DSC 架构特征专门针对 dsPIC DSC 器件的优化。

1.5.3 ANSI 标准函数库支持

MPLAB C30 带有一个完整的 ANSI 标准函数库。所有这些库函数都经过验证并遵循 ANSI C 库标准。这个函数库包括字符串处理、动态存储器分配、数据转换、计时和数
学函数 (三角、指数和双曲线函数)。还包括用于文件处理的标准 I/O 函数,支持通 过命令行模拟器对主机文件系统进行完全的访问。同时还提供低级文件 I/O 函数的完 整功能性源代码,这可以作为需要这些功能的应用的一个起点。
编译器概述

1.5.4 灵活的存储器模型

编译器可同时支持大小两种代码和数据模型。小代码模型利用调用和分支指令的更有 效形式,而小数据模型支持使用压缩指令对 SFR 空间的数据进行访问。
编译器支持两种模型来访问常量。“constants in data”模型使用数据存储器,由运行 时库初始化。“constants in code”模型使用程序存储器,通过程序空间可视性
Program Space VisibilityPSV)窗口访问。

1.5.5 编译器驱动程序

MPLAB C30 包括一个强大的命令行驱动程序。通过这个驱动程序,应用程序的编译、 汇编和链接可以一步完成 (参见图 1-1)。
2006 Microchip Technology Inc. DS51284E_CN9
MPLAB® C30 用户指南
注:
DS51284E_CN10 2006 Microchip Technology Inc.

2 MPLAB C30 ANSI C 的差别

2.1 简介

2.2 主要内容

2.3 关键字差别

MPLAB® C30
用户指南
本章讨论 MPLAB C30 语法支持的 C 语言和 1989 年标准 ANSI C 之间的差别。
本章包括以下主要内容:
关键字差别
语句差别
表达式差别
本节说明 ANSI C MPLAB C30 所接受 C 在关键字方面的差别。新关键字是基本 GCC 实现的一部分,本节的讨论基于标准的 GCC 文档,选择 GCC MPLAB C30 部分
的特定语法和语义来讲述。
指定变量的属性
指定函数的属性
内联函数
指定寄存器中的变量
复数
双字整型
typeof 引用类型
2006 Microchip Technology Inc. DS51284E_CN 第 11
MPLAB® C30 用户指南

2.3.1 指定变量的属性

MPLAB C30 的关键字 _ _attribute__ 用来指定变量或结构位域的特殊属性。关键 字后的双括弧中的内容是属性说明。下面是目前支持的变量属性:
address (addr)
aligned (alignment)
deprecated
far
mode (mode)
near
noload
packed
persistent
reverse (alignment)
section ("section-name")
sfr (address)
space (space)
transparent_union
unordered
unused
weak
也可以通过在关键字前后使用 __ (双下划线)来指定属性 (例如,用 __aligned__ 代替 aligned)。这样将使你在头文件中使用它们时不必考虑会出现与
宏同名的情况。 要指定多个属性,可在双括弧内用逗号将属性分隔开,例如:
__attribute__ ((aligned (16), packed))。
注: 一个项目中对变量属性的使用要一致,这很重要。例如,如果在文件 A
far 属性定义了一个变量,在文件 B 中将其声明为 extern 而不带 far,就可能导致链接错误。
address (addr)
address 属性为变量指定绝对地址。这个属性不能与 section 属性同时使用; address 属性优先。带 address 属性的变量不能存放到 auto_psv 空间 (参见 space() 属性或 -mconst-in-code 选项);这样做会产生警告,且编译器将此变量
存放到 PSV 空间。 如果要将变量存放到 PSV 段,地址应为程序存储器地址。
int var __attribute__ ((address(0x800)));
DS51284E_CN12 2006 Microchip Technology Inc.
MPLAB C30 ANSI C 的差别
aligned (alignment)
该属性为变量指定最小的对齐方式,用字节表示。对齐方式必须是 2 的次幂。例如, 下面的声明:
int x __attribute__ ((aligned (16))) = 0;
使编译器按照 16 字节分配全局变量 x。对于 dsPIC DSC 器件,这可以与访问需要对 齐的 操作数的 DSP 指令和寻址模式的 asm 语句配合使用。
在前面的例子中,我们可以显式地指定我们希望编译器对给定变量使用的对齐方式
(用字节表示)。或者,我们可以省略对齐方式,而要求编译器为变量使用 dsPIC DSC
器件的最大有用对齐。例如,我们可以这样写:
short array[3] __attribute__ ((aligned));
当省略了对齐属性说明中的对齐方式时,编译器会自动将已声明变量的对齐方式设置 为目标单片机任何数据类型所使用的最大对齐方式。在 dsPIC DSC 器件中,为双字节
1 个字)。
aligned 属性只能增大对齐;但可以通过指定 packed 属性来减小对齐 (见下文)。 aligned 属性与 reverse 属性冲突,同时指定两者会产生错误。
deprecated
deprecated 属性使得包含这一属性的声明能被编译器特别识别到。当使用 deprecated 函数或变量时,编译器会发出警告。
deprecated 定义仍将被编译器执行,并被反映到目标文件中。例如,编译以下程序:
int __attribute__((__deprecated__)) i; int main() { return i; }
将产生警告:
deprecated.c:4: warning: `i' is deprecated (declared at deprecated.c:1)
在生成的目标文件中,仍以通常的方式定义了 i
far
far 属性告知编译器不必将变量分配到 near(前 8 KB)数据空间中(即变量可以分配 到数据存储器中的任何地址)。
2006 Microchip Technology Inc. DS51284E_CN13
MPLAB® C30 用户指南
mode (mode)
在变量声明中使用该属性来指定与模式 mode 对应的数据类型。实际上就是允许根据 变量的宽度指定整数或浮点数类型。 mode 的有效值见下表:
模式 宽度 MPLAB
QI 8 char HI 16 int SI 32 long
DI 64 long long SF 32 float DF 64 long double
这一属性对于编写可在所有 MPLAB C30 支持的目标单片机之间移植的代码很有用。 例如,如下函数将两个 32 位有符号整数相加,并返回一个 32 位有符号整数结果:
typedef int __attribute__((__mode__(SI))) int32; int32 add32(int32 a, int32 b) { return(a+b); }
可以指定 byte _ _byte_ _ 模式指明模式对应于单字节整数, word __word__ 模式对应于单字整数, pointer __pointer__ 模式用于表示指针。
®
C30 类型
near
near 属性告知编译器变量将变量分配到 near 数据空间(数据存储器的前 8 KB)。对这 种变量的访问有时比访问未分配 (或不知已分配)到 near 数据空间的变量效率高。
int num __attribute__ ((near));
noload
noload 属性指明应该为变量分配空间,但不应为变量装入初值。这一属性对于设计在 运行时将变量装入存储器 (如从串行 EEPROM)的应用程序可能有用。
int table1[50] __ attribute__ ((noload)) = { 0 };
DS51284E_CN14 2006 Microchip Technology Inc.
MPLAB C30 ANSI C 的差别
packed
packed 属性指定变量或结构位域采用最小的可能对齐方式 —— 变量占一个字节,位 域占一位,除非用 aligned 属性指定了一个更大的值。
下面的结构中位域 x 被压缩,所以它紧接在 a 之后:
struct foo { char a; int x[2] };
注: dsPIC 器件要求字按偶数字节对齐,因此在使用 packed 属性时要特别
persistent
persistent 属性指定在启动时变量不应被初始化或清零。具有 persistent 属性的 变量可用于存储器件复位后仍保持有效的状态信息。
int last_mode __attribute__ ((persistent));
reverse (alignment)
reverse 属性为变量的结束地址加 1 指定最小对齐。对齐以字节指定,必须是 2 的次 幂。反向对齐的变量可用于递减 dsPIC DSC 汇编语言中的模缓冲区。如果应用程序需 要在 C 中定义的变量可从汇编语言访问,这一属性可能有用。
int buf1[128] __attribute__ ((reverse(256)));
reverse属性与alignedsection属性冲突。试图为反向对齐的变量指定一个段将
被忽略,并发出警告。为同一个变量同时指定 reverse aligned 会产生错误。带 有 reverse 属性的变量不能存放到 auto_psv 空间 (参见 space 属性或
-mconst-in-code 选项);试图这样做将导致警告,且编译器会将变量存放到 PSV 空间。
__ attribute__ ((packed));
小心,避免运行时寻址错误。
section ("section-name")
默认情况下,编译器将其生成的目标代码存放在 .data .bss 段中。 section 属 性允许指定变量 (或函数)存放到特定的段中。
struct array {int i[32];} struct array buf
section 属性与 address reverse 属性冲突。在这两种冲突情形下,段名将被忽
略,并发出警告。这一属性还可能与 space 属性冲突。更多信息,参见关于 space 属性的说明。
__attribute__ ((section("userdata"))) = {0};
2006 Microchip Technology Inc. DS51284E_CN15
MPLAB® C30 用户指南
sfr (address)
sfr 属性告知编译器变量是一个特殊功能寄存器 (SFR),同时使用 address 参数指 定变量的运行时地址。
extern volatile int __attribute__ ((sfr(0x200)))u1mod;
为避免产生错误,需要使用 extern 说明符。
注: 按照约定,仅在处理器头文件中使用 sfr 属性。为将一个普通变量定义到
指定的地址,要使用 address 属性,且用 near far 来指定正确的寻 址模式。
space (space)
一般来说,编译器在一般数据空间内分配变量。可使用 space 属性来指示编译器将变 量分配到特定存储空间。关于存储空间的更多论述参见第 4.6 节 “存储空间”。 space 属性接受如下参数:
data
将变量分配到一般数据空间。可使用一般的 C 语句访问一般数据空间中的变量。 这是默认的分配。
xmemory ——仅适用于 dsPIC30F/33F DSC 将变量分配到 X 数据空间。 可使用一般的 C 语句访问 X 数据空间中的变量。
xmemory 空间分配举例如下:
int x[32] __attribute__ ((space(xmemory)));
ymemory——仅适用于 dsPIC30F/33F DSC 将变量分配到 Y 数据空间。 可使用一般的 C 语句访问 Y 数据空间中的变量。
ymemory 空间分配举例如下:
int y[32] __attribute__ ((space(ymemory)));
prog
将变量分配到程序空间中为可执行代码指定的段。程序空间中的变量不能使用一 般的 C 语句访问,这些变量必须由编程人员显式访问,通常通过表访问行内汇 编指令,或使用程序空间可视性窗口访问。
auto_psv
将变量分配到程序空间中为自动程序空间可视性窗口访问指定的编译器管理段。 auto_psv 空间中的变量可使用一般的 C 语句来读 (但不能写),且变量的分配 空间最大为 32K 。当指定 space(auto_psv) 时,不能使用 section 属性指 定段名;任何段名将被忽略并产生警告。 auto_psv 空间中的变量不能存放到 特定地址或反对齐。
注: 在启动时分配到 auto_psv 段中的变量不装入数据存储器。这一属性
对于减少 RAM 使用可能有用。
DS51284E_CN16 2006 Microchip Technology Inc.
MPLAB C30 ANSI C 的差别
dma——仅适用于 PIC24H MCU dsPIC33F DSC 将变量分配到 DMA 存储区。可以通过一般的 C 语句和 DMA 外设访问 DMA
储区中的变量。可使用 __
库》
DS51456B_CN))来得到用于配置 DMA 外设的正确偏移量。
psv
将变量分配到程序空间中为程序空间可视性窗口访问指定的段。链接器将定位 段,因此可以通过 PSVPAG 寄存器的设置来访问整个变量。 PSV 空间中的变量 不是由编译器管理的,不能使用一般的 C 语句访问。这些变量必须由编程人员 显式访问,通常使用表访问行内汇编指令,或使用程序空间可视性窗口访问。
eedata——仅适用于 dsPIC30F DSC 将变量分配到 EEData 空间。 EEData 空间中的变量不能使用一般的 C 语句访
问。这些变量必须由编程人员显式访问,通常使用表访问行内汇编指令,或使用 程序空间可视性窗口访问。
transparent_union
这是属于 union 型函数参数的属性,即相应的参数可以是任何联合成员的类型,但以 第一个联合成员的类型传递参数。使用 transparent 联合的第一个成员的调用约定将参 数传递给函数,而不是使用联合本身的调用约定。联合的所有成员必须具有相同的机 器码表示,这对于保证参数传递正常进行是必需的。
builtin_dmaoffset() (参见
dsPIC
®
语言工具
unordered
unordered 属性表明变量存放的地址可以相对于所在 C 源文件中其他变量的位置而改 变。
const int __attribute__ ((unordered)) i;
unused
这一变量属性表明变量可能不被使用。 MPLAB C30 不会为这种变量产生未使用变量 警告。
weak
weak 属性声明 weak 符号。weak 符号可能被全局定义取代。当对外部符号的引用使用 weak 时,则链接时不需要该符号。例如:
extern int __attribute__((__weak__)) s; int foo() { if (&s) return s; return 0; /* possibly some other value */ }
在上面的程序中,如果 s 没有被其他模块定义,程序仍会链接,但不会给 s 分配地 址。若条件验证 s 已被定义,就返回它的值 (如果它有值的话)。否则将返回 “0” 值。这个特征很有用,主要用于提供与任意库链接的通用代码。
2006 Microchip Technology Inc. DS51284E_CN17
MPLAB® C30 用户指南
weak 属性可以应用于函数和变量:
extern int __attribute__((__weak__)) compress_data(void *buf); int process(void *buf) { if (compress_data) { if (compress_data(buf) == -1) /* error */ } /* process buf */ }
在上述代码中,函数 compress_data 只有在与其他模块链接时才使用。是否使用该 特性是由链接时决定的,而不是由编译时决定的。
weak 属性对定义的影响更为复杂,需要多个文件加以说明:
/* weak1.c */ int
void foo() {
i = 1; }
/* weak2.c */ int i;
extern void foo(void);
void bar() { i = 2; }
__attribute__((__weak__)) i;
main() { foo(); bar(); }
weak2.c 中对 i 的定义使符号成为强定义。链接时不会出现错误,两个 i 指向同 一个存储位置。为 weak1.c 中的 i 分配存储空间,但这个空间不可访问。
不能保证两个程序里的 i 具有相同的类型,如果将 weak2.c 中的 i 改为 float 型, 仍然允许链接,但是函数 foo 的操作将无法预料。 foo 将向 32 位浮点值的最低有效 部分写入一个值。相反,在 weak1.c 中把 i weak 定义改为 float 型,将导致灾 难性结果。这样会把一个 32 位的浮点值写到 16 位的整型地址中,覆盖掉紧接 i 之后 存储的任何变量。
在只存在 weak 定义的情况下,链接器才选择为第一个这种定义分配存储空间。其他 定义是不可访问的。
无论符号属于什么类型,操作是相同的;函数和变量具有相同的操作。
DS51284E_CN18 2006 Microchip Technology Inc.
MPLAB C30 ANSI C 的差别

2.3.2 指定函数的属性

MPLAB C30 中,可以对程序中调用的函数进行某些声明,帮助编译器优化函数调 用,且更准确地检查代码。
关键字 _attribute_ 允许在声明时指定特殊的属性。关键字后面紧跟双括弧中的属 性说明。目前支持函数的下列属性:
address (addr)
alias ("target")
const
deprecated
far
format (archetype, string-index, first-to-check)
format_arg (string-index)
• interrupt [ ( [ save(list) ] [, irq(irqid) ] [, altirq(altir­qid)] [, preprologue(asm) ] ) ]
near
no_instrument_function
noload
noreturn
section ("section-name")
shadow
unused
weak
我们也可以通过在关键字前后使用 __ (双下划线)来指定属性 (例如,用 __shadow __ 代替 shadow)。这样使得在头文件中使用它们时不必考虑会出现与宏
同名的情况。 我们要想在声明中指定多个属性,可以在双括弧内使用逗号将属性分隔开,或者在一
个属性声明后紧跟另一个属性声明。
address (addr)
address 属性为函数指定绝对地址。这个属性不能与 section 属性同时使用; address 属性优先。
void foo() __attribute__ ((address(0x100))) { ... }
alias ("target")
alias 属性为另一个符号声明一个别名,必须指定这个符号。
使用这一属性会产生对对象的外部引用,必须在链接时解析该引用。
2006 Microchip Technology Inc. DS51284E_CN19
MPLAB® C30 用户指南
const
许多函数除了检查自身的参数外不会检查任何其他值,只会影响其返回值。可像算术 运算符一样,对这种函数进行公共子表达式删除和循环优化。这些函数应该用属性
const 来声明。例如:
int square (int) __attribute__ ((const int));
也就是说,上述假设的 square 函数的实际被调用次数即使比程序指定的次数少一些 也是安全的。
应该注意,如果函数有指针参数,且检查指针指向的数据,那么这种函数一定不能用 const 声明。同样,调用非 const 函数的函数通常也不能声明为 const。具 有 void 回值类型的 const 函数没有什么意义。
deprecated
关于 deprecated 属性的信息,请参阅第 2.3.1 节 “指定变量的属性”
far
far 属性告知编译器不应该用更有效的调用指令形式来调用该函数。
format (archetype, string-index, first-to-check)
format 属性指定一个函数具有 printfscanf 或 strftime 类型参数,要割据格式 字符串检查这些参数的类型。例如,考虑以下声明:
extern int my_printf (void *my_object, const char *my_format, ...) __attribute__ ((format (printf, 2, 3)));
以上语句使编译器检查对 my_printf 调用中的参数,确定是否与 printf 类型的格 式字符串参数 my_format 一致。
参数 archetype 确定如何解释格式字符串,应该为 printfscanf strftime 之一。参数 string-index 指定哪个参数是格式字符串参数 (参数从左至右编号, 从 1 开始), first-to-check 指定根据格式字符串检查的第一个参数的编号。对于 不能检查参数的函数 (如 vprintf),指定第三个参数为 0。这种情况下,编译器仅 检查格式字符串的一致性。
在上面的例子中,格式字符串 (my_format)是函数 my_print 的第二个参数,从 第三个参数开始检查,所以 format 属性的正确参数是 2 3
format 属性允许识别以格式字符串作为参数的用户自定义函数,所以 MPLAB C30 以检查对这些函数的调用有无错误。每当要求这种警告 (使用 -Wformat)时,编译 器总会检查 ANSI 库函数 printffprintfsprintfscanffscanfsscanfstrftimevprintfvfprintf vsprintf 的格式,所以不必修改 头文件 stdio.h
DS51284E_CN20 2006 Microchip Technology Inc.
MPLAB C30 ANSI C 的差别
format_arg (string-index)
format_arg 属性指定一个函数具有 printf 或者 scanf 类型的参数,修改这个函 数 (如将它翻译为另外一种语言),并把函数的结果传递给 printf scanf 类型的 函数。例如,考虑以下声明:
extern char * my_dgettext (char *my_domain, const char *my_format)
上述语句使编译器检查对函数 my_dgettext 的调用中的参数,该函数的结果传递给 printfscanf strftime 类型函数,确定是否与 printf 类型的格式字符串参
my_format 一致。 参数 string-index 指定哪个参数是格式字符串参数 (从 1 开始)。 format-arg 属性允许识别修改格式字符串的用户定义函数,所以 MPLAB C30 可以
检查对 printfscanf strftime 函数的调用,这些函数的操作数是对用户定义 函数的调用。
interrupt [ ( [ save(list) ] [, irq(irqid) ] [, altirq(altirqid)] [, preprologue(asm) ] ) ]
使用这个选项来指明指定的函数是中断服务程序。当指定这个属性时,编译器将生成适 用于中断服务程序的函数 prologue epilogue 序列。可选的参数 save 指定函数 prologueepilogue中分别保存和恢复的变量列表。可选参数 irq和altirq指定要使用 的中断向量表 ID。可选参数 preprologue 指定要在编译器生成的 prologue 代码前生 成的汇编代码。完整的说明和示例,请参阅第 7 章“中断”。
__attribute__ ((format_arg (2)));
near
near 属性告知编译器可以使用 call 指令的更有效形式调用函数。
no_instrument_function
如果指定命令行选项 -finstrument-functions,那么几乎所有用户函数的入口和 出口处在编译时都会被插入 profiling 函数。而函数被指定此选项时将不执行上述操作。
noload
noload 属性指明应该为函数分配空间,但不应把实际代码装入存储器。如果应用程序 设计为在运行时将函数装入存储器 (如从 EEPROM),这一属性很有用。
void bar() __attribute__ ((noload)) { ... }
2006 Microchip Technology Inc. DS51284E_CN21
MPLAB® C30 用户指南
noreturn
一些标准库函数是不能返回的,例如 abort exitMPLAB C30 自动清楚这种情 况。有些程序自定义了不会返回的函数,我们可以将这些函数声明为 noreturn 来告 知编译器这种情况。
void fatal (int i) __attribute__ ((noreturn));
void fatal (int i) { /* Print error message. */ exit (1); }
noreturn 关键字告知编译器 fatal 不会返回。这可以优化代码,而不必考虑如果 fatal 返回会怎样。这可以在某种程度上优化代码。而且这样有助于避免未初始化变
量的假警告。 对于 noreturn 函数,非 void 的返回值类型并没有什么意义。
section ("section-name")
通常,编译器将生成的代码存放在 .text 段中。但有时可能需要其他的段,或者需要 将某些函数存放在特殊的段中。 Section 属性指定将一个函数存放在特定的段中。例 如下面的声明:
extern void foobar (void) __attribute__ ((section (".libtext")));
上述语句将函数 foobar 存放在 .libtext 段中。 section 属性与 address 属性有冲突。忽略段名会导致警告。
shadow
shadow 属性使编译器使用影子寄存器而不是软件堆栈来保存寄存器。该属性通常与 interrupt 属性同时使用。
void __attribute__ ((interrupt, shadow)) _T1Interrupt (void)
unused
这个函数属性,表明函数可能不会被使用。 MPLAB C30 不会为这种函数发出未使用函 数的警告。
weak
关于 weak 属性,参见第 2.3.1 节 “指定变量的属性”。
DS51284E_CN22 2006 Microchip Technology Inc.
MPLAB C30 ANSI C 的差别

2.3.3 内联函数

通过声明一个函数为 inline,可以指示 MPLAB C30 将这个函数的代码集成到调用函 数的代码中。通常这样可避免函数调用的开销,使代码执行速度更快。另外,若任何 实际的参数值为常数,它们的已知值可允许在编译时进行简化,这样不用包含所有的 内联函数代码。对代码量的影响是不容易预估的。使用内联函数,机器代码量视具体 情况可能更大也有可能更小。
注: 仅当函数定义可见 (不只是有函数原型)时,才能使用函数内联。为将一
个函数内联到多个源文件中,可将函数定义放在每个源文件包含的头文件 中。
为将函数声明为内联,在其声明中使用 inline 关键字,例如:
inline int inc (int *a) { (*a)++; }
(如果使用 -traditional 选项或 -ansi 选项,用 _inline_ 代替 inline。)还
可以通过使用命令行选项 -finline-functions 将所有 “足够简单”的函数内联。 编译器可以根据对函数大小的估计,直观地决定哪些函数足够简单,可以这样集成。
注: 仅当使能 -finline 或优化时才识别 inline 关键字。
函数定义中的某些用法可能使函数不适合于内联替代。这些用法包括:varargs 的使 用、 alloca 的使用,长度可变数据的使用,以及相对 goto 和非局部 goto 的使用。 如果使用了命令行选项 -winline,当标识为 inline 的函数不能被替代时,会发出 警告,并给出失败原因。
MPLAB C30 语法中,关键字 inline 不会影响函数的链接。 当一个函数同时为 inline static 时,如果对该函数的所有调用都集成到调用函
数中,且从不使用该函数的地址,那么该函数自身的汇编程序代码从不会被引用。在 这种情况下, MPLAB C30 实际上并不输出该函数的汇编代码,除非指定命令行选项
-fkeep-inline-functions。有些调用由于各种原因不能被集成 (特别是在函数
定义之前的调用不能被集成,定义内的递归调用也不能被集成)。如果存在非集成的调 用,那么会以通常方式将函数编译成汇编代码。如果程序引用函数的地址,也必须以 通常的方式编译函数,因为它不能被内联。仅在内联函数被声明为 static,且函数 定义在函数使用之前的情况下,编译器才会删除内联函数。
inline 函数不是 static 时,编译器必须假定其他源文件可能调用这个函数。因 为全局符号只能在所有程序中定义一次,不能在其他源文件中定义该函数,所以其他 源文件中的调用不能被集成。因此,非 static 的内联函数总是以通常的方式编译。
2006 Microchip Technology Inc. DS51284E_CN23
MPLAB® C30 用户指南
如果我们在函数定义中同时指定 inline extern,这样定义的函数就只能用来内 联。不能以通常的方式编译函数,即使显式地引用其地址。这种地址变成了一个外部 引用,如同我们只是声明了函数却没有定义它。
同时使用 inline extern 对于宏有类似的影响。使用这些关键字将一个函数的定 义放在头文件中,并且将定义的另外一份拷贝 (不带 inline extern)放在库文 件中。头文件中的定义使得对于该函数的大多数调用被内联。如果还有任何使用该函 数的地方,将引用库文件中的拷贝。

2.3.4 指定寄存器中的变量

MPLAB C30 允许把几个全局变量存放到指定的硬件寄存器中。
注: 使用太多的寄存器,尤其是寄存器 W0,可能影响 MPLAB C30 的编译能
力。
我们也可以指定在其中存放普通寄存器变量的寄存器。
全局寄存器变量在整个程序执行过程中保留寄存器的值。这在程序中可能很有用, 如编程语言解释程序,带有几个经常被访问的全局变量。
特定寄存器中的局部寄存器变量并不保留寄存器的值。编译器的数据流分析可以确 定何时指定寄存器包含有效的值,何时可将指定寄存器用于其他用途。局部寄存器 变量不使用时其中存储的值可被删除。对局部寄存器变量的引用可以被删除、移动 或简化。
如果要将汇编指令的一个输出直接写到某个特定的寄存器,这些局部变量有时便于扩 展行内汇编使用 (参见第 8 章 “汇编语言和 C 模块混合编程”)。(只要指定的寄存 器符合为行内汇编语句中的操作数指定的约束就可以。)
2.3.4.1 定义全局寄存器变量
MPLAB C30 中,可通过以下语句来定义一个全局寄存器变量:
register int *foo asm ("w8");
其中, w8 是要使用的寄存器名。选择一个可被函数调用正常保存和恢复的寄存器
W8-W13),这样库函数就不会破坏它的值。
将一个全局寄存器变量定义到某个寄存器中,可完全保留该寄存器的值,至少在当前 的编译中。在当前的编译中,寄存器不会被分配给函数中的任何其他用途。寄存器不 会被这些函数保存和恢复。即使该寄存器的内容不被使用,也不会被删除,但是对该 寄存器的引用可被删除、移动或简化。
从信号处理程序或者从多个控制线程访问全局寄存器变量是不安全的,因为系统库函 数可能临时使用寄存器做别的工作 (除非你特别为待处理任务重新编译它们)。
同样不安全的是,使用一个全局寄存器变量的函数,通过函数 lose 来调用另外一个 这样的函数 foo,而编译函数 lose 时未知该全局变量 (即在未声明该变量的源文件 中)。这是因为 lose 可能会将其他某个值保存到该寄存器中。例如,不能在比较函数 中使用传递给 qsort 的全局寄存器变量,因为 qsort 可能已经把其他值存放到该寄 存器中了。用相同的全局寄存器变量定义来重新编译 qsort,可以避免此问题。
DS51284E_CN24 2006 Microchip Technology Inc.
Loading...
+ 178 hidden pages