51284F.book

Size: px
Start display at page:

Download "51284F.book"

Transcription

1 MPLAB C30 C 编译器用户指南 2007 Microchip Technology Inc. DS51284F_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 KEELOQ 徽标 microid MPLAB PIC PICmicro PICSTART PRO MATE rfpic 和 SmartShunt 均为 Microchip Technology Inc. 在美国和其他国家或地区的注册商标 AmpLab FilterLab Linear Active Thermistor Migratable Memory MXDEV MXLAB SEEVAL SmartSensor 和 The Embedded Control Solutions Company 均为 Microchip Technology Inc. 在美国的注册商标 Analog-for-the-Digital Age Application Maestro CodeGuard dspicdem dspicdem.net dspicworks dsspeak ECAN ECONOMONITOR FanSense FlexROM fuzzylab In-Circuit Serial Programming ICSP ICEPIC Mindi MiWi MPASM MPLAB Certified 徽标 MPLIB MPLINK PICkit PICDEM PICDEM.net PICLAB PICtail PowerCal PowerInfo PowerMate PowerTool REAL ICE rflab Select Mode Smart Serial SmartTel Total Endurance UNI/O WiperLock 和 ZENA 均为 Microchip Technology Inc. 在美国和其他国家或地区的商标 SQTP 是 Microchip Technology Inc. 在美国的服务标记 在此提及的所有其他商标均为各持有公司所有 2007, Microchip Technology Inc. 版权所有 Microchip 位于美国亚利桑那州 Chandler 和 Tempe 与位于俄勒冈州 Gresham 的全球总部 设计和晶圆生产厂及位于美国加利福尼亚州和印度的设计中心均通过了 ISO/TS-16949:2002 认证 公司在 PIC MCU 与 dspic DSC KEELOQ 跳码器件 串行 EEPROM 单片机外设 非易失性存储器和模拟产品方面的质量体系流程均符合 ISO/TS :2002 此外, Microchip 在开发系统的设计和生产方面的质量体系也已通过了 ISO 9001:2000 认证 DS51284F_CN 第 ii 页 2007 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 简介 主要内容 概述 文件命名约定 选项 环境变量 预定义常量 通过命令行编译单个文件 通过命令行编译多个文件 Microchip Technology Inc. DS51284F_CN 第 iii 页

4 MPLAB C30 用户指南 第 4 章 MPLAB C30 C 编译器运行时环境 4.1 简介 主要内容 地址空间 代码段和数据段 启动和初始化 存储空间 存储模型 定位代码和数据 软件堆栈 C 堆栈使用 C 堆使用 函数调用约定 寄存器约定 位反转寻址和模寻址 程序空间可视性 (PSV) 的使用 第 5 章数据类型 5.1 简介 主要内容 数据表示 整型 浮点型 指针 第 6 章器件支持文件 6.1 简介 主要内容 处理器头文件 寄存器定义文件 使用特殊功能寄存器 使用宏 从 C 代码访问 EEDATA 仅适用于 dspic30f dsc 第 7 章中断 7.1 简介 主要内容 编写中断服务程序 写中断向量 中断服务程序现场保护 中断响应时间 中断嵌套 允许 / 禁止中断 中断服务程序和主程序代码共用存储空间 中断服务程序中 PSV 的使用 DS51284F_CN 第 iv 页 2007 Microchip Technology Inc.

5 目录 第 8 章汇编语言和 C 模块混合编程 8.1 简介 主要内容 在汇编语言中使用 C 变量和 C 函数 使用行内汇编 附录 A 实现定义的操作 A.1 简介 A.2 主要内容 A.3 翻译 A.4 环境 A.5 标识符 A.6 字符 A.7 整型 A.8 浮点型 A.9 数组和指针 A.10 寄存器 A.11 结构 联合 枚举和位域 A.12 限定符 A.13 声明符 A.14 语句 A.15 预处理伪指令 A.16 库函数 A.17 信号 A.18 流和文件 A.19 tmpfile A.20 errno A.21 存储器 A.22 abort A.23 exit A.24 getenv A.25 系统 A.26 strerror 附录 B MPLAB C30 内建函数 B.1 简介 B.2 内建函数列表 附录 C MPLAB C30 C 编译器诊断 C.1 简介 C.2 错误 C.3 警告 Microchip Technology Inc. DS51284F_CN 第 v 页

6 MPLAB C30 用户指南 附录 D MPLAB C18 与 MPLAB C30 C 编译器 D.1 简介 D.2 主要内容 D.3 数据格式 D.4 指针 D.5 存储类别 D.6 堆栈使用 D.7 存储限定符 D.8 预定义宏名 D.9 整型的提升 D.10 字符串常量 D.11 快速操作存储区 D.12 行内汇编 D.13 Pragma 伪指令 D.14 存储模型 D.15 调用约定 D.16 启动代码 D.17 编译器管理的资源 D.18 优化 D.19 目标模块格式 D.20 实现定义的操作 D.21 位域 附录 E 不赞成使用的特性 E.1 简介 E.2 主要内容 E.3 预定义常量 附录 F ASCII 字符集附录 G GNU 自由文档许可证 G.1 前言 G.2 适用性和定义 G.3 逐字复制 G.4 大量复制 G.5 修改 G.6 合并文档 G.7 文档的合集 G.8 独立作品的聚合体 G.9 翻译 G.10 终止 G.11 本许可证的未来修订版本 术语表 索引 全球销售及服务网点 DS51284F_CN 第 vi 页 2007 Microchip Technology Inc.

