51284E.book

Size: px
Start display at page:

Download "51284E.book"

Transcription

1 MPLAB C30 C 编译器用户指南 2006 Microchip Technology Inc. DS51284E_CN

2 请注意以下有关 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 KEELOQ microid MPLAB PIC PICmicro PICSTART PRO MATE PowerSmart rfpic 和 SmartShunt 均为 Microchip Technology Inc. 在美国和其他国家或地区的注册商标 AmpLab FilterLab Migratable Memory MXDEV MXLAB SEEVAL SmartSensor 和 The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的注册商标 Analog-for-the-Digital Age Application Maestro dspicdem dspicdem.net dspicworks ECAN ECONOMONITOR FanSense FlexROM fuzzylab In-Circuit Serial Programming ICSP ICEPIC Linear Active Thermistor Mindi MiWi MPASM MPLIB MPLINK PICkit PICDEM PICDEM.net PICLAB PICtail PowerCal PowerInfo PowerMate PowerTool REAL ICE rflab rfpicdem Select Mode Smart Serial SmartTel Total Endurance UNI/O WiperLock 和 ZENA 均为 Microchip Technology Inc. 在美国和其他国家或地区的商标 SQTP 是 Microchip Technology Inc. 在美国的服务标记 在此提及的所有其他商标均为各持有公司所有 2006, Microchip Technology Inc. 版权所有 Microchip 位于美国亚利桑那州 Chandler 和 Tempe 位于俄勒冈州 Gresham 及位于加利福尼亚州 Mountain View 的全球总部 设计中心和晶圆生产厂均通过了 ISO/TS-16949:2002 认证 公司在 PICmicro 8 位单片机 KEELOQ 跳码器件 串行 EEPROM 单片机外设 非易失性存储器和模拟产品方面的质量体系流程均符合 ISO/TS-16949:2002 此外, Microchip 在开发系统的设计和生产方面的质量体系也已通过了 ISO 9001:2000 认证 DS51284E_CN 第 ii 页 2006 Microchip Technology Inc.

3 MPLAB C30 用户指南 目录 前言... 1 第 1 章编译器概述 1.1 简介 主要内容 MPLAB C30 介绍 MPLAB C30 及其他开发工具 MPLAB C30 的功能... 9 第 2 章 MPLAB C30 与 ANSI C 的差别 2.1 简介 主要内容 关键字差别 语句差别 表达式差别 第 3 章使用 MPLAB C30 C 编译器 3.1 简介 主要内容 概述 文件命名约定 选项 环境变量 预定义常量 通过命令行编译单个文件 通过命令行编译多个文件 第 4 章 MPLAB C30 C 编译器运行时环境 4.1 简介 主要内容 地址空间 代码段和数据段 启动和初始化 存储空间 存储模型 定位代码和数据 软件堆栈 C 堆栈使用 C 堆使用 Microchip Technology Inc. DS51284E_CN 第 iii 页

4 MPLAB C30 用户指南 4.12 函数调用约定 寄存器约定 位反转寻址和模寻址 程序空间可视性 (PSV) 的使用 第 5 章数据类型 5.1 简介 主要内容 数据表示 整型 浮点型 指针 第 6 章器件支持文件 6.1 简介 主要内容 处理器头文件 寄存器定义文件 使用特殊功能寄存器 使用宏 从 C 代码访问 EEDATA 仅适用于 dspic30f DSC 第 7 章中断 7.1 简介 主要内容 编写中断服务程序 写中断向量 中断服务程序现场保护 中断响应时间 中断嵌套 允许 / 禁止中断 中断服务程序和一般代码共用存储空间 第 8 章汇编语言和 C 模块混合编程 8.1 简介 主要内容 在汇编语言中使用 C 变量和 C 函数 使用行内汇编 附录 A 实现定义的操作 A.1 简介 A.2 翻译 A.3 环境 A.4 标识符 A.5 字符 A.6 整型 A.7 浮点型 DS51284E_CN 第 iv 页 2006 Microchip Technology Inc.

5 目录 A.8 数组和指针 A.9 寄存器 A.10 结构 联合 枚举和位域 A.11 限定符 A.12 声明符 A.13 语句 A.14 预处理伪指令 A.15 库函数 A.16 信号 A.17 流和文件 A.18 tmpfile A.19 errno A.20 存储器 A.21 abort A.22 exit A.23 getenv A.24 系统 A.25 strerror 附录 B MPLAB C30 C 编译器诊断 B.1 简介 B.2 错误 B.3 警告 附录 C MPLAB C18 与 MPLAB C30 C 编译器 C.1 简介 C.2 数据格式 C.3 指针 C.4 存储类别 C.5 堆栈使用 C.6 存储限定符 C.7 预定义宏名 C.8 整型的提升 C.9 字符串常量 C.10 匿名结构 C.11 快速存取存储区 C.12 行内汇编 C.13 Pragma 伪指令 C.14 存储模型 C.15 调用约定 C.16 启动代码 C.17 编译器管理的资源 C.18 优化 C.19 目标模块格式 C.20 实现定义的操作 C.21 位域 Microchip Technology Inc. DS51284E_CN 第 v 页

6 MPLAB C30 用户指南 附录 D 不赞成使用的特性 D.1 简介 D.2 主要内容 D.3 预定义常量 附录 E ASCII 字符集附录 F GNU 自由文档许可证术语表 索引 全球销售及服务网点 DS51284E_CN 第 vi 页 2006 Microchip Technology Inc.

7 MPLAB C30 用户指南 前言 客户须知 所有文档均会过时, 本文档也不例外 Microchip 的工具和文档将不断演变以满足客户的需求, 因此实际使用中有些对话框和 / 或工具说明可能与本文档所述之内容有所不同 请访问我们的网站 ( 获取最新文档 文档均标记有 DS 编号 该编号出现在每页底部的页码之前 DS 编号的命名约定为 DSXXXXXA, 其中 XXXXX 为文档编号, A 为文档版本 欲了解开发工具的最新信息, 请参考 MPLAB IDE 在线帮助 从 Help ( 帮助 ) 菜单选择 Topics ( 主题 ), 打开现有在线帮助文件列表 简介 本文档的目的是帮助大家使用 Microchip 针对 dspic 数字信号控制器 (Digital Signal Controllers,DSC) 的 MPLAB C30 C 编译器开发应用程序 MPLAB C30 是一款基于 GNU 编译器集 (GNU Compiler Collection, GCC) 的语言工具, 以来自 Free Software Foundation (FSF) 的源代码为基础 关于 FSF 的信息可登陆网站 您还可从 Microchip 获得其他 GNU 语言工具 : MPLAB ASM30 汇编器 MPLAB LINK30 链接器 MPLAB LIB30 库管理器 / 归档程序本章涉及以下内容 : 关于本指南 推荐读物 疑难解答 Microchip 网站 开发系统变更通知客户服务 客户支持 2006 Microchip Technology Inc. DS51284E_CN 第 1 页

8 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 的参数 附录 B:MPLAB C30 诊断信息 列出由 MPLAB C30 产生的错误和警告消息 附录 C:MPLAB C18 和 MPLAB C30 的区别 介绍 PIC18XXXXX 编译器 (MPLAB C18) 和 dspic DSC 编译器 (MPLAB C30) 的主要区别 附录 D: 不赞成使用的特性 详述视为过时的特性 附录 E:ASCII 字符集 介绍 ASCII 字符集 附录 F:GNU 自由文档许可证 Free Software Foundation 的使用许可证 DS51284E_CN 第 2 页 2006 Microchip Technology Inc.

9 前言 本文档中使用的约定 本手册使用如下文档约定 : 文档约定 说明 涵义 示例 Arial 字体 : 斜体字 参考书目 MPLAB IDE User's Guide 需强调的文字... 仅有的编译器... 首字母大写 窗口 Output 窗口 对话框 Settings 对话框 菜单选项 选择 Enable Programmer 引号 窗口或对话框中的字段名 Save project before build 带右尖括号且有下划线的斜体 菜单路径 File>Save 文字 粗体字 对话框按钮 单击 OK 选项卡 单击 Power 选项卡 bnnnn 二进制数, n 是一个数字 b00100, b10 尖括号 < > 括起的文字 键盘上的按键 按 <Enter>, <F1> Courier 字体 : 常规 Courier New 源代码示例 #define START 文件名 autoexec.bat 文件路径 c:\mcc18\h 关键字 _asm, _endasm, static 命令行选项 -Opa+, -Opa- 位值 0, 1 常数 0xFF, A 斜体 Courier New 可变参数 file.o, 其中 file 可以是任一有效文件名 0xnnnn 十六进制数, n 是一个十六进 0xFFFF,0x007A 制数字 方括号 [ ] 可选参数 mcc18 [options] file [options] 花括号和竖线 :{ } 选择互斥参数 ; 或 选择 errorlevel {0 1} 省略号... 代替重复文字 var_name [, var_name...] 图标 仅完全版软件支持的功能 并非所有的器件都支持此功能 所支持器件将在标题或正文中列出 2006 Microchip Technology Inc. DS51284E_CN 第 3 页

10 MPLAB C30 用户指南 推荐读物 本文档介绍如何使用 MPLAB C30 编译器 下面列出了其他有用的文档 Microchip 提供了如下文档, 推荐将这些文档作为补充参考资料 README 文件关于 Microchip 工具的最新信息, 请阅读软件附带的相关 README 文件 (ASCII 文本文件 ) dspic DSC 语言工具入门 (DS70094C_CN) 指导安装和使用 Microchip dspic 数字信号控制器 (DSC) 的语言工具 (MPLAB ASM30 MPLAB LINK30 和 MPLAB C30) 还提供了使用 dspic DSC 软件模拟器 MPLAB SIM30 的示例 MPLAB ASM30 MPLAB LINK30 和实用程序用户指南 (DS51317D_CN) 指导使用 dspic DSC 汇编器 MPLAB ASM30 dspic 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_CN) dspic30f/33f 器件的编程人员指南 包括编程模型和指令集 C 标准信息 American National Standard for Information Systems Programming Language C. American National Standards Institute (ANSI), 11 West 42nd. Street, New York, New York, 此标准规定了用 C 语言编写程序的格式, 并对 C 程序进行了解释 其目的是提高 C 程序在多种计算机系统上的可移植性 可靠性 可维护性及执行效率 C 参考书籍 Harbison, Samuel P., and Steele, Guy L., C A Reference Manual, 第四版, Prentice-Hall, Englewood Cliffs, N.J Kernighan, Brian W., and Ritchie, Dennis M., The C Programming Language, 第二版 Prentice Hall, Englewood Cliffs, N.J Kochan, Steven G., Programming In ANSI C, 修订版 Hayden Books, Indianapolis, Indiana Plauger, P.J., The Standard C Library, Prentice-Hall, Englewood Cliffs, N.J Van Sickle, Ted., Programming Microcontrollers in C, 第一版 LLH Technology Publishing, Eagle Rock, Virginia DS51284E_CN 第 4 页 2006 Microchip Technology Inc.

11 前言 疑难解答 MICROCHIP 网站 开发系统变更通知客户服务 在本文中找不到的常见问题信息可以查阅 README 文件 Microchip 网站 ( 为客户提供在线支持 客户可通过该网站方便地获取文件和信息 只要使用常用的因特网浏览器即可访问 网站提供以下信息 : 产品支持 数据手册和勘误表 应用笔记和样本程序 设计资源 用户指南以及硬件支持文档 最新的软件版本以及存档软件 一般技术支持 常见问题 (FAQ) 技术支持请求 在线讨论组以及 Microchip 顾问计划成员名单 Microchip 业务 产品选型和订购指南 最新 Microchip 新闻稿 研讨会和活动安排表 Microchip 销售办事处 代理商以及工厂代表列表 Microchip 的客户通知服务有助于客户了解 Microchip 产品的最新信息 注册客户可在他们感兴趣的某个产品系列或开发工具发生变更 更新 发布新版本或勘误表时, 收到电子邮件通知 欲注册, 请登录 Microchip 网站 点击 变更通知客户 (Customer Change Notification) 服务并按照注册说明完成注册 开发系统产品的分类如下 : 编译器 Microchip C 编译器及其他语言工具的最新信息, 包括 MPLAB C18 和 MPLAB C30 C 编译器 MPASM TM 和 MPLAB ASM30 汇编器 MPLINK TM 和 MPLAB LINK30 目标链接器, 以及 MPLIB TM 和 MPLAB LIB30 目标库管理器 仿真器 Microchip 在线仿真器的最新信息, 包括 MPLAB ICE 2000 和 MPLAB ICE 4000 在线调试器 Microchip 在线调试器 MPLAB ICD 2 的最新信息 MPLAB IDE 关于支持开发系统工具的 Windows 集成开发环境 Microchip MPLAB IDE 的最新信息, 主要针对 MPLAB IDE MPLAB SIM 模拟器 MPLAB IDE 项目管理器以及一般编辑和调试功能 编程器 Microchip 编程器的最新信息, 包括 MPLAB PM3 和 PRO MATE II 器件编程器以及 PICSTART Plus 和 PICkit 1 开发编程器 2006 Microchip Technology Inc. DS51284E_CN 第 5 页

12 MPLAB C30 用户指南 客户支持 Microchip 产品的用户可通过以下渠道获得帮助 : 代理商或代表 当地销售办事处 应用工程师 (FAE) 技术支持客户应联系其代理商 代表或应用工程师 (FAE) 寻求支持 当地销售办事处也可为客户提供帮助 本文档后附有销售办事处的联系方式 也可通过 获得网上技术支持 DS51284E_CN 第 6 页 2006 Microchip Technology Inc.

13 MPLAB C30 用户指南 第 1 章编译器概述 1.1 简介 1.2 主要内容 dspic 数字信号控制器 (DSC) 系列将 DSP 应用所需的高性能和嵌入式应用所需的标准单片机功能融合在一起 也可以将不带 DSP 功能的其他高性能单片机 (MCU) 用于其他应用 所有这些器件得到了一套完整的软件开发工具的充分支持, 包括一个优化的 C 编译器 一个汇编器 一个链接器和一个归档程序 / 库管理器 本章总体介绍了这些工具以及优化的 C 编译器的功能, 包括 C 编译器如何与 MPLAB ASM30 汇编器和 MPLAB LINK30 链接器配合工作 汇编器和链接器在 MPLAB ASM30 MPLAB LINK30 和实用程序用户指南 (DS51317D_CN) 中有详细介绍 本章将介绍如下内容 : MPLAB C30 介绍 MPLAB C30 及其他开发工具 MPLAB C30 的功能 1.3 MPLAB C30 介绍 MPLAB C30 是一个遵循 ANSI x 标准的优化 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 hex 格式, 以便载入命令行模拟器或器件编程器 图 1-1 概括了软件开发的数据流图 2006 Microchip Technology Inc. DS51284E_CN 第 7 页

14 MPLAB C30 用户指南 图 1-1: 软件开发工具数据流图 C 源文件 (*.c) C 编译器 编译器驱动程序 源文件 (*.s) 汇编源文件 (*.s) 汇编器 归档程序 ( 库管理器 ) COFF/ELF 目标文件 (*.o) 目标文件库 (*.a) 链接器 可执行文件 (*.exe) MPLAB IDE 调试工具命令行模拟器 DS51284E_CN 第 8 页 2006 Microchip Technology Inc.

15 编译器概述 1.5 MPLAB C30 的功能 MPLAB C30 C 编译器是一个全功能的优化编译器, 可将标准的 ANSI C 程序翻译为 dspic DSC 汇编语言源代码 同时它还支持许多命令行选项和语言扩展, 可以对 dspic DSC 器件的硬件功能进行完全访问, 以便更好地控制代码的生成 这一节介绍了编译器的主要功能 ANSI C 标准 MPLAB C30 编译器是一个完全经过验证的编译器, 符合 ANSI C 标准, 该标准由 ANSI 规范定义并在 Kernighan 和 Ritchie 的 C Programming Language ( 第二版 ) 中有详细说明 ANSI 标准包括对原始 C 定义的扩展, 这些扩展现在成为 C 语言的标准功能 这些扩展增强了 C 语言的可移植性, 同时增强了功能 优化 编译器使用一套采用多种先进技术的高级优化, 将 C 源代码编译为高效而紧凑的代码 优化包括适用于所有 C 代码的高级优化, 以及利用 dspic DSC 架构特征专门针对 dspic DSC 器件的优化 ANSI 标准函数库支持 MPLAB C30 带有一个完整的 ANSI 标准函数库 所有这些库函数都经过验证并遵循 ANSI C 库标准 这个函数库包括字符串处理 动态存储器分配 数据转换 计时和数学函数 ( 三角 指数和双曲线函数 ) 还包括用于文件处理的标准 I/O 函数, 支持通过命令行模拟器对主机文件系统进行完全的访问 同时还提供低级文件 I/O 函数的完整功能性源代码, 这可以作为需要这些功能的应用的一个起点 灵活的存储器模型 编译器可同时支持大小两种代码和数据模型 小代码模型利用调用和分支指令的更有效形式, 而小数据模型支持使用压缩指令对 SFR 空间的数据进行访问 编译器支持两种模型来访问常量 constants in data 模型使用数据存储器, 由运行时库初始化 constants in code 模型使用程序存储器, 通过程序空间可视性 (Program Space Visibility, PSV) 窗口访问 编译器驱动程序 MPLAB C30 包括一个强大的命令行驱动程序 通过这个驱动程序, 应用程序的编译 汇编和链接可以一步完成 ( 参见图 1-1) 2006 Microchip Technology Inc. DS51284E_CN 第 9 页

16 MPLAB C30 用户指南 注 : DS51284E_CN 第 10 页 2006 Microchip Technology Inc.

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

18 MPLAB C30 用户指南 指定变量的属性 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_CN 第 12 页 2006 Microchip Technology Inc.

19 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_CN 第 13 页

20 MPLAB C30 用户指南 mode (mode) 在变量声明中使用该属性来指定与模式 mode 对应的数据类型 实际上就是允许根据变量的宽度指定整数或浮点数类型 mode 的有效值见下表 : 这一属性对于编写可在所有 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 模式用于表示指针 near near 属性告知编译器变量将变量分配到 near 数据空间 ( 数据存储器的前 8 KB) 对这种变量的访问有时比访问未分配 ( 或不知已分配 ) 到 near 数据空间的变量效率高 int num attribute ((near)); noload 模式 宽度 MPLAB C30 类型 QI 8 位 char HI 16 位 int SI 32 位 long DI 64 位 long long SF 32 位 float DF 64 位 long double noload 属性指明应该为变量分配空间, 但不应为变量装入初值 这一属性对于设计在运行时将变量装入存储器 ( 如从串行 EEPROM) 的应用程序可能有用 int table1[50] attribute ((noload)) = { 0 }; DS51284E_CN 第 14 页 2006 Microchip Technology Inc.

21 MPLAB C30 与 ANSI C 的差别 packed packed 属性指定变量或结构位域采用最小的可能对齐方式 变量占一个字节, 位域占一位, 除非用 aligned 属性指定了一个更大的值 下面的结构中位域 x 被压缩, 所以它紧接在 a 之后 : struct foo { char a; int x[2] attribute ((packed)); }; 注 : 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 属性与 aligned 和 section 属性冲突 试图为反向对齐的变量指定一个段将被忽略, 并发出警告 为同一个变量同时指定 reverse 和 aligned 会产生错误 带有 reverse 属性的变量不能存放到 auto_psv 空间 ( 参见 space 属性或 -mconst-in-code 选项 ); 试图这样做将导致警告, 且编译器会将变量存放到 PSV 空间 section ("section-name") 默认情况下, 编译器将其生成的目标代码存放在.data 和.bss 段中 section 属性允许指定变量 ( 或函数 ) 存放到特定的段中 struct array {int i[32];} struct array buf attribute ((section("userdata"))) = {0}; section 属性与 address 和 reverse 属性冲突 在这两种冲突情形下, 段名将被忽略, 并发出警告 这一属性还可能与 space 属性冲突 更多信息, 参见关于 space 属性的说明 2006 Microchip Technology Inc. DS51284E_CN 第 15 页

22 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_CN 第 16 页 2006 Microchip Technology Inc.

23 MPLAB C30 与 ANSI C 的差别 dma 仅适用于 PIC24H MCU 和 dspic33f DSC 将变量分配到 DMA 存储区 可以通过一般的 C 语句和 DMA 外设访问 DMA 存储区中的变量 可使用 builtin_dmaoffset() ( 参见 dspic 语言工具库 (DS51456B_CN)) 来得到用于配置 DMA 外设的正确偏移量 psv 将变量分配到程序空间中为程序空间可视性窗口访问指定的段 链接器将定位段, 因此可以通过 PSVPAG 寄存器的设置来访问整个变量 PSV 空间中的变量不是由编译器管理的, 不能使用一般的 C 语句访问 这些变量必须由编程人员显式访问, 通常使用表访问行内汇编指令, 或使用程序空间可视性窗口访问 eedata 仅适用于 dspic30f DSC 将变量分配到 EEData 空间 EEData 空间中的变量不能使用一般的 C 语句访问 这些变量必须由编程人员显式访问, 通常使用表访问行内汇编指令, 或使用程序空间可视性窗口访问 transparent_union 这是属于 union 型函数参数的属性, 即相应的参数可以是任何联合成员的类型, 但以第一个联合成员的类型传递参数 使用 transparent 联合的第一个成员的调用约定将参数传递给函数, 而不是使用联合本身的调用约定 联合的所有成员必须具有相同的机器码表示, 这对于保证参数传递正常进行是必需的 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_CN 第 17 页

24 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 attribute (( weak )) i; void foo() { } i = 1; /* weak2.c */ int i; extern void foo(void); void bar() { i = 2; } 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_CN 第 18 页 2006 Microchip Technology Inc.

25 MPLAB C30 与 ANSI C 的差别 指定函数的属性 在 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(altirqid)] [, 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_CN 第 19 页

26 MPLAB C30 用户指南 const 许多函数除了检查自身的参数外不会检查任何其他值, 只会影响其返回值 可像算术运算符一样, 对这种函数进行公共子表达式删除和循环优化 这些函数应该用属性 const 来声明 例如 : int square (int) attribute ((const int)); 也就是说, 上述假设的 square 函数的实际被调用次数即使比程序指定的次数少一些也是安全的 应该注意, 如果函数有指针参数, 且检查指针指向的数据, 那么这种函数一定不能用 const 声明 同样, 调用非 const 函数的函数通常也不能声明为 const 具有 void 返回值类型的 const 函数没有什么意义 deprecated 关于 deprecated 属性的信息, 请参阅第 节 指定变量的属性 far far 属性告知编译器不应该用更有效的调用指令形式来调用该函数 format (archetype, string-index, first-to-check) format 属性指定一个函数具有 printf scanf 或 strftime 类型参数, 要割据格式字符串检查这些参数的类型 例如, 考虑以下声明 : extern int my_printf (void *my_object, const char *my_format,...) attribute ((format (printf, 2, 3))); 以上语句使编译器检查对 my_printf 调用中的参数, 确定是否与 printf 类型的格式字符串参数 my_format 一致 参数 archetype 确定如何解释格式字符串, 应该为 printf scanf 或 strftime 之一 参数 string-index 指定哪个参数是格式字符串参数 ( 参数从左至右编号, 从 1 开始 ), first-to-check 指定根据格式字符串检查的第一个参数的编号 对于不能检查参数的函数 ( 如 vprintf), 指定第三个参数为 0 这种情况下, 编译器仅检查格式字符串的一致性 在上面的例子中, 格式字符串 (my_format) 是函数 my_print 的第二个参数, 从第三个参数开始检查, 所以 format 属性的正确参数是 2 和 3 format 属性允许识别以格式字符串作为参数的用户自定义函数, 所以 MPLAB C30 可以检查对这些函数的调用有无错误 每当要求这种警告 ( 使用 -Wformat) 时, 编译器总会检查 ANSI 库函数 printf fprintf sprintf scanf fscanf sscanf strftime vprintf vfprintf 和 vsprintf 的格式, 所以不必修改头文件 stdio.h DS51284E_CN 第 20 页 2006 Microchip Technology Inc.

27 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) attribute ((format_arg (2))); 上述语句使编译器检查对函数 my_dgettext 的调用中的参数, 该函数的结果传递给 printf scanf 或 strftime 类型函数, 确定是否与 printf 类型的格式字符串参数 my_format 一致 参数 string-index 指定哪个参数是格式字符串参数 ( 从 1 开始 ) format-arg 属性允许识别修改格式字符串的用户定义函数, 所以 MPLAB C30 可以检查对 printf scanf 或 strftime 函数的调用, 这些函数的操作数是对用户定义函数的调用 interrupt [ ( [ save(list) ] [, irq(irqid) ] [, altirq(altirqid)] [, preprologue(asm) ] ) ] 使用这个选项来指明指定的函数是中断服务程序 当指定这个属性时, 编译器将生成适用于中断服务程序的函数 prologue 和 epilogue 序列 可选的参数 save 指定函数 prologue 和 epilogue 中分别保存和恢复的变量列表 可选参数 irq 和 altirq 指定要使用的中断向量表 ID 可选参数 preprologue 指定要在编译器生成的 prologue 代码前生成的汇编代码 完整的说明和示例, 请参阅第 7 章 中断 near near 属性告知编译器可以使用 call 指令的更有效形式调用函数 no_instrument_function 如果指定命令行选项 -finstrument-functions, 那么几乎所有用户函数的入口和出口处在编译时都会被插入 profiling 函数 而函数被指定此选项时将不执行上述操作 noload noload 属性指明应该为函数分配空间, 但不应把实际代码装入存储器 如果应用程序设计为在运行时将函数装入存储器 ( 如从 EEPROM), 这一属性很有用 void bar() attribute ((noload)) {... } 2006 Microchip Technology Inc. DS51284E_CN 第 21 页

28 MPLAB C30 用户指南 noreturn 一些标准库函数是不能返回的, 例如 abort 和 exit MPLAB 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 属性, 参见第 节 指定变量的属性 DS51284E_CN 第 22 页 2006 Microchip Technology Inc.

29 MPLAB C30 与 ANSI C 的差别 内联函数 通过声明一个函数为 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_CN 第 23 页

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