7 MPLAB C30 用户指南 前言 客户须知 所有文档均会过时, 本文档也不例外 Microchip 的工具和文档将不断演变以满足客户的需求, 因此实际使用中有些对话框和 / 或工具说明可能与本文档所述之内容有所不同 请访问我们的网站 ( 获取最新文档 文档均标记有 DS 编号 该编号出现在每页底部的页码之前 DS 编号的命名约定为 DSXXXXXA, 其中 XXXXX 为文档编号, A 为文档版本 欲了解开发工具的最新信息, 请参考 MPLAB IDE 在线帮助 从 Help ( 帮助 ) 菜单选择 Topics ( 主题 ), 打开现有在线帮助文件列表 简介 本章包含在使用 MPLAB C30 之前需要了解的一般信息 本章讨论内容包括 : 文档编排 推荐读物 Microchip 网站 开发系统变更通知客户服务 客户支持 2007 Microchip Technology Inc. DS51284F_CN 第 1 页

8 MPLAB C30 用户指南 文档编排 本文档介绍如何使用 GNU 语言工具为 16 位应用编写代码 内容安排如下 : 第 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 内建函数 列出了 C 编译器 MPLAB C30 的内建函数 附录 C:MPLAB C30 诊断信息 列出由 MPLAB C30 产生的错误和警告消息 附录 D:MPLAB C18 和 MPLAB C30 的差别 介绍 PIC18XXXXX 编译器 (MPLAB C18) 和 dspic DSC 编译器 (MPLAB C30) 的主要区别 附录 E: 不赞成使用的特性 详述视为过时的特性 附录 F:ASCII 字符集 介绍 ASCII 字符集 附录 G:GNU 自由文档许可证 Free Software Foundation 的使用许可证 DS51284F_CN 第 2 页 2007 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 New 字体 : 常规 Courier 源代码示例 #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...] 图标 仅完全版软件支持的功能 并非所有的器件都支持此功能 所支持器件将在标题或正文中列出 2007 Microchip Technology Inc. DS51284F_CN 第 3 页

10 MPLAB C30 用户指南 推荐读物 本文档介绍如何使用 MPLAB C30 编译器 下面列出了其他有用的文档 Microchip 提供了如下文档, 推荐将这些文档作为补充参考资料 Readme 文件关于 Microchip 工具的最新信息, 请阅读软件附带的相关 Readme 文件 (HTML 文本文件 ) 16 位语言工具入门 (DS70094C_CN) 关于安装和使用 Microchip 16 位器件语言工具 (MPLAB ASM30 MPLAB LINK30 和 MPLAB C30) 的指南 同时提供了使用 16 位软件模拟器 SIM30 (MPLAB SIM 的一个组件 ) 的示例 MPLAB ASM30 MPLAB LINK30 和实用程序用户指南 (DS51317F_CN) 指导如何使用 16 位汇编器 MPLAB ASM30 目标链接器 MPLAB LINK30 和各种实用程序, 包括 MPLAB LIB30 归档程序 / 库管理器 16 位语言工具函数库 (DS51456D_CN) 对 Microchip 16 位器件的各函数库进行了描述, 包括 DSP 函数库 标准函数库 ( 其中包括数学函数库 ) 以及 MPLAB C30 内建函数 16 位外设函数库在随每个外设函数库类型提供的 Readme 文件中描述 针对器件的文档 Microchip 网站上提供了许多描述 16 位器件功能和特性的文档, 其中包含 : 具体器件以及器件系列的数据手册 器件系列的参考手册 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 程序在多种计算机系统上的可移植性 可靠性 可维护性及执行效率 DS51284F_CN 第 4 页 2007 Microchip Technology Inc.

11 前言 MICROCHIP 网站 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 Microchip 网站 ( 为客户提供在线支持 客户可通过该网站方便地获取文件和信息 只要使用常用的因特网浏览器即可访问 网站提供以下信息 : 产品支持 数据手册和勘误表 应用笔记和样本程序 设计资源 用户指南以及硬件支持文档 最新的软件版本以及存档软件 一般技术支持 常见问题 (FAQ) 技术支持请求 在线讨论组以及 Microchip 顾问计划成员名单 Microchip 业务 产品选型和订购指南 最新 Microchip 新闻稿 研讨会和活动安排表 Microchip 销售办事处 代理商以及工厂代表列表 2007 Microchip Technology Inc. DS51284F_CN 第 5 页

12 MPLAB C30 用户指南 开发系统变更通知客户服务 客户支持 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 REAL ICE TM MPLAB ICE 2000 和 MPLAB ICE 4000 仿真器 在线调试器 Microchip 在线调试器 MPLAB ICD 2 的最新信息 MPLAB IDE 关于开发系统工具的 Windows 集成开发环境 Microchip MPLAB IDE 的最新信息, 主要针对 MPLAB IDE MPLAB IDE 项目管理器 MPLAB 编辑器 MPLAB SIM 软件模拟器以及一般的编辑和调试功能 编程器 Microchip 编程器的最新信息, 包括 MPLAB PM3 和 PRO MATE II 器件编程器以及 PICSTART Plus 和 PICkit 1 开发编程器 Microchip 产品的用户可通过以下渠道获得帮助 : 代理商或代表 当地销售办事处 应用工程师 (FAE) 技术支持客户应联系其代理商 代表或应用工程师 (FAE) 寻求支持 当地销售办事处也可为客户提供帮助 本文档后附有销售办事处的联系方式 也可通过 获得网上技术支持 DS51284F_CN 第 6 页 2007 Microchip Technology Inc.

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

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

16 MPLAB C30 用户指南 注 : DS51284F_CN 第 10 页 2007 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 引用类型 2007 Microchip Technology Inc. DS51284F_CN 第 11 页

18 MPLAB C30 用户指南 指定变量的属性 MPLAB C30 的关键字 attribute 用来指定变量或结构位域的特殊属性 关键字后的双括弧中的内容是属性说明 下面是目前支持的变量属性 : address (addr) aligned (alignment) boot deprecated far mode (mode) near noload packed persistent reverse (alignment) section ("section-name") secure sfr (address) space (space) transparent_union unordered unused weak weak 也可以通过在关键字前后使用 ( 双下划线 ) 来指定属性 ( 例如, 用 aligned 代替 aligned) 这样将使你在头文件中使用它们时不必考虑会出现与宏同名的情况 要指定多个属性, 可在双括弧内用逗号将属性分隔开, 例如 : attribute ((aligned (16), packed)) 注 : 一个项目中对变量属性的使用要一致, 这很重要 例如, 如果在文件 A 中用 far 属性定义了一个变量, 在文件 B 中将其声明为 extern 而不带 far, 就可能导致链接错误 address (addr) address 属性为变量指定绝对地址 这一属性可与 section 属性同时使用, 这可用于从特定地址开始定义一组变量 : int foo attribute ((section("mysection"),address(0x900))); int bar attribute ((section("mysection"))); int baz attribute ((section("mysection"))); 带 address 属性的变量不能存放到 auto_psv 空间 ( 参见 space() 属性或 -mconst-in-code 选项 ); 这样做会产生警告, 且编译器将此变量存放到 PSV 空间 如果要将变量存放到 PSV 段, 地址应为程序存储器地址 int var attribute ((address(0x800))); DS51284F_CN 第 12 页 2007 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 属性冲突, 同时指定两者会产生错误 aligned 属性可与 section 属性一起使用, 这允许对指定段使用对齐 默认情况下, 当未指定段时, 编译器将为变量生成一个独特的段 这样, 链接器不必使用内部填充 ( 如果其他定义出现在同一个对齐的段中, 可能会使用内部填充 ) 就可以满足对齐的限制 boot 这一属性可用于在引导段 (Boot Segment, BS) RAM 中定义受保护的变量 : int attribute ((boot)) boot_dat[16]; 定义到 BS RAM 中的变量在启动时不被初始化, 因此必须使用主代码来初始化 BS RAM 中的所有变量 如果为 boot 变量指定初始值将会报告诊断消息 下面是初始化的一个示例 : int attribute ((boot)) time = 0; /* not supported */ int attribute ((boot)) time2; void attribute ((boot)) foo() { time2 = 55; /* initial value must be assigned explicitly */ } deprecated deprecated 属性使得包含这一属性的声明能被编译器特别识别到 当使用 deprecated 函数或变量时, 编译器会发出警告 deprecated 定义仍将被编译器执行, 并被反映到目标文件中 例如, 编译以下程序 : int attribute (( deprecated )) i; int main() { return i; } 将产生警告 : 2007 Microchip Technology Inc. DS51284F_CN 第 13 页

20 MPLAB C30 用户指南 deprecated.c:4: warning: `i' is deprecated (declared at deprecated.c:1) 在生成的目标文件中, 仍以通常的方式定义了 i far far 属性告知编译器不必将变量分配到 near( 前 8 KB) 数据空间中 ( 即变量可以分配到数据存储器中的任何地址 ) 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 }; DS51284F_CN 第 14 页 2007 Microchip Technology Inc.

21 MPLAB C30 与 ANSI C 的差别 packed packed 属性指定变量或结构位域采用最小的可能对齐方式 变量占一个字节, 位域占一位, 除非用 aligned 属性指定了一个更大的值 下面的结构中位域 x 被压缩, 所以它紧接在 a 之后 : struct foo { char a; int x[2] attribute ((packed)); }; 注 : 器件架构要求字按偶数字节边界对齐, 因此在使用 packed 属性时要特别小心, 避免运行时寻址错误 persistent persistent 属性指定在启动时变量不应被初始化或清零 具有 persistent 属性的变量可用于存储器件复位后仍保持有效的状态信息 int last_mode attribute ((persistent)); persistent 数据通常不被 C 运行时初始化 但是, 冷启动时, persistent 数据可能不具有任何有意义的值 下面的代码示例说明了如何安全地初始化这种数据 : #include "p24fxxxx.h" int last_mode attribute ((persistent)); int main() { if ((RCONbits.POR == 0) && (RCONbits.BOR == 0)) { /* last_mode is valid */ } else { /* initialize persistent data */ last_mode = 0; } } 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 空间 2007 Microchip Technology Inc. DS51284F_CN 第 15 页

22 MPLAB C30 用户指南 section ("section-name") 默认情况下, 编译器将其生成的目标代码存放在.data 和.bss 段中 section 属性允许指定变量 ( 或函数 ) 存放到特定的段中 struct array {int i[32];} struct array buf attribute ((section("userdata"))) = {0}; section 属性与 address 和 reverse 属性冲突 在这两种冲突情形下, 段名将被忽略, 并发出警告 这一属性还可能会与 space 属性冲突 更多信息, 参见关于 space 属性的说明 secure 这一属性可用于在安全段 (Secure Segment, SS) RAM 中定义被保护的变量 : int attribute ((secure)) secure_dat[16]; 定义到 SS RAM 中的变量在启动时不被初始化 因此 SS RAM 中的所有变量必须使用内联代码来初始化 如果对 secure 变量指定初始值, 将报告警告消息 可使用内联代码将字符串常量赋值给 secure 变量, 但需要编译器进行额外处理 例如 : char *msg attribute ((secure)) = "Hello!\n"; /* not supported */ char *msg2 attribute ((secure)); void attribute ((secure)) foo2() { *msg2 = "Goodbye..\n"; /* value assigned explicitly */ } 在这种情况下, 必须将字符串常量分配到使用此变量的函数可访问的存储空间中 编译器将把字符串分配到为安全段指定的 psv 常量段中 DS51284F_CN 第 16 页 2007 Microchip Technology Inc.

23 MPLAB C30 与 ANSI C 的差别 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 使用可能有用 2007 Microchip Technology Inc. DS51284F_CN 第 17 页

24 MPLAB C30 用户指南 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 值 这个特征很有用, 主要用于提供与任意库链接的通用代码 DS51284F_CN 第 18 页 2007 Microchip Technology Inc.

25 MPLAB C30 与 ANSI C 的差别 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 定义的情况下, 链接器才选择为第一个这种定义分配存储空间 其他定义是不可访问的 无论符号属于什么类型, 操作是相同的 ; 函数和变量具有相同的操作 2007 Microchip Technology Inc. DS51284F_CN 第 19 页

26 MPLAB C30 用户指南 指定函数的属性 在 MPLAB C30 中, 可以对程序中调用的函数进行某些声明, 帮助编译器优化函数调用, 且更准确地检查代码 关键字 _attribute_ 允许在声明时指定特殊的属性 关键字后面紧跟双括弧中的属性说明 目前支持函数的下列属性 : address (addr) alias ("target") auto_psv, no_auto_psv boot 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") secure shadow unused weak 我们也可以通过在关键字前后使用 ( 双下划线 ) 来指定属性 ( 例如, 用 shadow 代替 shadow) 这样使得在头文件中使用它们时不必考虑会出现与宏同名的情况 我们要想在声明中指定多个属性, 可以在双括弧内使用逗号将属性分隔开, 或者在一个属性声明后紧跟另一个属性声明 address (addr) address 属性为函数指定绝对地址 这个属性不能与 section 属性同时使用 ; address 属性优先 void foo() attribute ((address(0x100))) {... } alias ("target") alias 属性为另一个符号声明一个别名, 必须指定这个符号 使用这一属性会产生对对象的外部引用, 必须在链接时解析该引用 DS51284F_CN 第 20 页 2007 Microchip Technology Inc.

27 MPLAB C30 与 ANSI C 的差别 auto_psv, no_auto_psv auto_psv 属性与 interrupt 属性一起使用时, 将使编译器在函数 prologue 中生成额外的代码, 以将 PSVPAG SFR 设置为用于访问 space(auto_psv) 变量 ( 或 constants-in-code 存储模型中的常量 ) 的正确的值 当使用 24 位指针时, 或在产生中断时 PSVPAG 已被修改以及中断服务程序或中断服务程序调用的一个函数使用一个 auto_psv 变量的情况下, 使用这个选项 将这个选项与 no_auto_psv 比较 如果没有为中断服务程序指定 auto_psv 选项, 也没有指定 no_auto_psv 选项, 编译器将发出警告并选择这个选项 (auto_psv 选项 ) no_auto_psv 属性与 interrupt 属性一起使用时, 将使编译器不在函数 prologue 中生成额外的代码来访问 space(auto_psv) 变量 ( 或 constants-in-code 存储模型中的常量 ) 如果 auto_psv 下的所有条件都不为真的话, 使用这个选项 如果没有为中断服务程序指定 auto_psv 选项, 也没有指定 no_auto_psv 选项, 编译器将发出警告并选择 auto_psv 选项 boot 这一属性指示编译器将一个函数分配到程序闪存的 boot 段中 例如, 声明一个被保护的函数 : void attribute ((boot)) func(); 可使用一个可选参数来在 boot 段中指定一个被保护的访问进入点 该参数可以为 0 至 31 范围内的整型立即数 (16 除外 ) 或字 unused 整型参数对应段快速存储区中的 32 个指令入口点, 段快速存储区占用每个安全段中的最低地址范围 值 16 排除在外的原因是访问进入 16 保留给了安全段中断向量 值 unused 用于为快速存储区中所有未使用的入口点指定函数 访问进入点有利于生成不同供应商的应用段, 不同供应商的应用段在运行时组合在一起 可以为外部函数以及局部定义的函数指定访问进入点 例如 : /* an external function that we wish to call */ extern void attribute ((boot(3))) boot_service3(); /* local function callable from other segments */ void attribute ((secure(4))) secure_service4() { boot_service3(); } 指定一个安全中断服务程序, 要配合 interrupt 属性使用 boot 属性 : void attribute ((boot,interrupt)) boot_interrupts(); 当为外部安全函数指定了一个访问进入点时, 为成功进行链接不需要将该函数包含到项目中 对该函数的所有引用都将被解析为闪存中的一个固定地址, 这取决于在链接时选择的安全模型 当为一个局部定义的函数指定了一个访问进入点时, 链接器将向安全段快速存储区中插入一条转移指令 例外情况是访问进入 16, 它被表示为一个向量 ( 即指令地址 ) 而非指令 实际的函数定义将位于快速存储区之外, 因此快速存储区将包含一个跳转表, 通过这个跳转表, 可将控制从另一个安全段转移到定义了进入点的函数 2007 Microchip Technology Inc. DS51284F_CN 第 21 页

28 MPLAB C30 用户指南 Auto 变量自动变量 ( 在函数中定义的变量 ) 与文件作用域变量相比受到更多不同规则的限制 自动变量由使用它的函数所有, 不需要 boot 或 secure 属性 可以为自动变量赋初始值, 如下所示 : void attribute ((boot)) chuck_cookies() { int hurl; int them = 55; char *where = "far"; splat(where); /*... */ } 要注意, where 的初始值基于分配到 PSV 常量段.boot_const 中的字符串常量 进入函数时编译器将 PSVPAG 设置为正确的值 如果需要, 编译器在调用 splat() 之后也将恢复 PSVPAG 的值 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 这种情况下, 编译器仅检查格式字符串的一致性 DS51284F_CN 第 22 页 2007 Microchip Technology Inc.

29 MPLAB C30 与 ANSI C 的差别 在上面的例子中, 格式字符串 (my_format) 是函数 my_print 的第二个参数, 从第三个参数开始检查, 所以 format 属性的正确参数是 2 和 3 format 属性允许识别以格式字符串作为参数的用户自定义函数, 所以 MPLAB C30 可以检查对这些函数的调用有无错误 每当要求这种警告 ( 使用 -Wformat) 时, 编译器总会检查 ANSI 库函数 printf fprintf sprintf scanf fscanf sscanf strftime vprintf vfprintf 和 vsprintf 的格式, 所以不必修改头文件 stdio.h 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 章 中断 当使用 interrupt 属性时, 请指定 auto_psv 或 no_auto_psv 如果这两个选项都未指定, 将发出警告且使用 auto_psv 选项 near near 属性告知编译器可以使用 call 指令的更有效形式调用函数 no_instrument_function 如果指定命令行选项 -finstrument-functions, 那么几乎所有用户函数的入口和出口处在编译时都会被插入 profiling 函数 而函数被指定此选项时将不执行上述操作 2007 Microchip Technology Inc. DS51284F_CN 第 23 页

30 MPLAB C30 用户指南 noload noload 属性指明应该为函数分配空间, 但不应把实际代码装入存储器 如果应用程序设计为在运行时将函数装入存储器 ( 如从串行 EEPROM), 这一属性很有用 void bar() attribute ((noload)) {... } 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 属性有冲突 忽略段名会导致警告 secure 这个属性指示编译器将一个函数分配到程序闪存的 secure 段中 例如, 声明一个被保护的函数 : void attribute ((secure)) func(); 可使用一个可选参数来在 secure 段中指定一个被保护的访问进入点 该参数可以为 0 至 31 范围内的整型立即数 (16 除外 ) 或字 unused 整型参数对应段快速存储区中的 32 个指令时隙, 段快速存储区占用每个安全段中的最低地址范围 值 16 排除在外的原因是访问进入 16 保留给了安全段中断向量 值 unused 用于为快速存储区中所有未使用的时隙指定函数 DS51284F_CN 第 24 页 2007 Microchip Technology Inc.

31 MPLAB C30 与 ANSI C 的差别 访问进入点有利于生成不同供应商的应用段, 不同供应商的应用段在运行时组合在一起 可以为外部函数以及局部定义的函数指定访问进入点 例如 : /* an external function that we wish to call */ extern void attribute ((boot(3))) boot_service3(); /* local function callable from other segments */ void attribute ((secure(4))) secure_service4() { boot_service3(); } 指定一个安全中断服务程序, 要配合 interrupt 属性使用 secure 属性 : void attribute ((secure,interrupt)) secure_interrupts(); 当为外部安全函数指定了一个访问进入点时, 为成功进行链接不需要将该函数包含到项目中 对该函数的所有引用都将被解析为闪存中的一个固定地址, 这取决于在链接时选择的安全模型 当为一个局部定义的函数指定了一个访问进入点时, 链接器将向安全段快速存储区中插入一条转移指令 例外情况是访问进入 16, 它被表示为一个向量 ( 即指令地址 ) 而非指令 实际的函数定义将位于快速存储区之外, 因此快速存储区将包含一个跳转表, 通过这个跳转表, 可将控制从另一个安全段转移到定义了进入点的函数 Auto 变量自动变量 ( 在函数中定义的变量 ) 与文件作用域变量相比受到更多不同规则的限制 自动变量由使用它的函数所有, 不需要 boot 或 secure 属性 可以为自动变量赋初始值, 如下所示 : void attribute ((boot)) chuck_cookies() { int hurl; int them = 55; char *where = "far"; splat(where); /*... */ } 要注意, where 的初始值基于分配到 PSV 常量段.boot_const 中的字符串常量 进入函数时编译器将 PSVPAG 设置为正确的值 如果需要, 编译器也将在调用 splat() 之后恢复 PSVPAG 的值 shadow shadow 属性使编译器使用影子寄存器而不是软件堆栈来保存寄存器 该属性通常与 interrupt 属性同时使用 void attribute ((interrupt, shadow)) _T1Interrupt (void) unused 这个函数属性, 表明函数可能不会被使用 MPLAB C30 不会为这种函数发出未使用函数的警告 2007 Microchip Technology Inc. DS51284F_CN 第 25 页

32 MPLAB C30 用户指南 weak 关于 weak 属性, 参见第 节 指定变量的属性 内联函数 通过声明一个函数为 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, 且函数定义在函数使用之前的情况下, 编译器才会删除内联函数 DS51284F_CN 第 26 页 2007 Microchip Technology Inc.

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

34 MPLAB C30 用户指南 同样不安全的是, 使用一个全局寄存器变量的函数, 通过函数 lose 来调用另外一个这样的函数 foo, 而编译函数 lose 时未知该全局变量 ( 即在未声明该变量的源文件中 ) 这是因为 lose 可能会将其他某个值保存到该寄存器中 例如, 不能在比较函数中使用传递给 qsort 的全局寄存器变量, 因为 qsort 可能已经把其他值存放到该寄存器中了 用相同的全局寄存器变量定义来重新编译 qsort, 可以避免此问题 如果想重新编译实际上没有使用该全局寄存器变量的 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 型的 这种常量只有虚部值, 但是我们可以通过将其与实常数相加来形成任何复数值 DS51284F_CN 第 28 页 2007 Microchip Technology Inc.

35 MPLAB C30 与 ANSI C 的差别 要提取复数值符号 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 2007 Microchip Technology Inc. DS51284F_CN 第 29 页

36 MPLAB C30 用户指南 2.4 语句差别 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 的四个指针的数组类型 本节讲述普通 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 中的数组索引从不这样做 ) DS51284F_CN 第 30 页 2007 Microchip Technology Inc.

37 MPLAB C30 与 ANSI C 的差别 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 表示双字整型的二进制常量 2007 Microchip Technology Inc. DS51284F_CN 第 31 页

38 MPLAB C30 用户指南 注 : DS51284F_CN 第 32 页 2007 Microchip Technology Inc.

39 第 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 2007 Microchip Technology Inc. DS51284F_CN 第 33 页

40 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 语言的选项 警告与错误控制选项 调试选项 控制优化的选项 控制预处理器的选项 汇编选项 链接选项 目录搜索选项 代码生成约定选项 DS51284F_CN 第 34 页 2007 Microchip Technology Inc.

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

42 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 目标格式调试时, 不推荐使用这个选项 过程抽象是生成汇编文件后, 一个独立的编译阶段 这个阶段不跨翻译单元优化 当使能过程优化阶段时, 行内汇编代码仅限于有效的机器指令 不能使用无效的机器指令或指令序列, 或汇编伪指令 ( 段伪指令 宏和包含文件等 ), 否则过程抽象阶段会失败, 影响输出文件的生成 DS51284F_CN 第 36 页 2007 Microchip Technology Inc.

43 使用 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 时, 编译器将假定所有输入文件都为汇编语言 打印命令行选项的描述 2007 Microchip Technology Inc. DS51284F_CN 第 37 页

44 MPLAB C30 用户指南 控制 C 语言的选项 下面的选项定义编译器使用的 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 将字符串存储到可写的数据段中, 但不要使字符串成为唯一 的 DS51284F_CN 第 38 页 2007 Microchip Technology Inc.

45 使用 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 } }; 2007 Microchip Technology Inc. DS51284F_CN 第 39 页

46 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; 这个选项不能诊断某些更复杂的情况, 并可能给出偶然错误的结果, 但通常在检测程序中的这类问题时, 这个选项还是很有效的 DS51284F_CN 第 40 页 2007 Microchip Technology Inc.

47 使用 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 属性 ( 参见第 节 指定变量的属性 ) 2007 Microchip Technology Inc. DS51284F_CN 第 41 页

48 MPLAB C30 用户指南 表 3-5: -WALL 隐含的警告 / 错误选项 ( 续 ) 选项定义 -Wunused-parameter 当对函数参数进行了声明但从未使用时, 发出警告 要禁止这种警告, 使用 unused 属性 ( 参见第 节 指定变量的属性 ) -Wunused-variable 当对局部变量或非常量的 static 变量进行了声明但从未使用时, 发出警告 要禁止这种警告, 使用 unused 属性 ( 参见第 节 指定变量的属性 ) -Wunused-value 语句的计算结果未显式使用时发出警告 要禁止这种警告, 可以将表达式类型转换为 void 下面是不被 -Wall 隐含的 -W 选项 其中有些是关于用户通常认为不会有问题, 但有时会希望检查一下的语法结构的警告 其他是在某些情况下必须或很难避免的语法结构的警告, 没有简单的方法来修改代码以禁止这些警告 DS51284F_CN 第 42 页 2007 Microchip Technology Inc.

49 使用 MPLAB C30 C 编译器 表 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 的话, 就不会产生警告 ) 聚集的初始化中括号不全 例如, 下面的代码由于在初始化 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 * 就会产生警告 2007 Microchip Technology Inc. DS51284F_CN 第 43 页

50 MPLAB C30 用户指南 表 3-6: -WALL 不隐含的警告 / 错误选项 ( 续 ) -Wconversion -Werror -Winline -Wlarger-than-len -Wlong-long -Wno-long-long -Wmissing-noreturn -Wmissing-prototypes -Wmissing-declarations -Wmissingformat-attribute -Wnested-externs -Wno-deprecateddeclarations 如果一个原型导致一个参数的类型转换与没有原型时不同, 则发出警告 这包括定点型转换为浮点型或反之, 及改变定点参数符号或宽度的转换, 与默认的提升相同时除外 当负的整型常量表达式隐式转换为无符号类型时也发出警告 例如, 如果 x 为无符号类型, 赋值 x = -1 将产生警告 但是, 显式的强制类型转换, 如 (unsigned) -1, 不会产生警告 使所有警告变为错误 一个函数已声明为内联, 或指定了 -finline-functions 选项时, 如果函数不能被内联, 将产生警告 当定义了大于 len 字节的对象时产生警告 使用 long long 类型时发出警告 这是默认设置 为禁止警告消息, 使用 -Wno-long-long 仅当使用 -pedantic 标志时, 才考虑标志 -Wlong-long 和 -Wno-long-long 如果在定义一个全局函数之前没有先对其进行声明将产生警告 即使定义本身提供了原型, 也要在定义全局函数之前先声明它 如果使能了 -Wformat, 可指定 format 属性的函数也会产生警告 注意这些函数仅是可指定 format 属性的函数, 不是已指定 format 属性的函数 如果不使能 -Wformat, 这一选项不起作用 对可指定 noreturn 属性的函数产生警告 这些函数仅是可指定这一属性的函数, 并不是已指定了这一属性的函数 手工检验这些函数时要小心 实际上, 在添加 noreturn 属性之前也不要返回 ; 否则可能会引入微小的代码生成错误 如果全局函数在定义之前没有先声明原型会产生警告 即使定义本身提供了原型也会发出这个警告 ( 这个选项可用于检测不在头文件中声明的全局函数 ) 如果在函数内部遇到了 extern 声明, 发出警告 不要对使用通过 deprecated 属性指定为 deprecated 的函数 变量和类型发出警告 -Wpadded 如果一个结构中包含了填充, 不管是为了对齐结构的一个元素, 还是为了对齐整个结构, 都发出警告 -Wpointer-arith -Wredundant-decls -Wshadow 选项 定义 对于与函数类型或 void 的长度有关的任何类型发出警告 为方便用 void * 指针和指向函数的指针计算, MPLAB C30 将这些类型的长度分配为 1 如果在同一个作用域内多次声明了任何符号则发出警告, 即使多个声明都有效且没有改变任何符号 当一个局部变量屏蔽另一个局部变量时发出警告 DS51284F_CN 第 44 页 2007 Microchip Technology Inc.

51 使用 MPLAB C30 C 编译器 表 3-6: -WALL 不隐含的警告 / 错误选项 ( 续 ) 选项 -Wsign-compare -Wno-sign-compare -Wstrict-prototypes -Wtraditional -Wundef -Wunreachable-code -Wwrite-strings 定义 当比较有符号值和无符号值时, 将有符号值转换为无符号值, 比较产生不正确结果时发出警告 这个警告也可通过 -W 来使能 ; 要获得 -W 的其他警告, 而不获得这个警告, 使用 -W -Wno-sign-compare 如果对一个函数的定义或声明没有指定参数类型则发出警告 ( 如果函数定义或声明前有指定函数参数类型的声明, 则允许旧式函数定义而不发出警告 ) 如果某些语法结构在传统 C 和 ANSI C 中操作不同, 产生警告 宏参数出现在宏体中的字符串常量中 在传统 C 中, 这些宏参数将替代参数, 但在 ANSI C 中是常量的一部分 在一个块中声明为 external 的函数, 在块结束后被使用 switch 语句有 long 类型的操作数 非静态函数声明后跟一个静态函数声明 某些传统 C 编译器不接受这种语法结构 如果在 #if 伪指令中对一个未定义的标识符求值会产生警告 如果编译器检测到代码将永远不会被执行到则发出警告 即使在有些情况下, 受影响的代码行的一部分能被执行到, 这个选项也可能产生警告, 因此在删除明显执行不到的代码时要小心 例如, 函数被内联时, 警告可能表明仅在函数的一个内联拷贝中, 该行执行不到 字符串常量类型为 const char[length] 时, 将一个字符串常量的地址复制到一个非常量 char * 指针会产生警告 这些警告有助于在编译时查找试图写字符串常量的代码, 但仅是在声明和原型中使用 const 时非常小心的前提下 否则, 这是不安全的, 这也是 -Wall 为什么不要求这些警告的原因 2007 Microchip Technology Inc. DS51284F_CN 第 45 页

52 MPLAB C30 用户指南 调试选项 下面列出了一些用于调试的选项 表 3-7: 选项 调试选项 定义 -g 产生调试信息 MPLAB C30 支持同时使用 -g 和 -O, 因此可以调试优化的代码 调试优化代码的缺点是有时可能产生异常结果 : 某些声明的变量可能根本不存在 ; 控制流程可能短暂异常转移 ; 某些语句可能由于计算常量结果或已经获得其值而不执行 ; 某些语句可能由于被移出循环在不同的地方执行 尽管如此, 证明还是可以调试优化输出的 这使优化可能有错误的程序变得合理 -Q 使编译器打印它在编译的每个函数名, 并在结束时打印关于每遍编译的一些统计信息 -save-temps 不要删除中间文件 将中间文件放在当前目录中, 并根据源文件命名它们 因此, 用 -c -save-temps 编译 foo.c 将生成下面的文件 : foo.i ( 预处理文件 ) foo.p ( 预过程抽象汇编语言文件 ) foo.s ( 汇编语言文件 ) foo.o ( 目标文件 ) 控制优化的选项 下面列出了一些用于控制编译器优化的选项 表 3-8: 选项 一般优化选项 定义 -O0 不要优化 ( 这是默认设置 ) 不指定 -O 选项, 编译器的目标是降低编译成本, 使调试产生期望的结果 语句是独立的 : 如果在语句中插入断点暂停程序, 然后可以给任何一个变量赋一个新的值或将程序计数器更改到指向函数中的任何其他语句, 得到希望从源代码得到的结果 编译器仅将声明为 register 的变量分配到寄存器中 -O -O1 优化 优化编译需要花费更多的时间, 且对于较大的函数, 需要占用更多的存储空间 指定 -O 选项时, 编译器试图减小代码尺寸并缩短执行时间 指定 -O 选项时, 编译器开启 -fthread-jumps 和 -fdefer-pop, 并开启 -fomit-frame-pointer DS51284F_CN 第 46 页 2007 Microchip Technology Inc.

53 使用 MPLAB C30 C 编译器 表 3-8: 一般优化选项 ( 续 ) 选项 定义 -O2 执行更多优化 MPLAB C30 几乎执行所有支持的优化, 而不进行空间和速度的权衡 -O2 选项使能除循环展开 (-funroll-loops) 函数内联 (-finline-functions) 及严格别名优化 (-fstrict-aliasing) 之外的所有可选优化 这个选项还使能强制复制存储器操作数 (-fforce-mem) 及帧指针删除 (-fomit-frame-pointer) 与 -O 相比, 这个选项增加了编译时间, 但提高了生成代码的性能 -O3 执行最多的优化 -O3 开启所有 -O2 指定的优化并开启内联函数选项 -Os 优化代码尺寸 -Os 使能一般不增加代码尺寸的所有 -O2 优化 同时执行用于减小代码尺寸的其他优化 下面的选项控制特定的优化 -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 将函数的开头对齐到下一个大于 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, 则使用由机器决定的默认设置 通过在函数调用前后发出其他指令来保护和恢复寄存器, 使能将值分配到会被函数调用破坏的寄存器中 仅当这种分配能生成更好的代码时才进行这种分配 2007 Microchip Technology Inc. DS51284F_CN 第 47 页

54 MPLAB C30 用户指南 表 3-9: 特定的优化选项 ( 续 ) -fcse-follow-jumps -fcse-skip-blocks -fgcse -fgcse-lm -fgcse-sm 选项 -fmove-all-movables -fno-defer-pop -fno-peephole -fno-peephole2 -fexpensiveoptimizations -ffunction-sections -fdata-sections -foptimizeregister-move -fregmove 定义 在公共子表达式消除中, 当任何其他路径都不到达跳转的目标地址时, 浏览跳转指令 例如, 当 CSE 遇到一条带有 else 子句的 if 语句时, 当条件检测为假时, CSE 将跟随跳转 这与 -fcse-follow-jumps 类似, 但使 CSE 跟随根据条件跳过块的跳转 当 CSE 遇到一个没有 else 子句的简单 if 语句时,-fcse-skip-blocks 使 CSE 跟随 if 前后的跳转 执行许多成本较高的次要优化 将每个函数或数据项存放到输出文件中其自己的段 函数名或数据项名决定输出文件中的段名 仅当使用这些选项有明显的好处时, 才使用这些选项 当指定这些选项时, 汇编器和链接器可能生成较大的目标文件和可执行文件, 且速度较慢 执行全局公共子表达式消除 这会同时执行全局常量和复制传播 使能 -fgcse-lm 时, 全局公共子表达式消除将试图移动仅能被向其中存储破坏的装载 这允许将包含装载 / 存储序列的循环改变为循环外的装载, 以及循环内的复制 / 装载 当使能 -fgcse-sm 时, 将在公共子表达式消除后运行存储移动 这试图将存储移出循环 当将这个选项与 -fgcse-lm 一起使用时, 包含装载 / 存储序列的循环可改变为循环前的装载和循环后的存储 强制将循环内所有不可变的计算移出循环 每次函数调用时, 总是在函数一返回时就弹出函数的参数 编译器通常允许几个函数调用的参数累积在堆栈中, 并将所有参数一次弹出堆栈 禁止特定于机器的窥孔 (peephole) 优化 窥孔优化发生在编译过程中的不同点 -fno-peephole 禁止对机器指令进行窥孔优化, 而 -fno-peephole2 禁止高级窥孔优化 要完全禁止窥孔优化, 要同时使用这两个选项 试图重新分配 move 指令中的寄存器编号, 并作为其他简单指令的操作数来增加关联的寄存器数量 -fregmove 和 -foptimize-register-moves 是相同的优化 DS51284F_CN 第 48 页 2007 Microchip Technology Inc.

00872a.book

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

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

51284H.book

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

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

51284E.book

51284E.book MPLAB C30 C 编译器用户指南 2006 Microchip Technology Inc. DS51284E_CN 请注意以下有关 Microchip 器件代码保护功能的要点 : Microchip 的产品均达到 Microchip 数据手册中所述的技术指标 Microchip 确信 : 在正常使用的情况下, 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

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

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

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

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

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

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

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

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

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

(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

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

21928a.book

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

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

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

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

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

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

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

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

封面.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

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

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

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

,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

<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

华恒家庭网关方案

华恒家庭网关方案 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

( 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

CTMU Temperature Measurement AN.book

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

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

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

Guava学习之Resources

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

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

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

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

51686A.book

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

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

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

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

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

PIC18F65J90/85J90 Product Brief

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

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

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

新版 明解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

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

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

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

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

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

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

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

0507A_Auto Tech_Microchip

0507A_Auto Tech_Microchip 汽 车 无 线 安 全 接 入 技 术 解 决 方 案 Youbok Lee 主 任 工 程 师 Willie Fitzgerald 产 品 营 销 总 监 Microchip Technology Inc. 引 言 全 球 汽 车 半 导 体 面 临 极 大 的 市 场 机 会, 而 汽 车 设 计 工 程 师 正 在 应 对 高 性 价 比 的 性 能 增 强 功 耗 小 尺 寸 和 安 全 性

More information

00966A.book

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

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

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

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

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

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

通过Hive将数据写入到ElasticSearch

通过Hive将数据写入到ElasticSearch 我在 使用 Hive 读取 ElasticSearch 中的数据 文章中介绍了如何使用 Hive 读取 ElasticSearch 中的数据, 本文将接着上文继续介绍如何使用 Hive 将数据写入到 ElasticSearch 中 在使用前同样需要加入 elasticsearch-hadoop-2.3.4.jar 依赖, 具体请参见前文介绍 我们先在 Hive 里面建个名为 iteblog 的表,

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

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

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

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式] 用户定义类型 User-defined Datatypes classes and structs 几何向量 (Geometry Vector) 二维平面上的向量由起点和终点构成 每个点包含两个坐标 (x, y), 因此一个向量需要四个实数表示 Start= (0.9,1.5) Start= (0.4,0.8) int main() { double xstart = 0.4; double xend

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

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

00513D_CN.FM

00513D_CN.FM 使用 PIC16C54 实现模数转换 AN513 作者 : 简介 本应用笔记介绍了一种使用 PIC16C5X 系列单片机实现模数转换 (Analog to Digital,A/D) 的方法 仅需 5 个外部元件即可实现该转换器, 且可通过软硬件配置使转换分辩率达到 6 到 10 位且转换时间不短于 250 µs 这一方法可用于电压和电流转换且使用软件校准技术来补偿由于时间和温度漂移以及元件误差造成的精度误差

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

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

目 录

目 录 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

PowerPoint 演示文稿

PowerPoint 演示文稿 第 1 章程序设计和 C 语言 1.1 什么是计算机程序 1.2 什么是计算机语言 1.3 C 语言的发展及其特点 1.4 最简单的 C 语言程序 1.5 运行 C 程序的步骤与方法 1.6 程序设计的任务 1.1 什么是计算机程序 程序 : 一组计算机能识别和执行的指令 只要让计算机执行这个程序, 计算机就会自动地 有条不紊地进行工作 计算机的一切操作都是由程序控制的, 离开程序, 计算机将一事无成

More information

untitled

untitled MODBUS 1 MODBUS...1 1...4 1.1...4 1.2...4 1.3...4 1.4... 2...5 2.1...5 2.2...5 3...6 3.1 OPENSERIAL...6 3.2 CLOSESERIAL...8 3.3 RDMULTIBIT...8 3.4 RDMULTIWORD...9 3.5 WRTONEBIT...11 3.6 WRTONEWORD...12

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

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

21666b.book

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

More information

41632B.book

41632B.book 互 补 波 形 发 生 器 (CWG) 可 配 置 逻 辑 单 元 (CLC) 和 数 控 振 荡 器 (NCO) 外 设 技 巧 与 诀 窍 简 介 Microchip 致 力 于 不 断 向 客 户 提 供 体 积 更 小 速 度 更 快 使 用 更 简 便 与 运 行 更 可 靠 的 创 新 产 品 我 们 的 闪 存 PIC MCU 已 广 泛 应 用 于 日 常 生 活 中 从 烟 雾 探

More information

93004A.book

93004A.book 用 dspic DSC MCPWM 模块驱动交流感应电机 作者 : Jorge Zambada Microchip Technology Inc. 如图 1 所示, 电机绕组的电感对 PWM 电压源的电流进行滤波 正如下文即将介绍的, 基于该原理我们可利用 PWM 信号产生正弦波来对三相 ACIM 进行通电 引言 本文档概括介绍了采用 dspic3f 电机控制数字信号控制器系列芯片实现的电机控制 PWM

More information

科学计算的语言-FORTRAN95

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

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)

OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜

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

编译原理与技术

编译原理与技术 编译原理与技术 中间代码生成 2015/11/7 编译原理与技术 讲义 1 中间代码生成 - 布尔表达式翻译 - 控制流语句翻译 2015/11/7 编译原理与技术 讲义 2 布尔表达式的翻译 布尔表达式文法 G 4 E E 1 or E 2 E 1 and E 2 not E 1 ( E 1 ) id 1 relop id 2 true false id 3 布尔运算符 or and 和 not(

More information

nooog

nooog C : : : , C C,,, C, C,, C ( ), ( ) C,,, ;,, ; C,,, ;, ;, ;, ;,,,, ;,,, ; : 1 9, 2 3, 4, 5, 6 10 11, 7 8, 12 13,,,,, 2008 1 1 (1 ) 1.1 (1 ) 1.1.1 ( ) 1.1.2 ( ) 1.1.3 ( ) 1.1.4 ( ) 1.1.5 ( ) 1.2 ( ) 1.2.1

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

39697b.book

39697b.book 第 9 章看门狗定时器 (WDT) 目录 本章包括下列主题 : 9.1 简介...9-2 9.2 WDT 工作原理... 9-3 9.3 寄存器映射... 9-7 9.4 设计技巧... 9-8 9.5 相关应用笔记... 9-9 9.6 版本历史... 9-10 9 看门狗定时器 (WDT) 2010 Microchip Technology Inc. DS39697B_CN 第 9-1 页 PIC24F

More information

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11 .. 软件综合实验之操作系统 进入保护模式 陈香兰 中国科学技术大学计算机学院 July 1, 2016 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 1 / 11 提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 2 / 11 实验准备 实验环境准备

More information

目录

目录 ALTERA_CPLD... 3 11SY_03091... 3 12SY_03091...4....5 21 5 22...8 23..10 24..12 25..13..17 3 1EPM7128SLC.......17 3 2EPM7032SLC.......18 33HT46R47......19..20 41..20 42. 43..26..27 5151DEMO I/O...27 52A/D89C51...28

More information

《计算概论》课程 第十九讲 C 程序设计语言应用

《计算概论》课程 第十九讲  C 程序设计语言应用 计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout

More information

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit

6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C C C51 C51 ANSI C MCS-51 C51 ANSI C C C51 bit Byte bit sbit 6 C51 ANSI C Turbo C C51 Turbo C C51 C51 C51 C51 C51 C51 C51 C51 C51 6.1 C51 6.1.1 C51 C51 ANSI C MCS-51 C51 ANSI C C51 6.1 6.1 C51 bit Byte bit sbit 1 0 1 unsigned char 8 1 0 255 Signed char 8 11 128

More information

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63> 1 实验目的 实验 2 C 和汇编语言的混合编程实验 学习在 C 程序中使用嵌入式汇编编写程序 了解嵌入式汇编的格式 语言特点 2 实验设备 S3C2410 开发板 ADS1.2 集成开发环境,JTAG 调试器 串口连接线 3 实验原理 在 ARM 的应用开发中,C 语言功能强大且容易编写程序, 但是汇编程序在底层的操作仍然具有 C 程序无法替代的功能, 有时候我们需要在 C 程序中嵌入汇编程序来完成一些直接对底层的诸如寄存器的操作

More information

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

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

2015年计算机二级(C语言)模拟试题及答案(三)

2015年计算机二级(C语言)模拟试题及答案(三) 2016 年计算机二级 (C 语言 ) 模拟试题及答案 (3) 1.( A ) 是构成 C 语言程序的基本单位 A 函数 B 过程 C 子程序 D 子例程 2.C 语言程序从 ( C ) 开始执行 A 程序中第一条可执行语句 B 程序中第一个函数 C 程序中的 main 函数 D 包含文件中的第一个函数 3 以下说法中正确的是( C ) A C 语言程序总是从第一个定义的函数开始执行 B 在 C 语言程序中,

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information