31 MPLAB C30 与 ANSI C 的差别 如果想重新编译实际上没有使用该全局寄存器变量的 qsort 或其他源文件, 因此这些源文件不会将该寄存器用于其他用途, 那么指定编译器命令行选项 -ffixed-reg 就足够了 这种情况下实际上不需要在其源代码中加一个全局寄存器声明 一个函数若可能改变一个全局寄存器变量的值, 它就不能安全地被不保存和恢复该变量编译的函数调用, 因为这可能破坏调用函数返回时期望找到的值 因此, 若一个程序片段使用了全局寄存器变量, 作为该程序片段入口的函数必须显式地保存和恢复属于其调用函数的值 库函数 longjmp 将恢复每个全局寄存器变量在 setjmp 时的值 所有全局寄存器变量的声明必须在所有函数定义之前 如果这种声明在函数定义之后, 寄存器可能被声明之前的函数用于其他用途 全局寄存器变量不能有初值, 因为可执行文件不能为一个寄存器提供初值 为局部变量指定寄存器可以通过以下语句用一个指定的寄存器定义局部寄存器变量 : register int *foo asm ("w8"); 其中, w8 是使用的寄存器名 应该注意这与定义全局寄存器变量的语法相同, 但是对于局部变量, 这种定义应该出现在一个函数中 定义这种寄存器不保留寄存器的值, 流控制确定变量的值无效时, 其他用途仍可使用这种寄存器 使用这一功能, 可能使编译某些函数时可用寄存器太少 该选项并不能保证 MPLAB C30 生成的代码始终将这一变量存放在指定的寄存器中 不可以在 asm 语句中, 编写对该寄存器的显式引用, 并假定它总是引用这个变量 局部寄存器变量不使用时其分配可被删除 对局部寄存器变量的引用可以被删除 移动或简化 复数 MPLAB C30 支持复数数据类型 我们可以用关键字 complex 来声明整型复数和浮点型复数 例如, complex float x; 定义 x 为实部和虚部都是浮点型的变量 complex short int y; 定义 y 的实部和虚部都是 short int 型的 要写一个复数数据类型的常量, 使用后缀 i 或 j ( 两者之一, 两者是等同的 ) 例如, 2.5fi 是 complex float 型的, 3i 是 complex int 型的 这种常量只有虚部值, 但是我们可以通过将其与实常数相加来形成任何复数值 2006 Microchip Technology Inc. DS51284E_CN 第 25 页

32 MPLAB C30 用户指南 要提取复数值符号 exp 的实部, 写 real exp 类似地, 用 imag 来提取虚部 例如 : complex float z; float r; float i; r = real z; i = imag z; 当对复数型值使用算子 ~ 时, 执行复数的共扼 MPLAB C30 可以采用非邻近的方式分配复数自动变量, 甚至可以将实部分配到寄存器中, 而将虚部分配到堆栈中, 反之亦然 调试信息格式无法表示这种非邻近的分配, 所以 MPLAB C30 把非邻近的复数变量描述为两个独立的非复数类型变量 如果实际变量名是 foo, 那么两个假设变量命名为 foo$real 和 foo$imag 双字整型 MPLAB C30 支持长度为 long int 两倍的整型数据类型 对于有符号整型, 写 long long int, 而对于无符号整型, 使用 unsigned long long int 可以通过在整型上添加后缀 LL 得到 long long int 类型的整型常量, 在整数上添加后缀 ULL 得到 unsigned long long int 类型的整型常量 可以在算术运算中像使用其他整型一样使用这些类型 这些数据类型的加 减和位逻辑布尔运算是开放源代码的, 但是, 这些数据类型的除法与移位不是开放源代码的 这些不开放源代码的运算要使用 MPLAB C30 自带的特殊库函数 用 typeof 引用类型 引用表达式类型的另一种方法是使用 typeof 关键字 使用这个关键字的语法与 sizeof 相似, 但是其结构在语义上类似于用 typedef 定义的类型名 有两种方法写 typeof 的参数 : 使用表达式或者使用类型 以下为使用表达式的例子 : typeof (x[0](1)) 这里假设 x 是函数数组, 描述的类型就是函数值的类型 以下为使用类型名作为参数的例子 : typeof (int *) 这里, 描述的类型是指向 int 的指针 如果写一个包含在 ANSI C 程序中时必须有效的头文件, 要使用 typeof, 而不要使用 typeof DS51284E_CN 第 26 页 2006 Microchip Technology Inc.

33 MPLAB C30 与 ANSI C 的差别 typeof 结构可用于可使用 typedef 名的任何地方 例如, 可以在声明和强制类型转换中, 或者 sizeof 或 typeof 的内部使用它 用 x 指向的类型声明 y: typeof (*x) y; 将 y 声明为这种值的数组 : typeof (*x) y[4]; 将 y 声明为指向字符的指针数组 : typeof (typeof (char *)[4]) y; 它等同于如下的传统 C 声明 : char *y[4]; 为了弄清楚 typeof 声明的含义, 以及为什么是有用的方法, 我们用以下宏改写它 : #define pointer(t) typeof(t *) #define array(t, N) typeof(t [N]) 现在声明可以这样改写 : array (pointer (char), 4) y; 这样, array (pointer (char), 4) 是指向 char 的四个指针的数组类型 2.4 语句差别 本节讲述普通 ANSI C 与 MPLAB C30 所接受 C 之间的语句差别 语句差别是基本 GCC 实现的一部分, 本节讨论的内容基于标准 GCC 文档, 选择了 GCC 中 MPLAB C30 部分的特定语法和语义来讲述 将标号作为值 省略操作数的条件表达式 case 范围 将标号作为值 可以用单目运算符 && 获得在当前函数 ( 或包含函数 ) 中定义的标号的地址 值的类型为 void * 这个值为常量, 并可在这种类型的常量有效的任何地方使用这个值 例如 : void *ptr;... ptr = &&foo; 为使用这些值, 需要能跳转到值 这通过计算 goto 语句 goto *exp; 来实现 例如 : goto *ptr; 可使用 void * 类型的任何表达式 这些常量的一个用途是用于初始化用作跳转表的静态数组 : static void *array[] = { &&foo, &&bar, &&hack }; 然后就可以通过索引来这样选择标号 : goto *array[i]; 注 : 这并不检查下标是否超出范围 (C 中的数组索引从不这样做 ) 2006 Microchip Technology Inc. DS51284E_CN 第 27 页

34 MPLAB C30 用户指南 2.5 表达式差别 这种标号值数组的用途与 switch 语句很类似 switch 语句更整齐, 比数组更好 标号值的另外一个用途是在线程代码的解释程序中 解释程序函数中的标号可存储在线程代码中用于快速调度 这种机制可能被错误使用, 而跳转到其他函数的代码中 编译器不能阻止这种现象的发生, 因此必须小心, 确保目标地址对于当前函数有效 省略操作数的条件表达式 条件表达式的中间操作数可以被省略 如果第一个操作数非零, 它的值就是条件表达式的值 因此, 对于表达式 : x? : y 如果 x 的值非零, 表达式的值就是 x 的值 ; 否则, 就是 y 的值 这个例子完全等价于 : x? x : y 在这个简单的例子中, 省略中间操作数并不是特别有用 当第一个操作数存在或者可能存在 ( 如果它是一个宏参数 ) 副作用时, 省略中间操作数就变得特别有用 那么重复中间操作数将产生副作用两次 省略中间操作数使用了已经计算过的值, 而不会因为重新计算而产生不希望的影响 case 范围 可以如下在单个 case 标号中指定一个连续值的范围 : case low... high: 这与各个 case 标号的适当数字有相同的作用, 每个数字对应从 low 到 high 中的每个整数值 这一功能对于 ASCII 字符码范围特别有用 : case 'A'... 'Z': 注意 : 在... 两边要写空格, 否则它和整数一起使用时可能出现解析错误 例如要这样写 : case : 而不要这样写 : case 1...5: 本节讨论普通 ANSI C 和 MPLAB C30 所接受的 C 之间的表达式差别 二进制常量 前面有 0b 或 0B 的一串二进制数字 ( 数字 0 后跟字母 b 或 B ) 视为二进制整型 二进制数字由数字 0 和 1 组成 例如, 十进制数字 255 可用二进制表示为 0b 像其他整型常量一样, 二进制常量可以以字母 u 或 U 为后缀来指定为无符号型 二进制常量也可以以字母 l 或 L 为后缀, 指定为长整型 类似地, 后缀 ll 或 LL 表示双字整型的二进制常量 DS51284E_CN 第 28 页 2006 Microchip Technology Inc.

35 第 3 章使用 MPLAB C30 C 编译器 MPLAB C30 用户指南 3.1 简介 本章讨论通过命令行使用 MPLAB C30 C 编译器 关于在 MPLAB IDE 中使用 MPLAB C30 的信息, 请参阅 dspic DSC 语言工具入门 (DS70094C_CN) 3.2 主要内容 本章介绍以下内容 : 概述 文件命名约定 选项 环境变量 预定义常量 通过命令行编译单个文件 通过命令行编译多个文件 3.3 概述 编译驱动程序 (pic30-gcc) 对 C 和汇编语言模块及库文件进行编译 汇编和链接 大多数编译器命令行选项对于 GCC 工具集的所有实现都是通用的 只有少数是专门针对 MPLAB C30 编译器的 编译器命令行的基本形式如下 : pic30-gcc [options] files 注 : 命令行选项和文件扩展名要区分大小写 在第 3.5 节 选项 中对可用的选项进行了描述 例如, 下面的命令行编译 汇编和链接 C 源文件 hello.c, 生成可执行文件 hello.exe pic30-gcc -o hello.exe hello.c 2006 Microchip Technology Inc. DS51284E_CN 第 29 页

36 MPLAB C30 用户指南 3.4 文件命名约定 3.5 选项 编译驱动程序识别如下文件扩展名, 文件扩展名要区分大小写 表 3-1: 文件名 扩展名 定义 file.c 必须预处理的 C 源文件 file.h 头文件 ( 不对其进行编译或链接 ) file.i 不应预处理的源文件 file.o 目标文件 file.p 预过程抽象汇编语言文件 file.s 汇编代码 file.s 必须预处理的汇编代码 其他 要传递给链接器的文件 MPLAB C30 提供了许多控制编译的选项, 它们都是区分大小写的 针对 dspic DSC 器件的选项 控制输出类型的选项 控制 C 语言的选项 警告与错误控制选项 调试选项 控制优化的选项 控制预处理器的选项 汇编选项 链接选项 目录搜索选项 代码生成约定选项 DS51284E_CN 第 30 页 2006 Microchip Technology Inc.

37 使用 MPLAB C30 C 编译器 针对 dspic DSC 器件的选项 关于存储模型的更多信息, 请参阅第 4.7 节 存储模型 表 3-2: 针对 dspic DSC 器件的选项 选项 -mconst-in-code -mconst-in-data -merrata= id[,id]* -mlarge-code -mlarge-data -mcpu= <it>target -mpa (1) -mpa=n (1) -mno-pa (1) 定义 将常量存放在 auto_psv 空间中 编译器将使用 PSV 窗口访问这些变量 ( 这是默认设置 ) 将常量存放到数据存储空间中 此选项使能特定的勘误变通解决方案 (errata workaround), 由 id 标识 id 的有效值时常改变, 对于某个特定的器件可能不需要 list 的 id 将列出目前支持的勘误表标识符以及对勘误表的简单描述 all 的 id 将使能所有目前支持的勘误变通解决方案 使用大代码模型编译 对于被调用函数是局部函数还是全局函数不做假设 选择这个选项时, 大于 32k 的单个函数是不支持的, 这样的函数可能导致汇编时错误, 因为函数内部的所有分支都是短跳转形式. 使用大代码模型编译 不假定静态变量和外部变量的位置 此选项选择具体的目标器件 ( 且如果要进行这一处理的话, 将目标器件选择信息传递给汇编器和链接器 ) 这个选项会对某些预定义常量的设置产生影响, 更多信息参见第 3.7 节 预定义常量 可在本编译器发布版本附带的 README.TXT 中找到所接受目标器件的完整列表 使能过程抽象优化 对嵌套深度没有限制 允许过程抽象优化达到 n 级 如果 n 为 0, 那么禁止优化 如果 n 为 1, 允许一级抽象 ; 也就是说, 源代码中的指令序列可以抽象为子程序 如果 n 为 2, 允许二级抽象 ; 也就是说, 在一级抽象中包含在子程序中的指令可以抽象为更深一级的子程序 对于更大的 n 值, 继续依此类推 实际上是为了将子程序调用嵌套的深度限制为最大值 n 不允许过程抽象优化 ( 这是默认设置 ) 注 1: 过程抽象的操作与内联函数相反 这一过程设计为通过翻译单元从多处抽取相同的代码序列, 并存放到一个公共代码区 尽管这个选项一般并不会提高所生成代码的运行时性能, 却可以显著减小代码长度 采用 -mpa 编译的程序可能难以调试 ; 在使用 COFF 目标格式调试时, 不推荐使用这个选项 过程抽象是生成汇编文件后, 一个独立的编译阶段 这个阶段不跨翻译单元优化 当使能过程优化阶段时, 行内汇编代码仅限于有效的机器指令 不能使用无效的机器指令或指令序列, 或汇编伪指令 ( 段伪指令 宏和包含文件等 ), 否则过程抽象阶段会失败, 影响输出文件的生成 2006 Microchip Technology Inc. DS51284E_CN 第 31 页

38 MPLAB C30 用户指南 表 3-2: 针对 dspic DSC 器件的选项 ( 续 ) -mno-isr-warn -momf=omf -msmall-code -msmall-data -msmall-scalar -mtext=name -msmart-io [=0 1 2] 注 选项 定义 默认情况下, 如果在识别到的中断向量名后没有加 interrupt, 编译器将产生警告 此选项将禁止这个功能 选择编译器使用的 OMF ( 目标模块格式 ) omf 说明符可以为下列之一 : coff 生成 COFF 目标文件 ( 这是默认设置 ) elf 生成 ELF 目标文件 ELF 目标文件使用的调试格式为 DWARF 2.0 使用小代码模型编译 假定被调用函数在调用函数的 32K 字内 ( 这是默认设置 ) 使用小数据模型编译 假定所有静态变量和外部变量位于数据存储空间的低 8KB 地址 ( 这是默认设置 ) 与 -msmall-data 类似, 不同的是仅假定静态标量和外部标量位于数据存储空间的低 8KB 地址 ( 这是默认设置 ) 指定 -mtext=name 将文本 ( 程序代码 ) 放入名为 name 的段中, 而不是默认的.text 段中 等号两边不能有空格 该选项试图对传递给 printf 和 scanf 函数, 以及这两个函数 f 和 v 形式的格式字符串进行静态分析 非浮点型参数的使用将转换成使用仅支持整型的库函数形式 -msmart-io=0 将禁止这个选项, 而 -msmart-io=2 将使编译器转换带有变量或未知格式参数的函数调用 默认情况下 -msmart-io=1, 将仅转换它能验证的立即数值 1: 过程抽象的操作与内联函数相反 这一过程设计为通过翻译单元从多处抽取相同的代码序列, 并存放到一个公共代码区 尽管这个选项一般并不会提高所生成代码的运行时性能, 却可以显著减小代码长度 采用 -mpa 编译的程序可能难以调试 ; 在使用 COFF 目标格式调试时, 不推荐使用这个选项 过程抽象是生成汇编文件后, 一个独立的编译阶段 这个阶段不跨翻译单元优化 当使能过程优化阶段时, 行内汇编代码仅限于有效的机器指令 不能使用无效的机器指令或指令序列, 或汇编伪指令 ( 段伪指令 宏和包含文件等 ), 否则过程抽象阶段会失败, 影响输出文件的生成 DS51284E_CN 第 32 页 2006 Microchip Technology Inc.

39 使用 MPLAB C30 C 编译器 控制输出类型的选项 表 3-3: 输出类型控制选项 选项 定义 -c 编译或汇编源文件, 但不链接 默认的文件扩展名为.o -E 在预处理过程之后, 即正常运行编译器之前停止 默认输出文件为 stdout -o file 将输出放在 file 中 -S 在正常编译之后, 即调用汇编器之前停止 默认输出文件扩展名为.s -v 在编译的每个阶段打印执行的命令 -x 可用 -x 选项显式地指定输入语言 : -x language 为后面的输入文件显式地指定语言 ( 而不是让编译器根据文件名后缀选择默认的语言 ) 这个选项适用于其后直到下一个 -x 选项之前的所有输入文件 MPLAB C30 支持下面的值 : c c-header cpp-output assembler assembler-with-cpp -x none 关闭所有语言指定, 随后的文件按其文件名后缀处理 如果已使用另一个 -x 选项, 这是默认但必需的 例如 : pic30-gcc -x assembler foo.asm bar.asm -x none main.c mabonga.s --help 没有 -x none 时, 编译器将假定所有输入文件都为汇编语言 打印命令行选项的描述 2006 Microchip Technology Inc. DS51284E_CN 第 33 页

40 MPLAB C30 用户指南 控制 C 语言的选项 表 3-4: 选项 C 语言控制选项 定义 -ansi -aux-info filename -ffreestanding -fno-asm -fno-builtin -fno-builtin-function -fsigned-char -fsigned-bitfields -funsigned-bitfields -fno-signed-bitfields -fno-unsigned-bitfields 支持 ( 且仅支持 ) 所有 ANSI 标准的 C 程序 对于在翻译单元中声明和 / 或定义的函数, 包括头文件中的函数, 输出到给定文件名的原型声明中 除了 C, 这个选项在其他语言中通常被忽略 除了声明以外, 文件在注释中指出了每个声明的来源 ( 源文件和行 ), 不论声明是隐含的, 原型的, 还是非原型的 ( 在行号和冒号后面的第一个字符中,I N 代表新的,O 代表旧的 ), 也不论它来自声明还是定义 ( 在随后的字符中, 分别用 C 和 F 代表 ) 如果是函数定义, 在函数声明之后的注释中, 还提供 K&R 型参数列表, 后跟这些参数的声明 指明编译在独立环境中进行 这意指 -fno-builtin 选项 独立的环境就是其中可能不存在标准库, 程序也不必在主函数中启动的环境 最显而易见的例子就是 OS 内核 这与 -fno-hosted 等价 不识别 asm inline 或 typeof 关键字, 因此代码可以将这些单词用作标识符 可以使用关键字 asm inline 和 typeof -ansi 意指 -fno-asm 不识别不以 builtin_ 作为前缀开始的内建函数 使 char 型变量为有符号, 就像 signed char ( 这是默认设置 ) 如果声明时未使用 signed 或 unsigned, 这些选项用来控制位域是有符号还是无符号的 默认情况下, 这样的位域都是有符号的, 除非使用 -traditional, 它使位域总是无符号的 -funsigned-char 使 char 型变量无符号, 就像 usigned char -fwritable-strings 将字符串存储到可写的数据段中, 但不要使字符串成为唯一 的 DS51284E_CN 第 34 页 2006 Microchip Technology Inc.

41 使用 MPLAB C30 C 编译器 警告与错误控制选项 警告是诊断消息, 它报告非本质错误 但有危险的语法结构, 或暗示可能存在错误 可以使用以 -W 开头的选项请求许多特定的警告, 例如, 使用 -Wimplicit 请求关于隐式声明的警告 每条这些特定的警告选项也可以用以 -Wno- 开头的相反形式来关闭警告, 如 -Wno-implicit 本手册只列出了这两种形式中的一种, 这两种形式都不是默认的 下面的选项控制 MPLAB C30 C 编译器产生的警告的数量和种类 表 3-5: -WALL 隐含的警告 / 错误选项 选项 -fsyntax-only -pedantic 定义 检查代码的语法, 除此之外不做任何事情 发出严格 ANSI C 要求的所有警告 ; 拒绝所有使用禁止扩展名的程序 -pedantic-errors 类似于 -pedantic, 只是发出错误而不是警告 -w 禁止所有警告消息 -Wall 使能本表中列出的所有 -W 选项 这将使能关于某些用户认为 有问题的, 及容易避免的 ( 或修改来禁止警告的 ) 语法结构 的所有警告, 即使是与宏一起 -Wchar-subscripts 如果数组下标具有 char 类型则警告 -Wcomment -Wcomments -Wdiv-by-zero -Wimplicit -Werror-implicitfunction-declaration -Wformat -Wimplicit-functiondeclaration -Wimplicit-int -Wmain -Wmissing-braces 当注释开始符号 /* 出现在 /* 注释中, 或反斜杠换行出现在 // 注释中发出警告 编译时发现整数除以 0 则警告 禁止这个消息可使用 -Wno-div-by-zero 浮点数除以 0 不会警告, 因为它可以是获得无穷大和 NaN 的一种合法方法 ( 这是默认情况 ) 函数在声明前被使用将给出错误 检查对 printf 和 scanf 等函数的调用, 确保所提供参数的类型与指定的格式字符串相符合 等价于同时指定 -Wimplicit-int 和 -Wimplicit-function-declaration 函数在声明前被使用将给出警告 如果声明没有指定类型则警告 如果 main 的类型有问题则警告 main 应该是一个具有外部链接的函数, 它返回 int, 并带有正确类型的 0 2 或 3 个参数 如果一个聚集或联合的初始化中括号不全则警告 在下面的例子中, a 的初始化中括号不全, 而对 b 的初始化是正确的 int a[2][2] = { 0, 1, 2, 3 }; int b[2][2] = { { 0, 1 }, { 2, 3 } }; 2006 Microchip Technology Inc. DS51284E_CN 第 35 页

42 MPLAB C30 用户指南 表 3-5: -WALL 隐含的警告 / 错误选项 ( 续 ) 选项 -Wmultichar -Wno-multichar -Wparentheses -Wreturn-type -Wsequence-point 定义 使用多字符的 character 常量时警告 通常出现这样的常量是由于输入错误 由于这种常量具有实现定义的值, 不应将它们用在可移植代码中 下面举例说明了多字符 character 常量的使用 : char xx(void) { return('xx'); } 在某些上下文中省略圆括号时警告, 如在需要真值的上下文中有一个赋值, 或者运算符嵌套的运算优先级容易混淆时 当函数定义为其返回值类型默认为 int 时发出警告 如果函数的返回值类型不是 void, 那么不带返回值的任何 return 语句都会导致产生警告 由于违背 C 标准中的顺序点规则而导致代码中有未定义的语义时发出警告 C 标准定义了 C 程序中根据顺序点对表达式求值的顺序, 顺序点代表程序各部分执行的局部顺序 : 在顺序点之前执行的部分和顺序点之后执行的部分 这些在一个完整表达式 ( 不是一个更大的表达式的一部分 ) 的求值之后, 在对第一个运算符 (&&? : 或, ( 逗号 ) 运算符 ) 求值之后, 在调用函数前 ( 但在对其参数和表示被调用函数的表达式求值后 ), 以及某些其他地方发生 除了顺序点规则指定的顺序外, 未指定表达式的子表达式的求值顺序 所有这些规则仅规定了局部的顺序, 而没有规定全局的顺序, 因为, 如在一个表达式中调用了两个函数, 而它们之间没有顺序点, 就没有指定函数调用的顺序 但是, 标准委员会规定函数调用不能重叠 没有指定在顺序点之间, 对对象的值的修改何时生效 操作依赖于这一点的程序有不确定的操作 ; C 标准规定, 在上一个顺序点和下一个顺序点之间, 对象所储存的值最多只能被表达式求值修改一次 而且, 前一个值是只读的以便确定将被储存的值 如果程序违反这些规则, 任何特定实现的结果都是完全不可预估的 具有未定义操作的代码示例有 :a = a++;, a[n] = b[n++]; 及 a[i++] = i; 这个选项不能诊断某些更复杂的情况, 并可能给出偶然错误的结果, 但通常在检测程序中的这类问题时, 这个选项还是很有效的 DS51284E_CN 第 36 页 2006 Microchip Technology Inc.

43 使用 MPLAB C30 C 编译器 表 3-5: -WALL 隐含的警告 / 错误选项 ( 续 ) -Wswitch 每当 switch 语句中有一个枚举类型的索引, 并且这个枚举的一个或多个指定码缺少 case 时发出警告 ( 默认标号的存在禁止这个警告 ) 当使用这个选项时, 枚举范围之外的 case 标号也会引起警告 -Wsystem-headers 打印关于系统头文件中语法结构的警告消息 系统头文件的警告通常是被禁止的, 因为通常认为它们不会有真正的问题, 只会使编译器的输出可读性更差 使用这个命令行选项告知 MPLAB C30 发出关于系统头文件的警告, 就像在用户代码中一样 但是, 注意将 -Wall 与该选项一起使用时不会对系统头文件中的未知 pragma 伪指令发出警告, 这时, 必须同时使用 -Wunknown-pragmas -Wtrigraphs 遇到三字母组合时发出警告 ( 假定使能了三字母组合 ) -Wuninitialized -Wunknown-pragmas -Wunused 选项 -Wunused-function -Wunused-label 定义 使用自动变量而没有先对其初始化时发出警告 这些警告只有在允许优化时才出现, 因为它们需要只有优化时才计算的数据流信息 仅当将变量分配给寄存器时才产生这些警告 因此, 对于声明为 volatile 的变量, 或是变量地址被占用, 或者大小不是 1, 2, 4 和 8 字节的变量不会产生这些警告 同样对于结构 联合或数组, 即使它们在寄存器中, 也不会产生这些警告 注意, 当一个变量只是用于计算一个值而变量本身不会被使用时, 也不会产生警告, 因为在警告被打印前, 这样的计算就会被数据流分析删除 当遇到一个 MPLAB C30 无法理解的 #pragma 伪指令时发出警告 如果使用这个选项, 甚至对系统头文件中的未知 pragma 伪指令也会发出警告 如果警告只能通过命令行选项 -Wall 来使能, 情况就不是这样了 每当变量除了其声明外未被使用过时, 每当函数声明为 static 但从未定义时, 每当声明了标号但未使用时, 每当一条语句的计算结果未被显式使用时, 发出警告 要获得未使用的函数参数的警告, 必须同时指定 -W 和 -Wunused 强制转换表达式类型可以避免禁止对表达式的这种警告 同样地, unused 属性可以禁止对未使用的变量 参数和标号的警告 每当声明了 static 函数但没有定义函数时, 或一个非内联 static 函数未使用时, 发出警告 声明了一个标号但未使用时发出警告 要禁止这种警告, 可以使用 unused 属性 ( 参见第 节 指定变量的属性 ) 2006 Microchip Technology Inc. DS51284E_CN 第 37 页

44 MPLAB C30 用户指南 表 3-5: -WALL 隐含的警告 / 错误选项 ( 续 ) 选项定义 -Wunused-parameter 当对函数参数进行了声明但从未使用时, 发出警告 要禁止这种警告, 使用 unused 属性 ( 参见第 节 指定变量的属性 ) -Wunused-variable 当对局部变量或非常量的 static 变量进行了声明但从未使用时, 发出警告 要禁止这种警告, 使用 unused 属性 ( 参见第 节 指定变量的属性 ) -Wunused-value 语句的计算结果未显式使用时发出警告 要禁止这种警告, 可以将表达式类型转换为 void 下面是不被 -Wall 隐含的 -W 选项 其中有些是关于用户通常认为不会有问题, 但有时会希望检查一下的语法结构的警告 其他是在某些情况下必须或很难避免的语法结构的警告, 没有简单的方法来修改代码以禁止这些警告 表 3-6: -WALL 不隐含的警告 / 错误选项 选项 定义 -W 为以下事件输出额外警告消息 : 非易变的自动变量可能会被对 longjmp 的调用改变 这些警告仅在优化编译时才会出现 编译器仅识别对 setjmp 的调用, 而不会知道将在何处调用 longjmp, 信号处理程序可以在代码中的任何地方调用 longjmp 因此, 即使当实际没有问题时也可能会产生警告, 因为实际上不能在会产生问题的地方调用 longjmp 函数可以通过 return value; 和 return; 退出 函数体结束时不传递任何返回值的语句视为 return; 表达式语句或者逗号表达式的左侧没有副作用 为了禁止这种警告, 将未使用表达式的类型强制转换为 void 例如, 表达式 x[i,j] 会产生警告, 而表达式 x[(void)i,j] 不会产生警告 用 < 或 <= 将无符号值与 0 比较 出现了像 x<=y<=z 这样的不等式 ; 这等价于 (x<=y? 1 : 0) <= z, 这只是普通数学表示的不同解释罢了 存储类型修饰符如 static 在声明中没有放在最前面, 根据标准, 这种用法已经过时了 如果还指定了 -Wall 或 -Wunused, 会出现关于未使用变量的警告 当将有符号值转换为无符号值时, 比较有符号值和无符号值会产生不正确的结果 ( 但是如果还指定了 -Wno-sign-compare 的话, 就不会产生警告 ) DS51284E_CN 第 38 页 2006 Microchip Technology Inc.

45 使用 MPLAB C30 C 编译器 表 3-6: -WALL 不隐含的警告 / 错误选项 ( 续 ) 选项 定义 -W 聚集的初始化中括号不全 例如, 下面的代码由于在初始化 x.h 时漏掉了括号会产生警告 : struct s { int f, g; }; struct t { struct s h; int i; }; struct t x = { 1, 2, 3 }; 聚集的初始化中没有初始化所有成员, 例如, 下面的代码由于 x.h 会被隐式初始化为零而会产生警告 : struct s { int f, g, h; }; struct s x = { 3, 4 }; -Waggregate-return 定义或调用了返回结构或联合的任何函数时产生警告 -Wbad-function-cast 当将函数调用强制转换为不匹配类型时产生警告 例如, 如果 int foof() 被强制转换为任何 * 指针类型 -Wcast-align 当强制转换指针类型, 使目标所需分配的存储空间增加时产生警告 例如, 如果将 char * 强制转换为 int * 会产生警告 -Wcast-qual 当对指针进行强制类型转换, 从目标类型中去掉类型限定符时, 会产生警告 例如, 将 const char * 强制转换为普通的 char * 就会产生警告 -Wconversion -Werror -Winline -Wlarger-than-len -Wlong-long -Wno-long-long -Wmissing-declarations -Wmissingformat-attribute 如果一个原型导致一个参数的类型转换与没有原型时不同, 则发出警告 这包括定点型转换为浮点型或反之, 及改变定点参数符号或宽度的转换, 与默认的提升相同时除外 当负的整型常量表达式隐式转换为无符号类型时也发出警告 例如, 如果 x 为无符号类型, 赋值 x = -1 将产生警告 但是, 显式的强制类型转换, 如 (unsigned) -1, 不会产生警告 使所有警告变为错误 一个函数已声明为内联, 或指定了 -finline-functions 选项时, 如果函数不能被内联, 将产生警告 当定义了大于 len 字节的对象时产生警告 使用 long long 类型时发出警告 这是默认设置 为禁止警告消息, 使用 -Wno-long-long 仅当使用 -pedantic 标志时, 才考虑标志 -Wlong-long 和 -Wno-long-long 如果在定义一个全局函数之前没有先对其进行声明将产生警告 即使定义本身提供了原型, 也要在定义全局函数之前先声明它 如果使能了 -Wformat, 可指定 format 属性的函数也会产生警告 注意这些函数仅是可指定 format 属性的函数, 不是已指定 format 属性的函数 如果不使能 -Wformat, 这一选项不起作用 2006 Microchip Technology Inc. DS51284E_CN 第 39 页

46 MPLAB C30 用户指南 表 3-6: -WALL 不隐含的警告 / 错误选项 ( 续 ) 选项 -Wmissing-noreturn -Wmissing-prototypes -Wnested-externs -Wno-deprecateddeclarations 对可指定 noreturn 属性的函数产生警告 这些函数仅是可指定这一属性的函数, 并不是已指定了这一属性的函数 手工检验这些函数时要小心 实际上, 在添加 noreturn 属性之前也不要返回 ; 否则可能会引入微小的代码生成错误 如果全局函数在定义之前没有先声明原型会产生警告 即使定义本身提供了原型也会发出这个警告 ( 这个选项可用于检测不在头文件中声明的全局函数 ) 如果在函数内部遇到了 extern 声明, 发出警告 不要对使用通过 deprecated 属性指定为 deprecated 的函数 变量和类型发出警告 -Wpadded 如果一个结构中包含了填充, 不管是为了对齐结构的一个元素, 还是为了对齐整个结构, 都发出警告 -Wpointer-arith -Wredundant-decls -Wshadow -Wsign-compare -Wno-sign-compare -Wstrict-prototypes -Wtraditional -Wundef -Wunreachable-code 定义 对于与函数类型或 void 的长度有关的任何类型发出警告 为方便用 void * 指针和指向函数的指针计算, MPLAB C30 将这些类型的长度分配为 1 如果在同一个作用域内多次声明了任何符号则发出警告, 即使多个声明都有效且没有改变任何符号 当一个局部变量屏蔽另一个局部变量时发出警告 当比较有符号值和无符号值时, 将有符号值转换为无符号值, 比较产生不正确结果时发出警告 这个警告也可通过 -W 来使能 ; 要获得 -W 的其他警告, 而不获得这个警告, 使用 -W -Wno-sign-compare 如果对一个函数的定义或声明没有指定参数类型则发出警告 ( 如果函数定义或声明前有指定函数参数类型的声明, 则允许旧式函数定义而不发出警告 ) 如果某些语法结构在传统 C 和 ANSI C 中操作不同, 产生警告 宏参数出现在宏体中的字符串常量中 在传统 C 中, 这些宏参数将替代参数, 但在 ANSI C 中是常量的一部分 在一个块中声明为 external 的函数, 在块结束后被使用 switch 语句有 long 类型的操作数 非静态函数声明后跟一个静态函数声明 某些传统 C 编译器不接受这种语法结构 如果在 #if 伪指令中对一个未定义的标识符求值会产生警告 如果编译器检测到代码将永远不会被执行到则发出警告 即使在有些情况下, 受影响的代码行的一部分能被执行到, 这个选项也可能产生警告, 因此在删除明显执行不到的代码时要小心 例如, 函数被内联时, 警告可能表明仅在函数的一个内联拷贝中, 该行执行不到 DS51284E_CN 第 40 页 2006 Microchip Technology Inc.

47 使用 MPLAB C30 C 编译器 表 3-6: -WALL 不隐含的警告 / 错误选项 ( 续 ) 选项 -Wwrite-strings 定义 字符串常量类型为 const char[length] 时, 将一个字符串常量的地址复制到一个非常量 char * 指针会产生警告 这些警告有助于在编译时查找试图写字符串常量的代码, 但仅是在声明和原型中使用 const 时非常小心的前提下 否则, 这是不安全的, 这也是 -Wall 为什么不要求这些警告的原因 调试选项 表 3-7: 选项 调试选项 定义 -g 产生调试信息 MPLAB C30 支持同时使用 -g 和 -O, 因此可以调试优化的代码 调试优化代码的缺点是有时可能产生异常结果 : - 某些声明的变量可能根本不存在 ; - 控制流程可能短暂异常转移 ; - 某些语句可能由于计算常量结果或已经获得其值而不执行 ; - 某些语句可能由于被移出循环在不同的地方执行 尽管如此, 证明还是可以调试优化输出的 这使优化可能有错误的程序变得合理 -Q 使编译器打印它在编译的每个函数名, 并在结束时打印关于每遍编译的一些统计信息 -save-temps 不要删除中间文件 将中间文件放在当前目录中, 并根据源文件命名它们 因此, 用 -c -save-temps 编译 foo.c 将生成下面的文件 : foo.i ( 预处理文件 ) foo.p ( 预过程抽象汇编语言文件 ) foo.s ( 汇编语言文件 ) foo.o ( 目标文件 ) 2006 Microchip Technology Inc. DS51284E_CN 第 41 页

48 MPLAB C30 用户指南 控制优化的选项 表 3-8: 一般优化选项 选项 定义 -O0 不要优化 ( 这是默认设置 ) 不指定 -O 选项, 编译器的目标是降低编译成本, 使调试产生期望的结果 语句是独立的 : 如果在语句中插入断点暂停程序, 然后可以给任何一个变量赋一个新的值或将程序计数器更改到指向函数中的任何其他语句, 得到希望从源代码得到的结果 编译器仅将声明为 register 的变量分配到寄存器中 -O -O1 优化 优化编译需要花费更多的时间, 且对于较大的函数, 需要占用更多的存储空间 指定 -O 选项时, 编译器试图减小代码尺寸并缩短执行时间 指定 -O 选项时, 编译器开启 -fthread-jumps 和 -fdefer-pop, 并开启 -fomit-frame-pointer -O2 执行更多优化 MPLAB C30 几乎执行所有支持的优化, 而不进行空间和速度的权衡 -O2 选项使能除循环展开 (-funroll-loops) 函数内联 (-finline-functions) 及严格别名优化 (-fstrict-aliasing) 之外的所有可选优化 这个选项还使能强制复制存储器操作数 (-fforce-mem) 及帧指针删除 (-fomit-frame-pointer) 与 -O 相比, 这个选项增加了编译时间, 但提高了生成代码的性能 -O3 执行最多的优化 -O3 开启所有 -O2 指定的优化并开启内联函数选项 -Os 优化代码尺寸 -Os 使能一般不增加代码尺寸的所有 -O2 优化 同时执行用于减小代码尺寸的其他优化 DS51284E_CN 第 42 页 2006 Microchip Technology Inc.

49 使用 MPLAB C30 C 编译器 下面的选项控制特定的优化 -O2 选项启用这些优化中除 -funroll-loops -funroll-all-loops 和 -fstrict-aliasing 外的所有优化选项 在少数情况下, 当需要进行 微调 优化时, 可以使用下面的选项 表 3-9: 特定的优化选项 选项 -falign-functions -falign-functions=n -falign-labels -falign-labels=n -falign-loops -falign-loops=n -fcaller-saves -fcse-follow-jumps -fcse-skip-blocks -fexpensiveoptimizations -ffunction-sections -fdata-sections 定义 将函数的开头对齐到下一个大于 n 的 2 的次幂, 最多跳过 n 字节 例如, -falign-functions=32 将函数对齐到下一个 32 字节边界, 但是 -falign-functions=24 仅在可以通过跳过等于或小于 23 字节能对齐到下一个 32 字节边界的情况下, 才将函数对齐到下一个 32 字节边界 -fno-align-functions 和 -falign-functions=1 是等价的, 表明函数不会被对齐 汇编器仅当 n 为 2 的次幂时, 才支持这个标志 ; 因此 n 是向上舍入的 如果不指定 n, 则使用由机器决定的默认设置 将所有分支的目标地址对齐到 2 的次幂边界, 像 -falign-functions 一样, 最多跳过 n 字节 这个选项可能容易使代码速度变慢, 因为当以代码的通常流程到达分支的目标地址时, 它必须插入空操作 如果 -falign-loops 或 -falign-jumps 可用, 并且大于这个值, 则使用它们的值 如果不指定 n, 则使用由机器决定的默认设置, 很可能是 1, 表明不对齐 将循环对齐到 2 的次幂边界, 像 -falign-functions 一样, 最多跳过 n 字节 希望循环能执行许多次, 从而补偿执行的任何空操作 如果不指定 n, 则使用由机器决定的默认设置 通过在函数调用前后发出其他指令来保护和恢复寄存器, 使能将值分配到会被函数调用破坏的寄存器中 仅当这种分配能生成更好的代码时才进行这种分配 在公共子表达式消除中, 当任何其他路径都不到达跳转的目标地址时, 浏览跳转指令 例如, 当 CSE 遇到一条带有 else 子句的 if 语句时, 当条件检测为假时, CSE 将跟随跳转 这与 -fcse-follow-jumps 类似, 但使 CSE 跟随根据条件跳过块的跳转 当 CSE 遇到一个没有 else 子句的简单 if 语句时,-fcse-skip-blocks 使 CSE 跟随 if 前后的跳转 执行许多成本较高的次要优化 将每个函数或数据项存放到输出文件中其自己的段 函数名或数据项名决定输出文件中的段名 仅当使用这些选项有明显的好处时, 才使用这些选项 当指定这些选项时, 汇编器和链接器可能生成较大的目标文件和可执行文件, 且速度较慢 2006 Microchip Technology Inc. DS51284E_CN 第 43 页

50 MPLAB C30 用户指南 表 3-9: 特定的优化选项 ( 续 ) -fgcse -fgcse-lm -fgcse-sm 选项 -fmove-all-movables -fno-defer-pop -fno-peephole -fno-peephole2 -foptimizeregister-move -fregmove -freduce-all-givs -frename-registers -frerun-cse-afterloop -frerun-loop-opt -fschedule-insns -fschedule-insns2 -fstrength-reduce 执行全局公共子表达式消除 这会同时执行全局常量和复制传播 使能 -fgcse-lm 时, 全局公共子表达式消除将试图移动仅能被向其中存储破坏的装载 这允许将包含装载 / 存储序列的循环改变为循环外的装载, 以及循环内的复制 / 装载 当使能 -fgcse-sm 时, 将在公共子表达式消除后运行存储移动 这试图将存储移出循环 当将这个选项与 -fgcse-lm 一起使用时, 包含装载 / 存储序列的循环可改变为循环前的装载和循环后的存储 强制将循环内所有不可变的计算移出循环 每次函数调用时, 总是在函数一返回时就弹出函数的参数 编译器通常允许几个函数调用的参数累积在堆栈中, 并将所有参数一次弹出堆栈 禁止特定于机器的窥孔 (peephole) 优化 窥孔优化发生在编译过程中的不同点 -fno-peephole 禁止对机器指令进行窥孔优化, 而 -fno-peephole2 禁止高级窥孔优化 要完全禁止窥孔优化, 要同时使用这两个选项 试图重新分配 move 指令中的寄存器编号, 并作为其他简单指令的操作数来增加关联的寄存器数量 -fregmove 和 -foptimize-register-moves 是相同的优化 强制循环中的所有一般归纳变量降低强度 这些选项可能生成更好或更差的代码 ; 其结果在很大程度上取决于源代码中循环的结构 试图通过使用寄存器分配后余下的寄存器来避免经过调度的代码中的假相关性 这种优化对于有许多寄存器的处理器比较有用 但它可能使调试无法进行, 因为变量将不会存储在固定的寄存器中 在执行循环优化后, 重新运行公共子表达式消除 运行循环优化两次 定义 试图对指令重新排序, 以消除 dspic DSC 写 - 后 - 读 (Read-After-Write) 停顿 ( 详情请参阅 dspic30f 系列参考手册 (DS70046D_CN)) 一般可提高性能, 而不会影响代码长度 类似于 -fschedule-insns, 但要求在进行寄存器分配后再执行一次指令调度 执行降低循环强度和删除迭代变量优化 DS51284E_CN 第 44 页 2006 Microchip Technology Inc.

51 使用 MPLAB C30 C 编译器 表 3-9: 特定的优化选项 ( 续 ) 选项 -fstrict-aliasing 定义 允许编译器采用适用于被编译语言的最严格别名规则 对于 C, 这根据表达式的类型进行优化 尤其是, 假定一种类型的对象不会和另一种类型的对象存放在同一地址, 除非类型几乎相同 例如, unsigned int 可引用 int, 但不能引用 void* 或 double 字符类型可引用任何其他类型 特别要注意下面的代码 : union a_union { int i; double d; }; -fthread-jumps -funroll-loops -funroll-all-loops int f() { union a_union t; t.d = 3.0; return t.i; } 不读最后写入的联合成员, 而读其他联合成员 ( 称为 type-punning ) 比较常见 即使对于 -fstrict-aliasing, 如果通过联合类型访问存储器, type-punning 也是允许的 因此上面的代码可得到期望的结果 但下面的代码可能得不到期望的结果 : int f() { a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; } 是一种优化, 检测一个转移的目标语句是否包含另一个条件判断 如果是这样, 第一个转移改变为指向第二个转移的目标语句, 或紧随其后的语句, 这取决于条件是真还是假 执行循环展开优化 仅对在编译时或运行时其迭代次数可以确定的循环进行这种优化 -funroll-loops 隐含了 -fstrength-reduce 和 -frerun-cse-after-loop 执行循环展开优化 对于所有的循环执行这种优化, 通常这种优化会使程序运行较慢 -funroll-all-loops 隐含了 -fstrength-reduce 和 -frerun-cse-after-loop 2006 Microchip Technology Inc. DS51284E_CN 第 45 页

52 MPLAB C30 用户指南 -fflag 形式的选项指定依赖于机器的标志 大多数标志有正的形式和负的形式 ; -ffoo 的负的形式为 -fno-foo 在下表中, 仅列出了一种形式 ( 非默认的形式 ) 表 3-10: 选项 -fforce-mem -finline-functions -finline-limit=n 独立于机器的优化选项 -fkeep-inline-functions -fkeep-static-consts -fno-function-cse 定义 在对存储器操作数进行算术运算之前, 强制将存储器操作数复制到寄存器中 这样通过使所有存储器引用可能的公共子表达式, 可生成更好的代码 当它们不是公共子表达式时, 指令组合应该删除单独的寄存器装载 -O2 开启这个选项 将所有简单的函数合并到其调用函数中 编译器直观地决定哪些函数足够简单值得这样合并 如果合并了对某个给定函数的所有调用, 且函数声明为 static, 则通常该函数本身不作为汇编代码输出 默认情况下, MPLAB C30 限制可内联的函数的大小 这个选项允许控制显式声明为 inline 的函数 ( 即用 inline 关键字标记的函数 ) 的这一限制 n 是可内联的函数的大小, 以虚拟指令的条数为单位 ( 参数处理不包括在内 ) n 的默认值为 增加这个值可能导致被内联的代码更多, 并可能增加编译时间和存储器开销 减小这个值通常使编译更快, 更少的代码被内联 ( 可能程序执行速度变慢 ) 这一选项对于使用内联的程序尤其有用 注 : 在这里, 虚拟指令代表函数大小的抽象测量 它不代表汇编指令条数, 同样对于不同版本的编译器, 它的确切含义可能会有所不同 即使合并了对一个给定函数的所有调用, 且函数声明为 static, 输出函数的一个独立的运行时可调用形式 这个选项不影响 extern 内联函数 当没有开启优化时, 发出声明为 static const 的变量, 即使变量没有被引用 MPLAB C30 默认使能这个选项 如果需要强制编译器检查是否引用了这个变量, 而不管是否开启了优化, 使用 -fno-keep-static-consts 选项 不要将函数的地址存放在寄存器中 ; 使调用 constant 函数的每条指令显式包含函数的地址 这个选项导致生成的代码效率不高, 但对于某些企图修改程序的人来说, 会对不使用这个选项而生成的优化程序感到束手无策 DS51284E_CN 第 46 页 2006 Microchip Technology Inc.

53 使用 MPLAB C30 C 编译器 表 3-10: 独立于机器的优化选项 ( 续 ) 选项 定义 -fno-inline -fomit-frame-pointer -foptimize-sibling-calls 不要理会 inline 关键字 这个选项通常用于使编译器不要展开任何内联函数 如果不使能优化, 不会展开任何内联函数 对于不需要帧指针的函数, 不要将帧指针存放在寄存器中 这可以避免指令保护 设置和恢复帧指针 ; 它还使一个额外的寄存器可用于许多函数 优化同属和尾递归调用 控制预处理器的选项 表 3-11: 预处理器选项选项 定义 -Aquestion (answer) 断言问题 question 的答案 answer, 以防用预处理条件, 如 #if #question(answer) 来测试问题 -A- 禁止通常描述目标机器的标准断言 例如, main 的函数原型可声明如下 : #if #environ(freestanding) int main(void); #else int main(int argc, char *argv[]); #endif -A 命令行选项可用于在两个原型之间进行选择 例如, 为选择二者中的第一个, 可使用下面的命令行选项 : -Aenviron(freestanding) -A -predicate =answer 取消带谓词 predicate 和答案 answer 的断言 -A predicate =answer 进行带谓词 predicate 和答案 nswer 的断言 这个形式比仍 然支持的老形式 -A predicate(answer) 好, 因为这个形式 不使用 shell 特殊字符 -C 告知预处理器不要舍弃注释 与 -E 选项一起使用 -dd 告知预处理器不要按照正确的顺序将宏定义移动到输出中 -Dmacro 将字符串 1 作为宏定义来定义宏 macro -Dmacro=defn 将宏 macro 定义为 defn 在任何 -U 选项之前处理命令行中的 所有 -D 选项 -dm 告知预处理器仅输出实际上处于预处理结尾的一系列宏定义 与 -E 选项一起使用 -dn 与 -dd 类似, 不同之处在于宏参数和内容被忽略 输出中仅包 括 #define name -fno-show-column 不要在诊断中打印列号 如果诊断被不理解列号的程序 ( 如 dejagnu) 浏览, 这可能是必要的 -H 打印使用的每个头文件的名字以及其他正常活动 2006 Microchip Technology Inc. DS51284E_CN 第 47 页

54 MPLAB C30 用户指南 表 3-11: 预处理器选项 ( 续 ) 选项 定义 -I- 仅对于 #include "file", 才搜索在 -I- 选项之前 -I 选项指定的任何目录 ; 对于 #include <file>, 则不搜索这些目录 如果在 -I- 之后用 -I 选项指定了另外的目录, 则对于所有 #include 伪指令, 都搜索这些目录 ( 一般情况下以这种方式使用所有 -I 目录 ) 另外, -I- 选项禁止将当前目录 ( 即当前输入文件所在的目录 ) 作为 #include "file" 的第一个搜索目录 无法覆盖 -I- 的这个作用 通过 -I, 可以指定搜索调用编译器时为当前目录的目录 这与预处理器在默认情况下的操作不完全相同, 但一般情况下都可以这样做 -I- 并不禁止使用头文件的标准系统目录 因此, -I- 和 -nostdinc 是独立的 -Idir 将目录 dir 添加到要在其中搜索头文件的目录列表的开头 这可用于覆盖系统头文件, 替代为您自己的版本, 因为在搜索系统头文件目录之前搜索这些目录 如果使用多个 -I 选项, 则以自左向右的顺序浏览目录, 最后搜索标准系统目录 -idirafter dir 将目录 dir 添加到辅助包含路径中 当一个头文件在主包含路径 (-I 添加的路径 ) 的任何目录中都找不到时, 搜索辅助包含路径的目录 -imacros file 在处理常规输入文件之前, 将文件处理为输入, 舍弃生成的输出 由于舍弃了由文件生成的输出, -imacros file 的唯一作用是使文件中定义的宏可用在主输入中 命令行中的任何 -D 和 -U 选项始终在 -imacros file 之前处理, 而与写这些选项的顺序无关 所有 -include 和 -imacros 选项以写这些选项时的顺序处理 -include file 在处理常规输入文件之前, 将文件处理为输入 实际上, 首先编译文件的内容 命令行中的任何 -D 和 -U 选项始终在 -include file 之前处理, 而与写这些选项的顺序无关 所有 -include 和 -imacros 选项以写这些选项时的顺序处理 -iprefix prefix 指定 prefix 作为后面 -iwithprefix 选项的前缀 -isystem dir 将一个目录添加到辅助包含路径的开头, 将其标记为系统目录, 因此可像处理标准系统目录一样处理这个目录 -iwithprefix dir 将一个目录添加到辅助包含路径 目录名由前缀和 dir 组成, 其中前缀由前面的 -iprefix 指定 如果没有指定前缀, 将使用包含编译器安装路径的目录作为默认目录 -iwithprefixbefore dir 将一个目录添加到主包含路径 目录名由前缀和 dir 组成, 这与 -iwithprefix 相同 DS51284E_CN 第 48 页 2006 Microchip Technology Inc.

00872a.book

00872a.book 从 MCP2510 升 级 至 MCP2515 作 者 : 介 绍 Pat Richards Microchip Technology Inc. 开 发 MCP2510 独 立 CAN 控 制 器 的 初 衷 是 赋 予 CAN 系 统 和 模 块 设 计 人 员 更 多 的 灵 活 性, 允 许 他 们 为 自 己 的 应 用 选 择 最 好 的 处 理 器 使 用 MCP2510 不 会 使 设

More information

untitled

untitled MCP3421 SOT23-6 DS51793A_CN Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Digital Millennium Copyright Act Microchip Microchip Technology

More information

untitled

untitled C 8051 MCU SPI EEPROM Alexandru Valeanu Microchip Technology Inc. Microchip Technology 25XXX EEPROM SPI 25XXX EEPROM SO 25XXX EEPROM 3MHz 20 MHz SPI HOLD 25XXX EEPROM EEPROM MCU HOLD 25XXX EEPROM SPI EEPROM

More information

untitled

untitled PICkit MCP3422 DS51781A_CN Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Digital Millennium Copyright Act Microchip Microchip Technology

More information

51284F.book

51284F.book MPLAB C30 C 编译器用户指南 2007 Microchip Technology Inc. DS51284F_CN 请注意以下有关 Microchip 器件代码保护功能的要点 : Microchip 的产品均达到 Microchip 数据手册中所述的技术指标 Microchip 确信 : 在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一 目前, 仍存在着恶意

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

61146A.book

61146A.book PIC32 2008 Microchip Technology Inc. DS61146A_CN Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Digital Millennium Copyright Act Microchip

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

51284H.book

51284H.book 用于 PIC24 MCU 和 dspic DSC 的 MPLAB C 编译器用户指南 2008 Microchip Technology Inc. DS51284H_CN 请注意以下有关 Microchip 器件代码保护功能的要点 : Microchip 的产品均达到 Microchip 数据手册中所述的技术指标 Microchip 确信 : 在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一

More information

01262B.book

01262B.book 使用 C30 编译器实现单片机与片外串行 SRAM 的通信 作者 : 引言 Martin Bowman Microchip Technology Inc. 适用于 Microchip 的 dspic DSC 和 PIC24 系列单片机的 C30 编译器为寻址外部存储器提供了一个解决方案 该编译器支持这样的功能, 即允许用户按照访问 MCU 的片内存储器的方式来访问外部存储器 本应用笔记主要介绍如何使用

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

MCP47x6_DaughterBoard.book

MCP47x6_DaughterBoard.book MCP47X6 PICtail Plus 子 板 用 户 指 南 DS51932B_CN 请 注 意 以 下 有 关 Microchip 器 件 代 码 保 护 功 能 的 要 点 : Microchip 的 产 品 均 达 到 Microchip 数 据 手 册 中 所 述 的 技 术 指 标 Microchip 确 信 : 在 正 常 使 用 的 情 况 下, Microchip 系 列 产 品

More information

新版 明解C言語入門編

新版 明解C言語入門編 328, 4, 110, 189, 103, 11... 318. 274 6 ; 10 ; 5? 48 & & 228! 61!= 42 ^= 66 _ 82 /= 66 /* 3 / 19 ~ 164 OR 53 OR 164 = 66 ( ) 115 ( ) 31 ^ OR 164 [] 89, 241 [] 324 + + 4, 19, 241 + + 22 ++ 67 ++ 73 += 66

More information

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]

Microsoft PowerPoint - 3. 函数Functionl.ppt [兼容模式] 函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)

More information

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40

C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40 C C trio@seu.edu.cn C C C C The Most Beautiful Language and Most Dangerous Language in the Programming World! C 2 C C C 4 C 40 30 10 Project 30 C Project 3 60 Project 40 Week3 C Week5 Week5 Memory & Pointer

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

PIC24 MSSP FRM Rev A.book

PIC24 MSSP FRM Rev A.book 58 MSSP 58.1... 58-2 58.2... 58-2 58.3... 58-12 58.4 SPI... 58-13 58.5 I2C... 58-22 58.6 /... 58-58 58.7... 58-58 58.8... 58-59 58.9... 58-60 58.10... 58-61 58 MSSP 2012 Microchip Technology Inc. DS30627A_CN

More information

ICD ICD ICD ICD ICD

ICD ICD ICD ICD ICD MPLAB ICD2 MPLAB ICD2 PIC MPLAB-IDE V6.0 ICD2 usb PC RS232 MPLAB IDE PC PC 2.0 5.5V LED EEDATA MPLAB ICD2 Microchip MPLAB-IDE v6.0 Windows 95/98 Windows NT Windows 2000 www.elc-mcu.com 1 ICD2...4 1.1 ICD2...4

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

_汪_文前新ok[3.1].doc

_汪_文前新ok[3.1].doc 普 通 高 校 本 科 计 算 机 专 业 特 色 教 材 精 选 四 川 大 学 计 算 机 学 院 国 家 示 范 性 软 件 学 院 精 品 课 程 基 金 青 年 基 金 资 助 项 目 C 语 言 程 序 设 计 (C99 版 ) 陈 良 银 游 洪 跃 李 旭 伟 主 编 李 志 蜀 唐 宁 九 李 涛 主 审 清 华 大 学 出 版 社 北 京 i 内 容 简 介 本 教 材 面 向

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

21928a.book

21928a.book PS080, PowerTool 800 开发软件用户指南 2005 Microchip Technology Inc. DS21928A_CN 请注意以下有关 Microchip 器件代码保护功能的要点 : Microchip 的产品均达到 Microchip 数据手册中所述的技术指标 Microchip 确信 : 在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一

More information

untitled

untitled MCP3421 DS51683A_CN Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Microchip Digital Millennium Copyright Act Microchip Microchip Technology Inc. Microchip

More information

21999a_cn.book

21999a_cn.book 1.5A 低 电 压 低 静 态 电 流 LDO 稳 压 器 MCP1727 特 性 输 出 电 流 能 力 为 1.5A 输 入 工 作 电 压 范 围 :2.3V 至 6.0V 可 调 输 出 电 压 范 围 :0.8V 至 5.0V 标 准 固 定 输 入 电 压 : - 0.8V 1.2V 1.8V 2.5V 3.0V 3.3V 和 5.0V 可 根 据 需 要 提 供 其 他 固 定 输

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File

1 Project New Project 1 2 Windows 1 3 N C test Windows uv2 KEIL uvision2 1 2 New Project Ateml AT89C AT89C51 3 KEIL Demo C C File 51 C 51 51 C C C C C C * 2003-3-30 pnzwzw@163.com C C C C KEIL uvision2 MCS51 PLM C VC++ 51 KEIL51 KEIL51 KEIL51 KEIL 2K DEMO C KEIL KEIL51 P 1 1 1 1-1 - 1 Project New Project 1 2 Windows 1 3 N C test

More information

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor

(Load Project) (Save Project) (OffLine Mode) (Help) Intel Hex Motor 1 4.1.1.1 (Load) 14 1.1 1 4.1.1.2 (Save) 14 1.1.1 1 4.1.2 (Buffer) 16 1.1.2 1 4.1.3 (Device) 16 1.1.3 1 4.1.3.1 (Select Device) 16 2 4.1.3.2 (Device Info) 16 2.1 2 4.1.3.3 (Adapter) 17 2.1.1 CD-ROM 2 4.1.4

More information

51 C 51 isp 10 C PCB C C C C KEIL

51 C 51 isp 10   C   PCB C C C C KEIL http://wwwispdowncom 51 C " + + " 51 AT89S51 In-System-Programming ISP 10 io 244 CPLD ATMEL PIC CPLD/FPGA ARM9 ISP http://wwwispdowncom/showoneproductasp?productid=15 51 C C C C C ispdown http://wwwispdowncom

More information

华恒家庭网关方案

华恒家庭网关方案 LINUX V1.5 1 2 1 2 LINUX WINDOWS PC VC LINUX WINDOWS LINUX 90% GUI LINUX C 3 REDHAT 9 LINUX PC TFTP/NFS http://www.hhcn.com/chinese/embedlinux-res.html minicom NFS mount C HHARM9-EDU 1 LINUX HHARM9-EDU

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

ARM中C和汇编混合编程及示例.doc

ARM中C和汇编混合编程及示例.doc ARM 中 C 和汇编混合编程及示例 在嵌入式系统开发中, 目前使用的主要编程语言是 C 和汇编,C++ 已经有相应的编译器, 但是现在使用还是比较少的 在稍大规模的嵌入式软件中, 例如含有 OS, 大部分的代码都是用 C 编写的, 主要是因为 C 语言的结构比较好, 便于人的理解, 而且有大量的支持库 尽管如此, 很多地方还是要用到汇编语言, 例如开机时硬件系统的初始化, 包括 CPU 状态的设定,

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

EK-STM32F

EK-STM32F STMEVKIT-STM32F10xx8 软 件 开 发 入 门 指 南 目 录 1 EWARM 安 装... 1 1.1 第 一 步 : 在 线 注 册... 1 1.2 第 二 步 : 下 载 软 件... 2 1.3 第 三 步 : 安 装 EWARM... 3 2 基 于 STMEVKIT-STM32F10xx8 的 示 例 代 码 运 行... 6 2.1 GPIO Demo... 6 2.2

More information

51686A.book

51686A.book MPLAB C32 C 编译器用户指南 2008 Microchip Technology Inc. DS51686A_CN 请注意以下有关 Microchip 器件代码保护功能的要点 : Microchip 的产品均达到 Microchip 数据手册中所述的技术指标 Microchip 确信 : 在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一 目前, 仍存在着恶意

More information

新・解きながら学ぶC言語

新・解きながら学ぶC言語 330!... 67!=... 42 "... 215 " "... 6, 77, 222 #define... 114, 194 #include... 145 %... 21 %... 21 %%... 21 %f... 26 %ld... 162 %lf... 26 %lu... 162 %o... 180 %p... 248 %s... 223, 224 %u... 162 %x... 180

More information

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha

C PICC C++ C++ C C #include<pic.h> C static volatile unsigned char 0x01; static volatile unsigned char 0x02; static volatile unsigned cha CYPOK CYPOK 1 UltraEdit Project-->Install Language Tool: Language Suite----->hi-tech picc Tool Name ---->PICC Compiler Executable ---->c:hi-picinpicc.exe ( Command-line Project-->New Project-->File Name--->myc

More information

C/C++程序设计 - 字符串与格式化输入/输出

C/C++程序设计 - 字符串与格式化输入/输出 C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int

More information

封面.PDF

封面.PDF Microsoft C Writing Clean Code Microsoft Techniques for Developing Bug-free C Programs Steve Maguire 1 1 2 8 3 31 4 53 5 60 6 75 7 98 8 115 129 A 130 B 133 C 140 160 Beth Joseph Julia Maguire lint

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

untitled

untitled 不 料 料 例 : ( 料 ) 串 度 8 年 數 串 度 4 串 度 數 數 9- ( ) 利 數 struct { ; ; 數 struct 數 ; 9-2 數 利 數 C struct 數 ; C++ 數 ; struct 省略 9-3 例 ( 料 例 ) struct people{ char name[]; int age; char address[4]; char phone[]; int

More information

新・明解C言語入門編『索引』

新・明解C言語入門編『索引』 !... 75!=... 48 "... 234 " "... 9, 84, 240 #define... 118, 213 #include... 148 %... 23 %... 23, 24 %%... 23 %d... 4 %f... 29 %ld... 177 %lf... 31 %lu... 177 %o... 196 %p... 262 %s... 242, 244 %u... 177

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 9 [P.11] : Dev C++ [P.12] : http://c.feis.tw [P.13] [P.14] [P.15] [P.17] [P.23] Dev C++ [P.24] [P.27] [P.34] C / C++ [P.35] 10 C / C++ C C++ C C++ C++ C ( ) C++

More information

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023)

( CIP) /. :, ( ) ISBN TP CIP ( 2005) : : : : * : : 174 ( A ) : : ( 023) : ( 023) ( CIP) /. :, 2005. 2 ( ) ISBN 7-5624-3339-9.......... TP311. 1 CIP ( 2005) 011794 : : : : * : : 174 ( A ) :400030 : ( 023) 65102378 65105781 : ( 023) 65103686 65105565 : http: / /www. cqup. com. cn : fxk@cqup.

More information

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默

试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期  开放本科  期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默 试卷代号 :1253 座位号 E 口 国家开放大学 ( 中央广播电视大学 )2014 年秋季学期 " 开放本科 " 期末考试 C 语言程序设计 A 试题 2015 年 1 月 E 四! 五 总分! 一 单选题 ( 每小题 2 分, 共 20 分 ) 1. 由 C 语言源程序文件编译而成的目标文件的默认扩展名为 ( ) A. cpp B. c C. exe D. obj 2. 设 x 和 y 均为逻辑值,

More information

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un

1 LINUX IDE Emacs gcc gdb Emacs + gcc + gdb IDE Emacs IDE C Emacs Emacs IDE ICE Integrated Computing Environment Emacs Unix Linux Emacs Emacs Emacs Un Linux C July 27, 2016 Contents 1 Linux IDE 1 2 GCC 3 2.1 hello.c hello.exe........................... 5 2.2............................... 9 2.2.1 -Wall................................ 9 2.2.2 -E..................................

More information

Andes Technology PPT Temp

Andes Technology PPT Temp 晶心科技線上技術研討會 AndesCore 便捷的全 C 嵌入式编程 晶心科技市場及技術服務部毛礼杰軟件經理 WWW.ANDESTECH.COM 大纲 系统初始化介绍 异常和中断说明 全 C 语法例子说明 总结 2 CPU 相关特性 1: 中断向量表 系统初始化 (1) 2: 系统寄存器 通常需要用 assembly( 汇编 / 组合 ) 语言来操作 AndesCore 全 C 嵌入式编程 C 扩展语法

More information

C++ 程式設計

C++ 程式設計 C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

21498c_cn.book

21498c_cn.book 精密温度 - 电压转换器 特性 工作电压范围 : - TC147:2.7V 至 4.4V - TC147A:2.5V 至 5.5V 宽温度测量范围 : - -4 C 至 +125 C 温度转换精度高 : - 在 25 C 时为 ±2 C ( 最大值 ) 线性温度斜率 :1 mv/ C ( 典型值 ) 提供 3 引脚 SOT-23B 封装 低工作电流 : - 35 µa 典型值 应用 移动电话 电源过热关断控制

More information

CTMU Temperature Measurement AN.book

CTMU Temperature Measurement AN.book 利用 PIC MCU 中的 CTMU 测量温度 TB3016 作者 : 最新一代 PIC24F 和 PIC18F 器件包含的充电时间测量单元 (Charge Time Measurement Unit,CTMU) 使用恒流源来计算电容值的变化以及事件的间隔时间 运用半导体物理学的基本原理, 同样的电流源也可用来测量温度 这允许使用普通而廉价的二极管来取代相对昂贵的热敏电阻和温度传感器 本技术简介描述了使用

More information

文件名

文件名 MICROCHIP PIC10F200/202/204/206 6 8 FLASH PIC10F200 PIC10F202 PIC10F204 PIC10F206 RISC CPU 33 12 8 8 4MHz 1 s 4MHz 1% TM ICSP TM ICD POR DRT WDT RC MCLR I/O /CMOS < 350 A @ 2V 4 MHz 100 na @ 2V FLASH 10000

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

untitled

untitled A, 3+A printf( ABCDEF ) 3+ printf( ABCDEF ) 2.1 C++ main main main) * ( ) ( ) [ ].* ->* ()[] [][] ** *& char (f)(int); ( ) (f) (f) f (int) f int char f char f(int) (f) char (*f)(int); (*f) (int) (

More information

33023A.book(31001A_cn.fm)

33023A.book(31001A_cn.fm) 1 第 1 章 简 介 简 介 目 录 本 章 包 括 下 面 一 些 主 要 内 容 : 1.1 简 介...1-2 1.2 本 手 册 的 宗 旨... 1-3 1.3 器 件 结 构... 1-4 1.4 开 发 支 持... 1-6 1.5 器 件 种 类... 1-7 1.6 格 式 和 符 号 的 约 定... 1-12 1.7 相 关 文 档... 1-14 1.8 相 关 应 用 笔

More information

PIC18F65J90/85J90 Product Brief

PIC18F65J90/85J90 Product Brief 采用纳瓦技术内置 LCD 驱动器的 64/80 引脚高性能单片机 单片机的特殊性能 : 闪存程序存储器可承受 1000 次擦写 ( 典型值 ) 闪存数据保存时间为 20 年 ( 典型值 ) 软件控制下可自编程 中断具有优先级 8 x 8 单周期硬件乘法器 扩展的看门狗定时器 (Watchdog Timer, WDT): - 周期从 4 ms 到 131s, 可编程设定 通过两个引脚可进行在线串行编程

More information

新版 明解C++入門編

新版 明解C++入門編 511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++;

int *p int a 0x00C7 0x00C7 0x00C int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; Memory & Pointer trio@seu.edu.cn 2.1 2.1.1 1 int *p int a 0x00C7 0x00C7 0x00C7 2.1.2 2 int I[2], *pi = &I[0]; pi++; char C[2], *pc = &C[0]; pc++; float F[2], *pf = &F[0]; pf++; 2.1.3 1. 2. 3. 3 int A,

More information

Microsoft PowerPoint - 01_Introduction.ppt

Microsoft PowerPoint - 01_Introduction.ppt Hello, World C 程序设计语言 第 1 章章观其大略 孙志岗 sun@hit.edu.cn http://sunner.cn prf("hello,, world\n"); 超级无敌考考你 : 如何把 hello 和 world 分别打印在两行? 2004-12-19 A Tutorial Introduction 2 hello.c 打印华氏温度与摄氏温度对照表 计算公式 : C=(5/9)(

More information

c_cpp

c_cpp C C++ C C++ C++ (object oriented) C C++.cpp C C++ C C++ : for (int i=0;i

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC, LCD LC

,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC, LCD LC LCD PIC 单片机解决方案 集成 LCD 驱动器模块的 PIC 单片机 www.microchip.com/lcd ,Microchip Technology PIC LCD, PIC16F913/914/ 916/917/946 PIC18F6390/6490/8390/8490 PIC16F65J90/85J90 Microchip LCD LCD, Microchip 的优势 LCD PIC,

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页

一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 第 1 页共 32 页 crm Mobile V1.0 for IOS 用户手册 一 登录 crm Mobile 系统 : 输入 ShijiCare 用户名和密码, 登录系统, 如图所示 : 第 2 页共 32 页 二 crm Mobile 界面介绍 : 第 3 页共 32 页 三 新建 (New) 功能使用说明 1 选择产品 第 4 页共 32 页 2 填写问题的简要描述和详细描述 第 5 页共

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

C

C C 2017 3 14 1. 2. 3. 4. 2/95 C 1. 3/95 C I 1 // talkback.c: 2 #include 3 #include 4 #define DENSITY 62.4 5 int main(void) 6 { 7 float weight, volume; 8 int size; 9 unsigned long letters;

More information

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc 2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.

More information

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout

More information

Static Enforcement of Security with Types

Static Enforcement of Security with Types 例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40; static long aa = 10; func(

More information

untitled

untitled 3 C++ 3.1 3.2 3.3 3.4 new delete 3.5 this 3.6 3.7 3.1 3.1 class struct union struct union C class C++ C++ 3.1 3.1 #include struct STRING { typedef char *CHARPTR; // CHARPTR s; // int strlen(

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 在第 2 章中已经对 C 语言变量的声明 定义及初始化进行了介绍, 并简单介绍了 C 语言变量的作用域, 本章将对变量的存储方式进行详细的介绍, 不同存储方式的变量有不同的生命期, 作用域也各不相同 通过对 C 语言变量存储方式的介绍, 使更加深入的了解 C 语言变量的作用域的工作原理 本章讲述的知识点包括 : C 语言变量的生存期和作用域 ; C 语言局部变量与全局变量 ; C 语言变量的存储方式

More information

00966A.book

00966A.book SPI 串行 EEPROM 与 PICmicro 单片机的接口设计 作者 : 引言 Martin Kvasnicka Microchip Technology Inc. 目前市场上有许多种单片机用在嵌入式控制系统设计中, 这些嵌入式控制系统中的很大一部分都要用到非易失性存储器 由于串行 EEPROM 具有封装尺寸小, 存储容量灵活, 对 I/O 引脚要求低, 和低功耗低成本等特点, 已成为非易失性存储器的首选

More information

C/C++ - 字符串与字符串函数

C/C++ - 字符串与字符串函数 C/C++ Table of contents 1. 2. 3. 4. 1 char C 2 char greeting [50] = " How " " are " " you?"; char greeting [50] = " How are you?"; 3 printf ("\" Ready, go!\" exclaimed John."); " Ready, go!" exclaimed

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7> 能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年 移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 预处理 2 预处理器 C 语言的编译系统分为编译预处理和正式编译 预处理作用 : 对源程序编译之前做一些处理, 生成扩展 C 源程序 预处理器的行为是由预处理指令控制的 宏定义 文件包含 条件编译 #define #ifdef

More information

ebook8-30

ebook8-30 3 0 C C C C C C++ C + + C++ GNU C/C++ GNU egcs UNIX shell s h e l l g a w k P e r l U N I X I / O UNIX shell awk P e r l U N I X C C C C C C U N I X 30.1 C C U N I X 70 C C U N I X U N I X U N I X C Dennis

More information

TB3109 PIC32MX 器件中与 USB 模块相关的更改 USB 模块中断位 ( 即 USBIF USBIE USBIP 和 USBIS 位 ) 的位置变化会影响 PIC32MX 器件上的 USB 协议栈操作 表 1 给出了所列 PIC32MX 器件系列中 USBIF USBIE USBIP

TB3109 PIC32MX 器件中与 USB 模块相关的更改 USB 模块中断位 ( 即 USBIF USBIE USBIP 和 USBIS 位 ) 的位置变化会影响 PIC32MX 器件上的 USB 协议栈操作 表 1 给出了所列 PIC32MX 器件系列中 USBIF USBIE USBIP 在 v2013-06-15 MLA USB 设备和主机协议栈中更新 PIC32MX 支持 TB3109 简介 我们提供适合 PIC32MX MCU 的 Microchip 应用程序库 (Microchip Libraries for Applications,MLA), 但未计划向 MLA 添加新功能 v2013-06-15 MLA USB 协议栈本质上支持所有适用的 PIC32MX MCU 器件

More information

PIC32 Starter Kit User’s Guide

PIC32 Starter Kit User’s Guide PIC32 入门工具包用户指南 2010 Microchip Technology Inc. DS61159B_CN 请注意以下有关 Microchip 器件代码保护功能的要点 : Microchip 的产品均达到 Microchip 数据手册中所述的技术指标 Microchip 确信 : 在正常使用的情况下, Microchip 系列产品是当今市场上同类产品中最安全的产品之一 目前, 仍存在着恶意

More information

科学计算的语言-FORTRAN95

科学计算的语言-FORTRAN95 科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

Microsoft PowerPoint - string_kruse [兼容模式]

Microsoft PowerPoint - string_kruse [兼容模式] Strings Strings in C not encapsulated Every C-string has type char *. Hence, a C-string references an address in memory, the first of a contiguous set of bytes that store the characters making up the string.

More information

Computer Architecture

Computer Architecture ECE 3120 Computer Systems Assembly Programming Manjeera Jeedigunta http://blogs.cae.tntech.edu/msjeedigun21 Email: msjeedigun21@tntech.edu Tel: 931-372-6181, Prescott Hall 120 Prev: Basic computer concepts

More information

Converting image (bmp/jpg) file into binary format

Converting image (bmp/jpg) file into binary format RAiO Image Tool 操作说明 Version 1.0 July 26, 2016 RAiO Technology Inc. Copyright RAiO Technology Inc. 2013 RAiO TECHNOLOGY INC. www.raio.com.tw Revise History Version Date Description 0.1 September 01, 2014

More information

* 4 6 R P r p . 1 2 3 4 7 89bk 6 5 1 2 3 4 5 6 7 8 9 0 bk r bl bm bn^ bo bl br bq bpbo bn bm [ ] [ ] [ ] bp 8 2 4 6 bq p [ ] [SET] br clckbt bs bs bt ck cl. 1 2 1 2+- 3 3 . 1 2 3 4 5 6 7 8 9 bk bl bm

More information

01018A.book

01018A.book 使用 C18 编译器进行 SPI 串行 EEPROM 与 PIC18 单片机的接口设计 作者 : 引言 Chris Parris Microchip Technology Inc. Microchip Technology 生产的 25XXX 系列串行 EEPROM 兼容 SPI 通信标准, 最大时钟频率范围从 3MHz 到 20 MHz 许多时候, 在设计利用串行 EEPROM 器件的应用时, 使用非专用

More information

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO Car DVD New GUI IR Flow User Manual V0.1 Jan 25, 2008 19, Innovation First Road Science Park Hsin-Chu Taiwan 300 R.O.C. Tel: 886-3-578-6005 Fax: 886-3-578-4418 Web: www.sunplus.com Important Notice SUNPLUS

More information

61127c_cn.book

61127c_cn.book 1 第 1 章 简 介 简 介 目 录 本 章 包 括 下 列 主 题 : 1.1 简 介... 1-2 1.2 本 手 册 的 目 标... 1-2 1.3 器 件 结 构... 1-2 1.4 开 发 支 持... 1-4 1.5 样 式 和 符 号 约 定... 1-4 1.6 相 关 文 档... 1-6 1.7 版 本 历 史... 1-7 2010 Microchip Technology

More information

C语言的应用.PDF

C语言的应用.PDF AVR C 9 1 AVR C IAR C, *.HEX, C,,! C, > 9.1 AVR C MCU,, AVR?! IAR AVR / IAR 32 ALU 1KBytes - 8MBytes (SPM ) 16 MBytes C C *var1, *var2; *var1++ = *--var2; AVR C 9 2 LD R16,-X ST Z+,R16 Auto (local

More information

00975A.book

00975A.book 使用 MSSP 模块进行 Microwire 串行 EEPROM 与 PIC16 器件的接口设计 作者 : 引言 Martin Kvasnicka Microchip Technology Inc. 目前市场上有许多种单片机用在嵌入式控制系统设计中, 这些嵌入式控制系统中的很大一部分都要用到非易失性存储器 由于串行 EEPROM 具有封装尺寸小, 存储容量灵活, 对 I/O 引脚要求低, 和低功耗低成本等特点,

More information

21666b.book

21666b.book 具 有 关 断 功 能 的 80 ma 小 型 CMOS LDO TC1016 特 性 节 省 空 间 的 5 引 脚 SC-70 和 SOT-23 封 装 极 低 的 工 作 电 流, 利 于 延 长 电 池 寿 命 : 典 型 值 53 µa 很 低 的 电 压 差 (Dropout Voltage) 额 定 输 出 电 流 :80 ma 仅 需 一 个 1µF 的 陶 瓷 输 出 电 容 高

More information