10.07.2015 Views

MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

MPLAB ® <strong>C30</strong>C 编 译 器用 户 指 南© 2005 Microchip Technology Inc. DS51284C_CN


请 注 意 以 下 有 关 Microchip 器 件 代 码 保 护 功 能 的 要 点 :• Microchip 的 产 品 均 达 到 Microchip 数 据 手 册 中 所 述 的 技 术 指 标 。• Microchip 确 信 : 在 正 常 使 用 的 情 况 下 , Microchip 系 列 产 品 是 当 今 市 场 上 同 类 产 品 中 最 安 全 的 产 品 之 一 。• 目 前 , 仍 存 在 着 恶 意 、 甚 至 是 非 法 破 坏 代 码 保 护 功 能 的 行 为 。 就 我 们 所 知 , 所 有 这 些 行 为 都 不 是 以 Microchip 数 据 手 册 中 规 定 的操 作 规 范 来 使 用 Microchip 产 品 的 。 这 样 做 的 人 极 可 能 侵 犯 了 知 识 产 权 。• Microchip 愿 与 那 些 注 重 代 码 完 整 性 的 客 户 合 作 。• Microchip 或 任 何 其 他 半 导 体 厂 商 均 无 法 保 证 其 代 码 的 安 全 性 。 代 码 保 护 并 不 意 味 着 我 们 保 证 产 品 是 “ 牢 不 可 破 ” 的 。代 码 保 护 功 能 处 于 持 续 发 展 中 。 Microchip 承 诺 将 不 断 改 进 产 品 的 代 码 保 护 功 能 。 任 何 试 图 破 坏 Microchip 代 码 保 护 功 能 的 行 为 均 可 视为 违 反 了 《 数 字 器 件 千 年 版 权 法 案 (Digital Millennium Copyright Act)》。 如 果 这 种 行 为 导 致 他 人 在 未 经 授 权 的 情 况 下 , 能 访 问 您 的软 件 或 其 他 受 版 权 保 护 的 成 果 , 您 有 权 依 据 该 法 案 提 起 诉 讼 , 从 而 制 止 这 种 行 为 。提 供 本 文 档 的 中 文 版 本 仅 为 了 便 于 理 解 。MicrochipTechnology 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、 PICMASTER、 SEEVAL、 SmartSensor 和 TheEmbedded Control Solutions Company 均 为 MicrochipTechnology Inc. 在 美 国 的 注 册 商 标 。Analog-for-the-Digital Age、 Application Maestro、dsPICDEM、 dsPICDEM.net、 dsPICworks、 ECAN、ECONOMONITOR、 FanSense、 FlexROM、 fuzzyLAB、In-Circuit Serial Programming、 ICSP、 ICEPIC、 LinearActive Thermistor、 MPASM、 MPLIB、 MPLINK、 MPSIM、PICkit、 PICDEM、 PICDEM.net、 PICLAB、 PICtail、PowerCal、 PowerInfo、 PowerMate、 PowerTool、 rfLAB、rfPICDEM、 Select Mode、 Smart Serial、 SmartTel、 TotalEndurance 和 WiperLock 均 为 Microchip Technology Inc. 在美 国 和 其 他 国 家 或 地 区 的 商 标 。SQTP 是 Microchip Technology Inc. 在 美 国 的 服 务 标 记 。在 此 提 及 的 所 有 其 他 商 标 均 为 各 持 有 公 司 所 有 。© 2005, Microchip Technology Inc. 版 权 所 有 。Microchip 位 于 美 国 亚 利 桑 那 州 Chandler 和 Tempe 及 位 于 加 利 福 尼 亚州 Mountain View 的 全 球 总 部 、 设 计 中 心 和 晶 圆 生 产 厂 均 于 2003 年10 月 通 过 了 ISO/TS-16949:2002 质 量 体 系 认 证 。 公 司 在 PICmicro ® 8位 单 片 机 、 KEELOQ ® 跳 码 器 件 、 串 行 EEPROM、 单 片 机 外 设 、 非 易 失性 存 储 器 和 模 拟 产 品 方 面 的 质 量 体 系 流 程 均 符 合 ISO/TS-16949:2002。 此 外 , Microchip 在 开 发 系 统 的 设 计 和 生 产 方 面 的 质 量 体系 也 已 通 过 了 ISO 9001:2000 认 证 。DS51284C_CN 第 ii 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南目 录前 言 ................................................................................................................................. 1第 1 章 编 译 器 概 述1.1 简 介 ................................................................................................................ 71.2 主 要 内 容 ......................................................................................................... 71.3 MPLAB <strong>C30</strong> 介 绍 ............................................................................................ 71.4 MPLAB <strong>C30</strong> 及 其 他 开 发 工 具 .......................................................................... 71.5 MPLAB <strong>C30</strong> 的 功 能 ........................................................................................ 9第 2 章 MPLAB <strong>C30</strong> 与 ANSI C 的 差 别2.1 简 介 .............................................................................................................. 112.2 主 要 内 容 ....................................................................................................... 112.3 关 键 字 差 别 ................................................................................................... 112.4 语 句 差 别 ....................................................................................................... 272.5 表 达 式 差 别 ................................................................................................... 28第 3 章 使 用 MPLAB <strong>C30</strong> C 编 译 器3.1 简 介 .............................................................................................................. 293.2 主 要 内 容 ....................................................................................................... 293.3 概 述 .............................................................................................................. 293.4 文 件 命 名 约 定 ................................................................................................ 303.5 选 项 .............................................................................................................. 303.6 环 境 变 量 ....................................................................................................... 553.7 预 定 义 常 量 ................................................................................................... 563.8 通 过 命 令 行 编 译 单 个 文 件 .............................................................................. 563.9 通 过 命 令 行 编 译 多 个 文 件 .............................................................................. 58第 4 章 MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境4.1 简 介 .............................................................................................................. 594.2 主 要 内 容 ....................................................................................................... 594.3 地 址 空 间 ....................................................................................................... 594.4 代 码 段 和 数 据 段 ............................................................................................ 614.5 启 动 和 初 始 化 ................................................................................................ 634.6 存 储 空 间 ....................................................................................................... 644.7 存 储 模 型 ....................................................................................................... 654.8 定 位 代 码 和 数 据 ............................................................................................ 674.9 软 件 堆 栈 ....................................................................................................... 684.10 C 堆 栈 使 用 .................................................................................................. 694.11 C 堆 使 用 ..................................................................................................... 71© 2005 Microchip Technology Inc. DS51284C_CN 第 iii 页


MPLAB ® <strong>C30</strong> 用 户 指 南4.12 函 数 调 用 约 定 .............................................................................................. 724.13 寄 存 器 约 定 ................................................................................................. 744.14 位 反 转 寻 址 和 模 寻 址 ................................................................................... 754.15 程 序 空 间 可 视 性 (PSV) 的 使 用 ................................................................ 75第 5 章 数 据 类 型5.1 简 介 .............................................................................................................. 775.2 主 要 内 容 ....................................................................................................... 775.3 数 据 表 示 ....................................................................................................... 775.4 整 型 .............................................................................................................. 775.5 浮 点 型 .......................................................................................................... 785.6 指 针 .............................................................................................................. 78第 6 章 器 件 支 持 文 件6.1 简 介 .............................................................................................................. 796.2 主 要 内 容 ....................................................................................................... 796.3 处 理 器 头 文 件 ................................................................................................ 796.4 寄 存 器 定 义 文 件 ............................................................................................ 806.5 使 用 特 殊 功 能 寄 存 器 ..................................................................................... 816.6 使 用 宏 .......................................................................................................... 836.7 从 C 代 码 访 问 EEDATA ................................................................................ 84第 7 章 中 断7.1 简 介 .............................................................................................................. 877.2 主 要 内 容 ....................................................................................................... 877.3 编 写 中 断 服 务 程 序 ........................................................................................ 887.4 写 中 断 向 量 ................................................................................................... 907.5 中 断 服 务 程 序 现 场 保 护 ................................................................................. 927.6 中 断 响 应 时 间 ................................................................................................ 937.7 中 断 嵌 套 ....................................................................................................... 937.8 使 能 / 禁 止 中 断 ............................................................................................. 93第 8 章 汇 编 语 言 和 C 模 块 混 合 编 程8.1 简 介 .............................................................................................................. 958.2 主 要 内 容 ....................................................................................................... 958.3 在 汇 编 语 言 中 使 用 C 变 量 和 C 函 数 .............................................................. 958.4 使 用 行 内 汇 编 ................................................................................................ 97附 录 A 实 现 定 义 的 操 作A.1 简 介 ............................................................................................................ 101A.2 翻 译 ............................................................................................................ 102A.3 环 境 ............................................................................................................ 102A.4 标 识 符 ........................................................................................................ 103A.5 字 符 ............................................................................................................ 103A.6 整 型 ............................................................................................................ 104A.7 浮 点 型 ........................................................................................................ 104A.8 数 组 和 指 针 ................................................................................................. 105DS51284C_CN 第 iv 页© 2005 Microchip Technology Inc.


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


MPLAB ® <strong>C30</strong> 用 户 指 南附 录 D ASCII 字 符 集 ....................................................................................................161附 录 E GNU 免 费 文 档 许 可 证 .......................................................................................163术 语 表 ..........................................................................................................................169索 引 .............................................................................................................................181全 球 销 售 及 服 务 网 点 ....................................................................................................190DS51284C_CN 第 vi 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南前 言致 客 户所 有 文 档 都 有 过 时 的 时 候 , 本 指 南 也 不 例 外 。 为 了 满 足 客 户 不 断 增 长 的 需 要 , Microchip 的工 具 和 文 档 在 不 断 发 展 之 中 , 因 此 本 文 档 中 对 于 某 些 对 话 框 和 / 或 工 具 的 描 述 可 能 与 实 际 有所 差 别 。 请 查 看 我 公 司 网 站 (www.microchip.com), 获 得 最 新 的 文 档 。文 档 用 “DS” 编 号 标 识 。 DS 号 位 于 每 页 底 部 的 页 码 之 前 。 DS 号 的 编 号 约 定 为“DSXXXXXA” 或 “DSXXXXXA_CN”, 其 中 “XXXXX” 为 文 档 编 号 ,“A” 为 文 档 的 版本 ,“_CN” 指 文 档 为 中 文 版 本 。关 于 开 发 工 具 的 最 新 信 息 , 参 见 MPLAB IDE 在 线 帮 助 。 选 择 Help 菜 单 , 然 后 选 择Topics, 即 可 打 开 一 个 在 线 帮 助 文 件 列 表 。简 介本 文 档 的 目 的 是 帮 助 大 家 使 用 Microchip 的 MPLAB <strong>C30</strong> C 编 译 器 开 发 自 己 的 dsPIC应 用 程 序 。 MPLAB <strong>C30</strong> 是 一 款 基 于 GNU 编 译 器 集 (GNU Compiler Collection,GCC) 的 语 言 工 具 , 以 来 自 Free Software Foundation (FSF) 的 源 代 码 为 基 础 。 关于 FSF 的 信 息 可 登 陆 网 站 WWW.FSF.ORG。您 还 可 从 Microchip 获 得 以 下 语 言 工 具 :• MPLAB ASM30 汇 编 器• MPLAB LINK30 链 接 器• MPLAB LIB30 库 管 理 器 / 归 档 器本 文 档 涉 及 以 下 内 容 :• 关 于 本 指 南• 推 荐 读 物• 疑 难 解 答• Microchip 网 站• 开 发 系 统 客 户 变 更 通 知 服 务• 客 户 支 持© 2005 Microchip Technology Inc. DS51284C_CN 第 1 页


MPLAB ® <strong>C30</strong> 用 户 指 南关 于 本 指 南章 节 安 排本 文 档 介 绍 如 何 使 用 MPLAB <strong>C30</strong> 来 开 发 软 件 。 章 节 安 排 如 下 :• 第 1 章 : 编 译 器 概 述 — 介 绍 MPLAB <strong>C30</strong>、 开 发 工 具 和 功 能 。• 第 2 章 : MPLAB <strong>C30</strong> 与 ANSI C 的 区 别 — 描 述 MPLAB <strong>C30</strong> 语 法 支 持 的 C 语 言 和标 准 ANSI -89 C 之 间 的 区 别 。• 第 3 章 : 使 用 MPLAB <strong>C30</strong> — 介 绍 怎 样 通 过 命 令 行 使 用 MPLAB <strong>C30</strong>。• 第 4 章 : MPLAB <strong>C30</strong> 运 行 时 环 境 — 介 绍 MPLAB <strong>C30</strong> 运 行 时 模 型 , 包 括 段 信 息 、初 始 化 、 存 储 器 模 式 和 软 件 堆 栈 等 。• 第 5 章 : 数 据 类 型 — 介 绍 MPLAB <strong>C30</strong> 整 型 、 浮 点 型 和 指 针 型 数 据 类 型 。• 第 6 章 : 器 件 支 持 文 件 — 介 绍 MPLAB <strong>C30</strong> 的 头 文 件 和 寄 存 器 定 义 文 件 , 以 及 怎 样使 用 特 殊 功 能 寄 存 器 。• 第 7 章 : 中 断 — 介 绍 怎 样 使 用 中 断 。• 第 8 章 : C 语 言 与 汇 编 语 言 的 混 合 编 程 — 为 使 用 MPLAB <strong>C30</strong> 与 MPLAB ASM30汇 编 语 言 模 块 提 供 指 导 。• 附 录 A: 实 现 定 义 的 操 作 — 详 细 描 述 ANSI 标 准 中 描 述 为 实 现 定 义 的 、 特 定 于MPLAB <strong>C30</strong> 的 参 数 。• 附 录 B:MPLAB <strong>C30</strong> 诊 断 信 息 — 列 出 由 MPLAB <strong>C30</strong> 产 生 的 错 误 和 警 告 消 息 。• 附 录 C:MPLAB C18 和 MPLAB <strong>C30</strong> 的 区 别 — 介 绍 PIC18XXXXX 编 译 器(MPLAB C18) 和 dsPIC 编 译 器 (MPLAB <strong>C30</strong>) 的 主 要 区 别 。• 附 录 D:ASCII 字 符 集 — 介 绍 ASCII 字 符 集 。• 附 录 E:GNU 免 费 文 档 许 可 证 — Free Software Foundation 的 使 用 许 可 证 。DS51284C_CN 第 2 页© 2005 Microchip Technology Inc.


前 言本 文 档 中 使 用 的 约 定本 手 册 使 用 如 下 文 档 约 定 :文 档 约 定描 述 表 示 示 例Arial 字 体 :斜 体 字 符 参 考 书 MPLAB IDE User’s Guide突 出 强 调 的 文 本...is the only compiler...首 字 母 大 写 窗 口 the Output window对 话 框the Settings dialog菜 单 选 择select Enable Programmer引 号 窗 口 或 对 话 框 中 的 域 名 “Save project before build”带 下 划 线 , 有 右 尖 括 号 的 斜 体 菜 单 路 径File>Save文 本粗 体 字 符 对 话 框 按 钮 Click OK选 项 卡Click the Power tab‘bnnnn二 进 制 数 字 , n 为 其 中 一 位 数 ‘b00100, ‘b10字尖 括 号 < > 中 的 文 本 键 盘 上 的 按 键 Press , Courier 字 体 :普 通 Courier 字 体 示 例 源 代 码 #define START文 件 名autoexec.bat文 件 路 径c:\mcc18\h关 键 字_asm, _endasm, static命 令 行 选 项-Opa+, -Opa-位 的 值 0, 1斜 体 Courier 可 变 量 file.o, where file can beany valid filename0xnnnn十 六 进 制 数 , n 为 其 中 一 位 十 0xFFFF, 0x007A六 进 制 数 字方 括 号 [ ] 可 选 参 数 mcc18 [options] file[options]大 括 号 和 竖 线 :{ | } 互 相 排 斥 的 变 量 的 选 择 ; errorlevel {0|1}“ 或 ” 选 项省 略 号 ... 代 替 重 复 的 文 本 var_name [,var_name...]表 示 用 户 提 供 的 代 码void main (void){ ...}© 2005 Microchip Technology Inc. DS51284C_CN 第 3 页


MPLAB ® <strong>C30</strong> 用 户 指 南推 荐 读 物本 文 档 介 绍 如 何 使 用 MPLAB <strong>C30</strong> 编 译 器 。 下 面 列 出 了 其 他 有 用 的 文 档 。 Microchip 提供 了 如 下 文 档 , 推 荐 将 这 些 文 档 作 为 补 充 参 考 资 料 。README 文 件关 于 Microchip 工 具 的 最 新 信 息 , 请 阅 读 软 件 附 带 的 相 关 README 文 件 (ASCII 文 本文 件 )。dsPIC Language Tools Getting Started (DS70094)指 导 安 装 和 使 用 Microchip dsPIC 数 字 信 号 控 制 器 的 语 言 工 具 (MPLAB ASM30、MPLAB LINK30 和 MPLAB <strong>C30</strong> )。 还 提 供 了 使 用 dsPIC 软 件 模 拟 器 MPLAB SIM30的 示 例 。MPLAB ASM30, MPLAB LINK30 and Utilities User's Guide (DS51317)指 导 使 用 dsPIC DSC 汇 编 器 、MPLAB ASM30、dsPIC DSC 链 接 器 、MPLAB LINK30和 各 种 dsPIC DSC 实 用 程 序 , 包 括 MPLAB LIB30 归 档 器 / 库 管 理 器 。GNU HTML 文 档语 言 工 具 的 光 盘 中 提 供 了 这 个 文 档 。 它 介 绍 了 标 准 的 GNU 开 发 工 具 , MPLAB 就 是 以此 为 基 础 的 。dsPI<strong>C30</strong>F Data Sheet General Purpose and Sensor Families (DS70083)这 是 dsPI<strong>C30</strong>F 数 字 信 号 控 制 器 (DSC) 的 数 据 手 册 。 总 体 介 绍 了 器 件 及 其 架 构 。 详细 介 绍 了 存 储 器 的 构 成 、 DSP 操 作 和 外 设 功 能 。 还 包 括 器 件 的 电 气 参 数 。dsPI<strong>C30</strong>F 系 列 参 考 手 册 (DS70046C_CN)该 系 列 的 参 考 指 南 , 介 绍 了 dsPI<strong>C30</strong>F DSC 系 列 的 架 构 和 外 设 模 块 。dsPI<strong>C30</strong>F Programmer's Reference Manual (DS70030)dsPI<strong>C30</strong>F 器 件 的 编 程 人 员 指 南 。 包 括 编 程 模 型 和 指 令 集 。DS51284C_CN 第 4 页© 2005 Microchip Technology Inc.


前 言C 标 准 信 息American National Standard for Information Systems – Programming Language – C.American National Standards Institute (ANSI), 11 West 42nd. Street, New York,New York, 10036.此 标 准 规 定 了 用 C 语 言 编 写 程 序 的 格 式 , 并 对 C 程 序 进 行 了 解 释 。 其 目 的 是 提 高C 程 序 在 多 种 计 算 机 系 统 上 的 可 移 植 性 、 可 靠 性 、 可 维 护 性 及 执 行 效 率 。C 参 考 书 籍Harbison, Samuel P., and Steele, Guy L., C A Reference Manual, 第 四 版 ,Prentice-Hall, Englewood Cliffs, N.J. 07632.Kernighan, Brian W., and Ritchie, Dennis M., The C Programming Language, 第 二版 。 Prentice Hall, Englewood Cliffs, N.J. 07632.Kochan, Steven G., Programming In ANSI C, 修 订 版 。 Hayden Books, Indianapolis,Indiana 46268.Plauger, P.J., The Standard C Library, Prentice-Hall, Englewood Cliffs, N.J. 07632.Van Sickle, Ted., Programming Microcontrollers in C, 第 一 版 。 LLH TechnologyPublishing, Eagle Rock, Virginia 24085.疑 难 解 答MICROCHIP 网 站在 本 文 中 找 不 到 的 常 见 问 题 信 息 可 以 查 阅 readme 文 件 。Microchip 网 站 提 供 在 线 技 术 支 持 。 用 户 可 以 从 Microchip 网 站 方 便 地 获 得 文 件 和 信息 。 可 使 用 Internet 浏 览 器 访 问 这 个 网 站 。 网 站 包 含 如 下 信 息 :• 产 品 支 持 — 数 据 手 册 及 勘 误 表 、 应 用 笔 记 及 范 例 程 序 、 设 计 资 源 、 用 户 指 南 及 硬件 支 持 文 档 、 最 新 软 件 版 本 及 归 档 软 件• 一 般 技 术 支 持 — 常 见 问 题 (FAQ)、 技 术 支 持 请 求 、 在 线 讨 论 组 和 Microchip 顾 问计 划 成 员 列 表• Microchip 业 务 — 产 品 选 型 和 订 购 指 南 、 最 新 Microchip 新 闻 稿 、 研 讨 会 和 活 动 安排 表 、 Microchip 销 售 办 事 处 列 表 、 代 理 商 和 工 厂 代 表 列 表 。© 2005 Microchip Technology Inc. DS51284C_CN 第 5 页


MPLAB ® <strong>C30</strong> 用 户 指 南开 发 系 统 客 户 变 更 通 知 服 务客 户 支 持Microchip 启 动 了 客 户 通 知 服 务 , 来 帮 助 客 户 轻 松 获 得 关 于 microchip 产 品 的 最 新 信息 。 一 旦 您 提 交 了 申 请 , 无 论 何 时 , 只 要 您 指 定 的 产 品 系 列 或 您 感 兴 趣 的 开 发 工 具 出现 变 动 、 更 新 、 修 订 或 勘 误 , 您 都 将 收 到 我 们 的 电 子 邮 件 通 知 。录 Microchip 网 站 (http://www.microchip.com), 点 击 “ 客 户 变 更 通 知 ”。 按 照 指 示注 册 。开 发 系 统 产 品 分 类 如 下 :• 编 译 器 — 关 于 Microchip C 编 译 器 和 其 他 语 言 工 具 的 最 新 信 息 。 这 些 工 具 包 括MPLAB C17、 MPLAB C18 和 MPLAB <strong>C30</strong> C 编 译 器 ; MPASM 和 MPLABASM30 汇 编 器 ; MPLINK 和 MPLAB LINK30 目 标 链 接 器 ; MPLIB 和 MPLABLIB30 目 标 库 管 理 器 。• 仿 真 器 — 关 于 Microchip 在 线 仿 真 器 的 最 新 信 息 。 包 括 MPLAB ICE 2000 和 MPLABICE 4000。• 在 线 调 试 器 — 关 于 Microchip 在 线 调 试 器 的 最 新 信 息 , 包 括 MPLAB ICD 2。• MPLAB IDE — 关 于 Microchip MPLAB IDE 的 最 新 信 息 , 它 是 开 发 系 统 工 具 的Windows ® 集 成 开 发 环 境 。 重 点 介 绍 MPLAB IDE、MPLAB SIM 仿 真 器 、MPLABIDE 项 目 管 理 器 以 及 一 般 的 编 辑 和 调 试 功 能 。• 编 程 器 — 关 于 Microchip 编 程 器 的 最 新 信 息 。 包 括 MPLAB PM3 和 PRO MATE ® II 器件 编 程 器 , 以 及 PICSTART ® Plus 开 发 编 程 器 。Microchip 产 品 的 用 户 可 通 过 下 列 渠 道 获 得 支 持 :• 代 理 商 或 代 表• 当 地 销 售 办 事 处• 应 用 工 程 师 (FAE)• 技 术 支 持• 开 发 系 统 信 息 热 线客 户 可 以 联 系 其 代 理 商 、 代 表 或 应 用 工 程 师 (FAE) 寻 求 支 持 。 请 查 看 本 手 册 后 封 面的 销 售 办 事 处 及 地 址 列 表 。欲 获 得 技 术 支 持 , 可 访 问 网 站 http://support.microchip.com, 也 可 致 电 应 用 工 程 师(CAE), 中 国 大 陆 地 区 请 拨 打 800-820-6247。此 外 还 有 系 统 信 息 和 更 新 热 线 。 此 热 线 为 系 统 用 户 提 供 开 发 系 统 软 件 产 品 的 最 新 版 本 。此 热 线 还 提 供 有 关 客 户 如 何 获 得 目 前 更 新 工 具 套 件 的 信 息 。热 线 号 码 为 :美 国 和 加 拿 大 大 部 分 地 区 , 请 拨 打 1-800-755-2345。中 国 大 陆 地 区 , 请 拨 打 800-820-6247。全 球 其 他 国 家 或 地 区 , 请 拨 打 1-480-792-7302。DS51284C_CN 第 6 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南第 1 章 编 译 器 概 述1.1 简 介1.2 主 要 内 容dsPIC 系 列 数 字 信 号 控 制 器 (DSC) 将 DSP 应 用 所 需 的 高 性 能 和 嵌 入 式 应 用 所 需 的标 准 单 片 机 功 能 融 合 在 一 起 。dsPIC DSC 得 到 了 一 套 完 整 的 软 件 开 发 工 具 的 充 分 支 持 , 包 括 一 个 优 化 的 C 编 译 器 、一 个 汇 编 器 、 一 个 链 接 器 和 一 个 归 档 器 / 库 管 理 器 。本 章 总 体 介 绍 了 这 些 工 具 以 及 优 化 的 C 编 译 器 的 功 能 , 包 括 C 编 译 器 如 何 与 MPLABASM30 汇 编 器 和 MPLAB LINK30 链 接 器 配 合 工 作 。 汇 编 器 和 链 接 器 在 MPLABASM30, MPLAB LINK30 and Utilities User's Guide (DS51317) 中 有 详 细 介 绍 。本 章 将 介 绍 如 下 内 容 :• MPLAB <strong>C30</strong> 介 绍• MPLAB <strong>C30</strong> 及 其 他 开 发 工 具• MPLAB <strong>C30</strong> 的 功 能1.3 MPLAB <strong>C30</strong> 介 绍MPLAB <strong>C30</strong> 是 一 个 遵 循 ANSI x3.159-1989 标 准 的 优 化 C 编 译 器 , 它 包 括 针 对 dsPIC嵌 入 式 控 制 应 用 的 语 言 扩 展 。 这 个 编 译 器 是 基 于 Windows ® 操 作 系 统 的 应 用 程 序 , 它为 开 发 C 代 码 提 供 了 一 个 平 台 。 它 是 来 自 Free Software Foundation 的 GCC 编 译 器 。1.4 MPLAB <strong>C30</strong> 及 其 他 开 发 工 具MPLAB <strong>C30</strong> 对 C 源 文 件 进 行 编 译 , 生 成 汇 编 语 言 文 件 。 由 编 译 器 生 成 的 文 件 与 其 他目 标 文 件 和 库 文 件 进 行 汇 编 和 链 接 以 产 生 最 终 的 应 用 程 序 , 应 用 程 序 格 式 为 COFF 或ELF 文 件 格 式 。 COFF 或 ELF 文 件 可 以 载 入 MPLAB IDE 中 进 行 测 试 和 调 试 , 或 使 用转 换 实 用 程 序 将 COFF 或 ELF 文 件 转 换 为 Intel ® hex 格 式 , 以 便 载 入 命 令 行 模 拟 器 或器 件 编 程 器 。 图 1-1 概 括 了 软 件 开 发 的 数 据 流 图 。© 2005 Microchip Technology Inc. DS51284C_CN 第 7 页


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


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


MPLAB ® <strong>C30</strong> 用 户 指 南注 :DS51284C_CN 第 10 页© 2005 Microchip Technology Inc.


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


MPLAB ® <strong>C30</strong> 用 户 指 南2.3.1 指 定 变 量 的 属 性MPLAB <strong>C30</strong> 的 关 键 字 __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))address (addr)address 属 性 为 变 量 指 定 绝 对 地 址 。 这 个 属 性 不 能 与 section 属 性 同 时 使 用 ;address 属 性 优 先 。 带 address 属 性 的 变 量 不 能 存 放 到 _psv 空 间 ( 参 见 space() 属性 或 -mconst-in-code 选 项 ); 这 样 做 会 产 生 警 告 , 且 编 译 器 将 此 变 量 存 放 到 psv空 间 。如 果 要 将 变 量 存 放 到 PSV 段 , 地 址 应 为 程 序 存 储 器 地 址 。int var __attribute__ ((address(0x800)));DS51284C_CN 第 12 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> 与 ANSI C 的 差 别aligned (alignment)该 属 性 为 变 量 指 定 最 小 的 对 齐 方 式 , 用 字 节 表 示 。 对 齐 方 式 必 须 是 2 的 次 幂 。 例 如 ,下 面 的 声 明 :int x __attribute__ ((aligned (16))) = 0;使 编 译 器 按 照 16 字 节 分 配 全 局 变 量 x。 对 于 dsPIC 器 件 , 这 可 以 与 访 问 需 要 对 齐 的操 作 数 的 DSP 指 令 和 寻 址 模 式 的 asm 语 句 配 合 使 用 。在 前 面 的 例 子 中 , 我 们 可 以 显 式 地 指 定 我 们 希 望 编 译 器 对 给 定 变 量 使 用 的 对 齐 方 式( 用 字 节 表 示 )。 或 者 , 我 们 可 以 省 略 对 齐 方 式 , 而 要 求 编 译 器 为 变 量 使 用 dsPIC 器 件的 最 大 有 用 对 齐 。 例 如 , 我 们 可 以 这 样 写 :short array[3] __attribute__ ((aligned));当 省 略 了 对 齐 属 性 说 明 中 的 对 齐 方 式 时 , 编 译 器 会 自 动 将 已 声 明 变 量 的 对 齐 方 式 设 置为 目 标 单 片 机 任 何 数 据 类 型 所 使 用 的 最 大 对 齐 方 式 。 在 dsPIC 器 件 中 , 为 双 字 节 (1个 字 )。aligned 属 性 只 能 增 大 对 齐 ; 但 可 以 通 过 指 定 packed 属 性 来 减 小 对 齐 ( 见 下 文 )。aligned 属 性 与 reverse 属 性 冲 突 , 同 时 指 定 两 者 会 产 生 错 误 。deprecateddeprecated 属 性 使 得 包 含 这 一 属 性 的 声 明 能 被 编 译 器 特 别 识 别 到 。 当 使 用deprecated 函 数 或 变 量 时 , 编 译 器 会 发 出 警 告 。deprecated 定 义 仍 将 被 编 译 器 执 行 , 并 被 反 映 到 目 标 文 件 中 。 例 如 , 编 译 以 下 程 序 :int __attribute__((__deprecated__)) i;int main() {return i;}将 产 生 警 告 :deprecated.c:4: warning: `i' is deprecated (declaredat deprecated.c:1)在 生 成 的 目 标 文 件 中 , 仍 以 通 常 的 方 式 定 义 了 i。farfar 属 性 告 知 编 译 器 不 必 将 变 量 分 配 到 near( 前 8 KB) 数 据 空 间 中 ( 即 变 量 可 以 分 配到 数 据 存 储 器 中 的 任 何 地 址 )。© 2005 Microchip Technology Inc. DS51284C_CN 第 13 页


MPLAB ® <strong>C30</strong> 用 户 指 南mode (mode)在 变 量 声 明 中 使 用 该 属 性 来 指 定 与 模 式 mode 对 应 的 数 据 类 型 。 实 际 上 就 是 允 许 根 据变 量 的 宽 度 指 定 整 数 或 浮 点 数 类 型 。 mode 的 有 效 值 见 下 表 :这 一 属 性 对 于 编 写 可 在 所 有 MPLAB <strong>C30</strong> 支 持 的 目 标 单 片 机 之 间 移 植 的 代 码 很 有 用 。例 如 , 如 下 函 数 将 两 个 32 位 有 符 号 整 数 相 加 , 并 返 回 一 个 32 位 有 符 号 整 数 结 果 :typedef int __attribute__((__mode__(SI))) int32;int32add32(int32 a, int32 b){return(a+b);}可 以 指 定 byte 或 __byte__ 模 式 指 明 模 式 对 应 于 单 字 节 整 数 , word 或 __word__模 式 对 应 于 单 字 整 数 , pointer 或 __pointer__ 模 式 用 于 表 示 指 针 。nearnear 属 性 告 知 编 译 器 将 变 量 分 配 到 near 数 据 空 间 ( 数 据 存 储 器 的 前 8 KB)。 对 这 种 变量 的 存 取 有 时 比 存 取 未 分 配 ( 或 不 知 已 分 配 ) 到 near 数 据 空 间 的 变 量 效 率 高 。int num __attribute__ ((near));noload模 式 宽 度 MPLAB <strong>C30</strong> 类 型QI 8 位 charHI 16 位 intSI 32 位 longDI 64 位 long longSF 32 位 floatDF 64 位 long doublenoload 属 性 指 明 应 该 为 变 量 分 配 空 间 , 但 不 应 为 变 量 装 入 初 值 。 这 一 属 性 对 于 设 计 在运 行 时 将 变 量 装 入 存 储 器 ( 如 从 串 行 EEPROM) 的 应 用 程 序 会 有 用 。int table1[50] __attribute__ ((noload)) = { 0 };DS51284C_CN 第 14 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> 与 ANSI C 的 差 别packedpacked 属 性 指 定 变 量 或 结 构 位 域 采 用 最 小 的 可 能 对 齐 方 式 —— 变 量 占 一 个 字 节 , 位域 占 一 位 , 除 非 用 aligned 属 性 指 定 了 一 个 更 大 的 值 。下 面 的 结 构 中 位 域 x 被 压 缩 , 所 以 它 紧 接 在 a 之 后 :struct foo{char a;int x[2] __attribute__ ((packed));};注 :dsPIC 器 件 要 求 字 按 偶 数 字 节 对 齐 , 因 此 在 使 用 packed 属 性 时 要 特 别小 心 , 避 免 运 行 时 寻 址 错 误 。persistentpersistent 属 性 指 定 在 启 动 时 变 量 不 应 被 初 始 化 或 清 零 。 具 有 persistent 属 性 的变 量 可 用 于 存 储 器 件 复 位 后 仍 保 持 有 效 的 状 态 信 息 。int last_mode __attribute__ ((persistent));reverse (alignment)reverse 属 性 为 变 量 的 结 束 地 址 加 1 指 定 最 小 对 齐 。 对 齐 以 字 节 指 定 , 必 须 是 2 的 次幂 。 反 向 对 齐 的 变 量 可 用 于 递 减 dsPIC 汇 编 语 言 中 的 模 缓 冲 区 。 如 果 应 用 程 序 需 要 在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属 性 的 说 明 。© 2005 Microchip Technology Inc. DS51284C_CN 第 15 页


MPLAB ® <strong>C30</strong> 用 户 指 南sfr (address)sfr 属 性 告 知 编 译 器 变 量 将 变 量 分 配 到 near 数 据 空 间 ( 数 据 存 储 器 的 前 8 KB), 同 时使 用 address 参 数 指 定 变 量 的 运 行 时 地 址 。 对 这 种 变 量 的 存 取 有 时 比 存 取 未 分 配( 或 不 知 已 分 配 ) 到 near 数 据 空 间 的 变 量 效 率 高 。extern volatile int __attribute__ ((sfr(0x200)))u1mod;为 避 免 产 生 错 误 , 需 要 使 用 extern 说 明 符 。space (space)一 般 来 说 , 编 译 器 在 一 般 数 据 空 间 内 分 配 变 量 。 可 使 用 space 属 性 来 指 示 编 译 器 将 变量 分 配 到 特 定 存 储 空 间 。 关 于 存 储 空 间 的 更 多 论 述 参 见 第 4.6 节 “ 存 储 空 间 ”。space 属 性 接 受 如 下 参 数 :data将 变 量 分 配 到 一 般 数 据 空 间 。 可 使 用 普 通 C 语 句 访 问 一 般 数 据 空 间 中 的 变 量 。这 是 默 认 的 分 配 。xmemory将 变 量 分 配 到 X 数 据 空 间 。 可 使 用 普 通 C 语 句 访 问 X 数 据 空 间 中 的 变 量 。xmemory 空 间 分 配 举 例 如 下 :int x[32] __attribute__ ((space(xmemory)));ymemory将 变 量 分 配 到 Y 数 据 空 间 。 可 使 用 普 通 C 语 句 访 问 Y 数 据 空 间 中 的 变 量 。ymemory 空 间 分 配 举 例 如 下 :int y[32] __attribute__ ((space(ymemory)));prog将 变 量 分 配 到 程 序 空 间 中 为 可 执 行 代 码 指 定 的 段 。 程 序 空 间 中 的 变 量 不 能 使 用 普通 C 语 句 访 问 , 这 些 变 量 必 须 由 编 程 人 员 显 式 访 问 , 通 常 通 过 表 访 问 行 内 汇 编指 令 , 或 使 用 程 序 空 间 可 视 性 窗 口 访 问 。auto_psv将 变 量 分 配 到 程 序 空 间 中 为 自 动 程 序 空 间 可 视 性 (PSV) 窗 口 访 问 指 定 的 编 译器 管 理 段 。 auto_psv 空 间 中 的 变 量 可 使 用 普 通 C 语 句 来 读 ( 但 不 能 写 ), 且 变量 的 分 配 空 间 最 大 为 32K 。 当 指 定 space(auto_psv) 时 , 不 能 使 用section 属 性 指 定 段 名 ; 任 何 段 名 将 被 忽 略 并 产 生 警 告 。 auto_psv 空 间 中 的 变量 不 能 存 放 到 特 定 地 址 或 反 对 齐 。注 :在 启 动 时 分 配 到 auto_psv 段 中 的 变 量 不 装 载 到 数 据 存 储 器 。 这 一 属性 对 于 减 少 RAM 使 用 可 能 有 用 。DS51284C_CN 第 16 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> 与 ANSI C 的 差 别psv将 变 量 分 配 到 程 序 空 间 中 为 程 序 空 间 可 视 性 (PSV) 窗 口 访 问 指 定 的 段 。 链 接器 将 定 位 段 , 因 此 可 以 通 过 PSVPAG 寄 存 器 的 设 置 来 访 问 整 个 变 量 。 PSV 空 间中 的 变 量 不 是 由 编 译 器 管 理 的 , 不 能 使 用 普 通 C 语 句 访 问 。 这 些 变 量 必 须 由 编程 人 员 显 式 访 问 , 通 常 使 用 表 访 问 行 内 汇 编 指 令 , 或 使 用 程 序 空 间 可 视 性 窗 口 访问 。eedata将 变 量 分 配 到 EEData 空 间 。 EEData 空 间 中 的 变 量 不 能 使 用 普 通 C 语 句 访 问 。这 些 变 量 必 须 由 编 程 人 员 显 式 访 问 , 通 常 使 用 表 访 问 行 内 汇 编 指 令 , 或 使 用 程 序空 间 可 视 性 窗 口 访 问 。transparent_union这 是 属 于 union 型 函 数 参 数 的 属 性 , 即 相 应 的 参 数 可 以 是 任 何 联 合 成 员 的 类 型 , 但 以第 一 个 联 合 成 员 的 类 型 传 递 参 数 。 使 用 transparent 联 合 的 第 一 个 成 员 的 调 用 约 定 将 参数 传 递 给 函 数 , 而 不 是 使 用 联 合 本 身 的 调 用 约 定 。 联 合 的 所 有 成 员 必 须 具 有 相 同 的 机器 码 表 示 , 这 对 于 保 证 参 数 传 递 正 常 进 行 是 必 需 的 。unorderedunordered 属 性 表 明 变 量 存 放 的 地 址 可 以 相 对 于 所 在 C 源 文 件 中 其 他 变 量 的 位 置 而 改变 。 这 不 符 合 ANSI C, 但 可 使 链 接 器 更 好 地 利 用 存 储 空 隙 。const int __attribute__ ((unordered)) i;unused这 一 变 量 属 性 表 明 变 量 可 能 不 被 使 用 。 MPLAB <strong>C30</strong> 不 会 为 这 种 变 量 产 生 未 使 用 变 量警 告 。weakweak 属 性 声 明 weak 符 号 。weak 符 号 可 能 被 全 局 定 义 取 代 。 当 对 外 部 符 号 的 引 用 使 用weak 时 , 则 链 接 时 不 需 要 该 符 号 。 例 如 :extern int __attribute__((__weak__)) s;int foo() {if (&s) return s;return 0; /* possibly some other value */}在 上 面 的 程 序 中 , 如 果 s 没 有 被 其 他 模 块 定 义 , 程 序 仍 会 链 接 , 但 不 会 给 s 分 配 地址 。 若 条 件 验 证 s 已 被 定 义 , 就 返 回 它 的 值 ( 如 果 它 有 值 的 话 )。 否 则 将 返 回 “0”值 。 这 个 特 征 很 有 用 , 主 要 用 于 提 供 与 任 意 库 链 接 的 通 用 代 码 。© 2005 Microchip Technology Inc. DS51284C_CN 第 17 页


MPLAB ® <strong>C30</strong> 用 户 指 南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 定 义 的 情 况 下 , 链 接 器 才 选 择 为 第 一 个 这 种 定 义 分 配 存 储 空 间 。 其 他定 义 是 不 可 访 问 的 。无 论 符 号 属 于 什 么 类 型 , 操 作 是 相 同 的 ; 函 数 和 变 量 具 有 相 同 的 操 作 。DS51284C_CN 第 18 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> 与 ANSI C 的 差 别2.3.2 指 定 函 数 的 属 性在 MPLAB <strong>C30</strong> 中 , 可 以 对 程 序 中 调 用 的 函 数 进 行 某 些 声 明 , 帮 助 编 译 器 优 化 函 数 调用 , 且 更 准 确 地 检 查 代 码 。关 键 字 _attribute_ 允 许 在 声 明 时 指 定 特 殊 的 属 性 。 关 键 字 后 面 紧 跟 双 括 弧 中 的 属性 说 明 。 目 前 支 持 函 数 的 下 列 属 性 :• address (addr)• alias ("target")• const• deprecated• far• format (archetype, string-index, first-to-check)• format_arg (string-index)• 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 属 性 为 另 一 个 符 号 声 明 一 个 别 名 , 必 须 指 定 这 个 符 号 。使 用 这 一 属 性 会 产 生 对 对 象 的 外 部 引 用 , 必 须 在 链 接 时 解 析 该 引 用 。© 2005 Microchip Technology Inc. DS51284C_CN 第 19 页


MPLAB ® <strong>C30</strong> 用 户 指 南const许 多 函 数 除 了 检 查 自 身 的 参 数 外 不 会 检 查 任 何 其 他 值 , 只 会 影 响 其 返 回 值 。 可 像 算 术运 算 符 一 样 , 对 这 种 函 数 进 行 公 共 子 表 达 式 删 除 和 循 环 优 化 。 这 些 函 数 应 该 用 属 性const 来 声 明 。 例 如 :int square (int) __attribute__ ((const int));也 就 是 说 , 上 述 假 设 的 square 函 数 的 实 际 被 调 用 次 数 即 使 比 程 序 指 定 的 次 数 少 一 些也 是 安 全 的 。应 该 注 意 , 如 果 函 数 有 指 针 参 数 , 且 检 查 指 针 指 向 的 数 据 , 那 么 这 种 函 数 一 定 不 能 用const 声 明 。 同 样 , 调 用 非 const 函 数 的 函 数 通 常 也 不 能 声 明 为 const。 具 有 void 返回 值 类 型 的 const 函 数 没 有 什 么 意 义 。deprecated关 于 deprecated 属 性 的 信 息 , 请 参 阅 第 2.3.1 节 “ 指 定 变 量 的 属 性 ” 。farfar 属 性 告 知 编 译 器 不 应 该 用 更 有 效 的 调 用 指 令 形 式 来 调 用 该 函 数 。format (archetype, string-index, first-to-check)format 属 性 指 定 一 个 函 数 具 有 printf、scanf 或 strftime 类 型 参 数 , 要 根 据 格 式字 符 串 检 查 这 些 参 数 的 类 型 。 例 如 , 考 虑 以 下 声 明 :extern intmy_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 <strong>C30</strong> 可以 检 查 对 这 些 函 数 的 调 用 有 无 错 误 。 每 当 要 求 这 种 警 告 ( 使 用 -Wformat) 时 , 编 译器 总 会 检 查 ANSI 库 函 数 printf、 fprintf、 sprintf、 scanf、 fscanf、sscanf、 strftime、 vprintf、 vfprintf 和 vsprintf 的 格 式 , 所 以 不 必 修 改头 文 件 stdio.h。DS51284C_CN 第 20 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> 与 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 <strong>C30</strong> 可 以检 查 对 printf、 scanf 或 strftime 函 数 的 调 用 , 这 些 函 数 的 操 作 数 是 对 用 户 定 义函 数 的 调 用 。nearnear 属 性 告 知 编 译 器 可 以 使 用 call 指 令 的 更 有 效 形 式 调 用 函 数 。no_instrument_function如 果 指 定 命 令 行 选 项 -finstrument-functions, 那 么 几 乎 所 有 用 户 函 数 的 入 口 和出 口 处 在 编 译 时 都 会 被 插 入 profiling 函 数 。 而 函 数 被 指 定 此 选 项 时 将 不 执 行 上 述 操 作 。noloadnoload 属 性 指 明 应 该 为 函 数 分 配 空 间 , 但 不 应 把 实 际 代 码 装 入 存 储 器 。 如 果 应 用 程 序设 计 为 在 运 行 时 将 函 数 装 入 存 储 器 ( 如 从 EEPROM), 这 一 属 性 很 有 用 。void bar() __attribute__ ((noload)) {...}noreturn一 些 标 准 库 函 数 是 不 能 返 回 的 , 例 如 abort 和 exit。 MPLAB <strong>C30</strong> 自 动 清 楚 这 种 情况 。 有 些 程 序 自 定 义 了 不 会 返 回 的 函 数 , 我 们 可 以 将 这 些 函 数 声 明 为 noreturn 来 告知 编 译 器 这 种 情 况 。void fatal (int i) __attribute__ ((noreturn));voidfatal (int i){/* Print error message. */exit (1);}noreturn 关 键 字 告 知 编 译 器 fatal 不 会 返 回 。 这 可 以 优 化 代 码 , 而 不 必 考 虑 如 果fatal 返 回 会 怎 样 。 这 可 以 在 某 种 程 度 上 优 化 代 码 。 而 且 这 样 有 助 于 避 免 未 初 始 化 变量 的 假 警 告 。对 于 noreturn 函 数 , 非 void 的 返 回 值 类 型 并 没 有 什 么 意 义 。© 2005 Microchip Technology Inc. DS51284C_CN 第 21 页


MPLAB ® <strong>C30</strong> 用 户 指 南section ("section-name")通 常 , 编 译 器 将 生 成 的 代 码 存 放 在 .text 段 中 。 但 有 时 可 能 需 要 其 他 的 段 , 或 者 需 要将 某 些 函 数 存 放 在 特 殊 的 段 中 。 Section 属 性 指 定 将 一 个 函 数 存 放 在 特 定 的 段 中 。 例如 下 面 的 声 明 :extern void foobar (void)__attribute__ ((section (".libtext")));上 述 语 句 将 函 数 foobar 存 放 在 .libtext 段 中 。section 属 性 与 address 属 性 有 冲 突 。 忽 略 段 名 会 导 致 警 告 。shadowshadow 属 性 使 编 译 器 使 用 影 子 寄 存 器 而 不 是 软 件 堆 栈 来 保 存 寄 存 器 。 该 属 性 通 常 与interrupt 属 性 同 时 使 用 。void __attribute__ ((interrupt, shadow)) _T1Interrupt (void)interrupt [ ( [ save(list) ] [, irq(irqid) ][, altirq(altirqid)] [, preprologue(asm) ]) ]使 用 这 个 选 项 来 指 明 指 定 的 函 数 是 一 个 中 断 服 务 程 序 。 当 指 定 该 属 性 时 , 编 译 器 将 生成 适 合 在 中 断 服 务 程 序 中 使 用 的 函 数 prologue 和 epilogue 序 列 。 可 选 参 数 save指 定 在 函 数 prologue 和 epilogue 中 各 自 要 保 存 和 恢 复 的 一 系 列 变 量 。 可 选 参 数irg 和 altirg 指 定 要 使 用 的 中 断 向 量 表 ID。 可 选 参 数 preprologue 指 定 要 在 编 译器 生 成 的 prologue 代 码 前 生 成 的 汇 编 代 码 。 完 整 描 述 和 例 子 , 参 见 第 7 章 “ 中断 ”。unused这 个 函 数 属 性 , 表 明 函 数 可 能 不 会 被 使 用 。MPLAB <strong>C30</strong> 不 会 为 这 种 函 数 发 出 未 使 用 函数 的 警 告 。weak关 于 weak 属 性 , 参 见 第 2.3.1 节 “ 指 定 变 量 的 属 性 ”。2.3.3 内 联 函 数通 过 声 明 一 个 函 数 为 inline, 可 以 指 示 MPLAB <strong>C30</strong> 将 这 个 函 数 的 代 码 集 成 到 调 用 函数 的 代 码 中 。 通 常 这 样 可 避 免 函 数 调 用 的 开 销 , 使 代 码 执 行 速 度 更 快 。 另 外 , 若 任 何实 际 的 参 数 值 为 常 数 , 它 们 的 已 知 值 可 允 许 在 编 译 时 进 行 简 化 , 这 样 不 用 包 含 所 有 的内 联 函 数 代 码 。 对 代 码 量 的 影 响 是 不 容 易 预 估 的 。 使 用 内 联 函 数 , 机 器 代 码 量 视 具 体情 况 可 能 更 大 也 有 可 能 更 小 。注 :仅 当 函 数 定 义 可 见 ( 不 只 是 有 函 数 原 型 ) 时 , 才 能 使 用 函 数 内 联 。 为 将 一个 函 数 内 联 到 多 个 源 文 件 中 , 可 将 函 数 定 义 放 在 每 个 源 文 件 包 含 的 头 文 件中 。DS51284C_CN 第 22 页© 2005 Microchip Technology Inc.


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


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


MPLAB <strong>C30</strong> 与 ANSI C 的 差 别一 个 函 数 若 可 能 改 变 一 个 全 局 寄 存 器 变 量 的 值 , 它 就 不 能 安 全 地 被 不 保 存 和 恢 复 该 变量 编 译 的 函 数 调 用 , 因 为 这 可 能 破 坏 调 用 函 数 返 回 时 期 望 找 到 的 值 。 因 此 , 若 一 个 程序 片 段 使 用 了 全 局 寄 存 器 变 量 , 作 为 该 程 序 片 段 入 口 的 函 数 必 须 显 式 地 保 存 和 恢 复 属于 其 调 用 函 数 的 值 。库 函 数 longjmp 将 恢 复 每 个 全 局 寄 存 器 变 量 在 setjmp 时 的 值 。所 有 全 局 寄 存 器 变 量 的 声 明 必 须 在 所 有 函 数 定 义 之 前 。 如 果 这 种 声 明 在 函 数 定 义 之 后 ,寄 存 器 可 能 被 声 明 之 前 的 函 数 用 于 其 他 用 途 。全 局 寄 存 器 变 量 不 能 有 初 值 , 因 为 可 执 行 文 件 不 能 为 一 个 寄 存 器 提 供 初 值 。2.3.4.2 为 局 部 变 量 指 定 寄 存 器可 以 通 过 以 下 语 句 用 一 个 指 定 的 寄 存 器 定 义 局 部 寄 存 器 变 量 :register int *foo asm ("w8");其 中 , w8 是 使 用 的 寄 存 器 名 。 应 该 注 意 这 与 定 义 全 局 寄 存 器 变 量 的 语 法 相 同 , 但 是 对于 局 部 变 量 , 这 种 定 义 应 该 出 现 在 一 个 函 数 中 。定 义 这 种 寄 存 器 不 保 留 寄 存 器 的 值 , 流 控 制 确 定 变 量 的 值 无 效 时 , 其 他 用 途 仍 可 使 用这 种 寄 存 器 。 使 用 这 一 功 能 , 可 能 使 编 译 某 些 函 数 时 可 用 寄 存 器 太 少 。该 选 项 并 不 能 保 证 MPLAB <strong>C30</strong> 生 成 的 代 码 始 终 将 这 一 变 量 存 放 在 指 定 的 寄 存 器 中 。不 可 以 在 asm 语 句 中 , 编 写 对 该 寄 存 器 的 显 式 引 用 , 并 假 定 它 总 是 引 用 这 个 变 量 。局 部 寄 存 器 变 量 不 使 用 时 其 分 配 可 被 删 除 。 对 局 部 寄 存 器 变 量 的 引 用 可 以 被 删 除 、 移动 或 简 化 。2.3.5 复 数MPLAB <strong>C30</strong> 支 持 复 数 数 据 类 型 。 我 们 可 以 用 关 键 字 __complex__ 来 声 明 整 型 复 数 和浮 点 型 复 数 。例 如 , __complex__ float x; 定 义 x 为 实 部 和 虚 部 都 是 浮 点 型 的 变 量 。__complex__ short int y; 定 义 y 的 实 部 和 虚 部 都 是 short int 型 的 。要 写 一 个 复 数 数 据 类 型 的 常 量 , 使 用 后 缀 “i” 或 “j”( 两 者 之 一 , 两 者 是 等 同的 )。 例 如 , 2.5fi 是 __complex__ float 型 的 , 3i 是 __complex__ int 型的 。 这 种 常 量 只 有 虚 部 值 , 但 是 我 们 可 以 通 过 将 其 与 实 常 数 相 加 来 形 成 任 何 复 数 值 。要 提 取 复 数 值 符 号 exp 的 实 部 , 写 __real__ exp。 类 似 地 , 用 __imag__ 来 提 取虚 部 。 例 如 :__complex__ float z;float r;float i;r = __real__ z;i = __imag__ z;当 对 复 数 型 值 使 用 算 子 “~” 时 , 执 行 复 数 的 共 扼 。© 2005 Microchip Technology Inc. DS51284C_CN 第 25 页


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


MPLAB <strong>C30</strong> 与 ANSI C 的 差 别2.4 语 句 差 别本 节 讲 述 普 通 ANSI C 与 MPLAB <strong>C30</strong> 所 接 受 C 之 间 的 语 句 差 别 。 语 句 差 别 是 基 本GCC 实 现 的 一 部 分 , 本 节 讨 论 的 内 容 基 于 标 准 GCC 文 档 , 选 择 了 GCC 中 MPLAB<strong>C30</strong> 部 分 的 特 定 语 法 和 语 义 来 讲 述 。• 将 标 号 作 为 值• 省 略 操 作 数 的 条 件 表 达 式• case 范 围2.4.1 将 标 号 作 为 值可 以 用 单 目 运 算 符 “&&” 获 得 在 当 前 函 数 ( 或 包 含 函 数 ) 中 定 义 的 标 号 的 地 址 。 值 的类 型 为 void *。 这 个 值 为 常 量 , 并 可 在 这 种 类 型 的 常 量 有 效 的 任 何 地 方 使 用 这 个 值 。例 如 :void *ptr;...ptr = &&foo;为 使 用 这 些 值 , 需 要 能 跳 转 到 值 。 这 通 过 相 对 goto 语 句 goto *exp; 来 实 现 。 例 如 :goto *ptr;可 使 用 void * 类 型 的 任 何 表 达 式 。这 些 常 量 的 一 个 用 途 是 用 于 初 始 化 用 作 跳 转 表 的 静 态 数 组 :static void *array[] = { &&foo, &&bar, &&hack };然 后 就 可 以 通 过 索 引 来 这 样 选 择 标 号 :goto *array[i];注 : 这 并 不 检 查 下 标 是 否 超 出 范 围 (C 中 的 数 组 索 引 从 不 这 样 做 )。这 种 标 号 值 数 组 的 用 途 与 switch 语 句 很 类 似 。 switch 语 句 更 整 齐 , 比 数 组 更 好 。标 号 值 的 另 外 一 个 用 途 是 在 线 程 代 码 的 解 释 程 序 中 。 解 释 程 序 函 数 中 的 标 号 可 存 储 在线 程 代 码 中 用 于 快 速 调 度 。这 种 机 制 可 能 被 错 误 使 用 , 而 跳 转 到 其 他 函 数 的 代 码 中 。 编 译 器 不 能 阻 止 这 种 现 象 的发 生 , 因 此 必 须 小 心 , 确 保 目 标 地 址 对 于 当 前 函 数 有 效 。© 2005 Microchip Technology Inc. DS51284C_CN 第 27 页


MPLAB ® <strong>C30</strong> 用 户 指 南2.5 表 达 式 差 别2.4.2 省 略 操 作 数 的 条 件 表 达 式条 件 表 达 式 的 中 间 操 作 数 可 以 被 省 略 。 如 果 第 一 个 操 作 数 非 零 , 它 的 值 就 是 条 件 表 达式 的 值 。因 此 , 对 于 表 达 式 :x ? : y如 果 x 的 值 非 零 , 表 达 式 的 值 就 是 x 的 值 ; 否 则 , 就 是 y 的 值 。这 个 例 子 完 全 等 价 于 :x ? x : y在 这 个 简 单 的 例 子 中 , 省 略 中 间 操 作 数 并 不 是 特 别 有 用 。 当 第 一 个 操 作 数 存 在 或 者 可能 存 在 ( 如 果 它 是 一 个 宏 参 数 ) 副 作 用 时 , 省 略 中 间 操 作 数 就 变 得 特 别 有 用 。 那 么 重复 中 间 操 作 数 将 产 生 副 作 用 两 次 。 省 略 中 间 操 作 数 使 用 了 已 经 计 算 过 的 值 , 而 不 会 因为 重 新 计 算 而 产 生 不 希 望 的 影 响 。2.4.3 case 范 围可 以 如 下 在 单 个 case 标 号 中 指 定 一 个 连 续 值 的 范 围 :case low ... high:这 与 各 个 case 标 号 的 适 当 数 字 有 相 同 的 作 用 , 每 个 数 字 对 应 从 low 到 high 中 的 每个 整 数 值 。这 一 功 能 对 于 ASCII 字 符 码 范 围 特 别 有 用 :case 'A' ... 'Z':注 意 : 在 ... 两 边 要 写 空 格 , 否 则 它 和 整 数 一 起 使 用 时 可 能 出 现 解 析 错 误 。 例 如 要 这 样写 :case 1 ... 5:而 不 要 这 样 写 :case 1...5:本 节 讨 论 普 通 ANSI C 和 MPLAB <strong>C30</strong> 所 接 受 的 C 之 间 的 表 达 式 差 别 。2.5.1 二 进 制 常 量前 面 有 0b 或 0B 的 一 串 二 进 制 数 字 ( 数 字 “0” 后 跟 字 母 “b” 或 “B”) 视 为 二 进制 整 型 。 二 进 制 数 字 由 数 字 “0” 和 “1” 组 成 。 例 如 , 十 进 制 数 字 255 可 用 二 进 制 表示 为 0b11111111。像 其 他 整 型 常 量 一 样 , 二 进 制 常 量 可 以 以 字 母 “u” 或 “U” 为 后 缀 来 指 定 为 无 符 号型 。 二 进 制 常 量 也 可 以 以 字 母 “l” 或 “L” 为 后 缀 , 指 定 为 长 整 型 。 类 似 地 , 后 缀“ll” 或 “LL” 表 示 双 字 整 型 的 二 进 制 常 量 。DS51284C_CN 第 28 页© 2005 Microchip Technology Inc.


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


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


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


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


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


MPLAB ® <strong>C30</strong> 用 户 指 南3.5.3 控 制 C 语 言 的 选 项表 3-4:选 项C 语 言 控 制 选 项定 义-ansi 支 持 所 有 ( 且 仅 支 持 ) ANSI 标 准 的 C 程 序 。-aux-info filename-ffreestanding-fno-asm-fno-builtin-fno-builtin-function-fsigned-char-fsigned-bitfields-funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields-funsigned-char-fwritable-strings对 于 在 翻 译 单 元 中 声 明 和 / 或 定 义 的 函 数 , 包 括 头 文 件 中 的函 数 , 输 出 到 给 定 文 件 名 的 原 型 声 明 中 。 除 了 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, 它 使 位 域 总 是无 符 号 的 。使 char 型 变 量 无 符 号 , 就 像 usigned char。将 字 符 串 存 储 到 可 写 的 数 据 段 中 , 但 不 要 使 字 符 串 成 为 唯 一的 。DS51284C_CN 第 34 页© 2005 Microchip Technology Inc.


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


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


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


MPLAB ® <strong>C30</strong> 用 户 指 南表 3-5: -WALL 隐 含 的 警 告 / 错 误 选 项 ( 续 )选 项定 义-Wunused-parameter 当 对 函 数 参 数 进 行 了 声 明 但 从 未 使 用 时 , 发 出 警 告 。 要 禁 止这 种 警 告 , 使 用 unused 属 性 ( 参 见 第 2.3.1 节 “ 指 定 变 量的 属 性 ”)。-Wunused-variable 当 对 局 部 变 量 或 非 常 量 的 static 变 量 进 行 了 声 明 但 从 未 使 用时 , 发 出 警 告 。 要 禁 止 这 种 警 告 , 使 用 unused 属 性 ( 参 见第 2.3.1 节 “ 指 定 变 量 的 属 性 ”)。-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] 不会 产 生 警 告 。• 用 < 或


使 用 MPLAB <strong>C30</strong> C 编 译 器表 3-6: 不 被 -WALL 隐 含 的 警 告 / 错 误 选 项 ( 续 )选 项定 义• 聚 集 的 初 始 化 中 括 号 不 全 。 例 如 , 下 面 的 代 码 由 于 在 初 始 化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如 果 一 个 原 型 导 致 一 个 参 数 的 类 型 转 换 与 没 有 原 型 时 不 同 , 则 发出 警 告 。 这 包 括 定 点 型 转 换 为 浮 点 型 或 反 之 , 及 改 变 定 点 参 数 符号 或 宽 度 的 转 换 , 与 默 认 的 提 升 相 同 时 除 外 。当 负 的 整 型 常 量 表 达 式 隐 式 转 换 为 无 符 号 类 型 时 也 发 出 警 告 。 例如 , 如 果 x 为 无 符 号 类 型 , 赋 值 x = -1 将 产 生 警 告 。 但 是 , 显式 的 强 制 类 型 转 换 , 如 (unsigned) -1, 不 会 产 生 警 告 。-Werror 使 所 有 警 告 变 为 错 误 。-Winline一 个 函 数 已 声 明 为 内 联 , 或 指 定 了 -finline-functions 选项 时 , 如 果 函 数 不 能 被 内 联 , 将 产 生 警 告 。-Wlarger-than-len 当 定 义 了 大 于 len 字 节 的 对 象 时 产 生 警 告 。-Wlong-long-Wno-long-long-Wmissing-declarations-Wmissingformat-attribute使 用 long long 类 型 时 发 出 警 告 。 这 是 默 认 设 置 。 为 禁 止 警 告消 息 , 使 用 -Wno-long-long。 仅 当 使 用 -pedantic 标 志时 , 才 考 虑 标 志 -Wlong-long 和 -Wno-long-long。如 果 在 定 义 一 个 全 局 函 数 之 前 没 有 先 对 其 进 行 声 明 将 产 生 警 告 。即 使 定 义 本 身 提 供 了 原 型 , 也 要 在 定 义 全 局 函 数 之 前 先 声 明 它 。如 果 使 能 了 -Wformat, 可 指 定 format 属 性 的 函 数 也 会 产 生警 告 。 注 意 这 些 函 数 仅 是 可 指 定 format 属 性 的 函 数 , 不 是 已 指定 format 属 性 的 函 数 。 如 果 不 使 能 -Wformat, 这 一 选 项 不起 作 用 。© 2005 Microchip Technology Inc. DS51284C_CN 第 39 页


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


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


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


使 用 MPLAB <strong>C30</strong> 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 前 后 的 跳 转 。执 行 许 多 成 本 较 高 的 次 要 优 化 。将 每 个 函 数 或 数 据 项 存 放 到 输 出 文 件 中 其 自 己 的 段 。 函 数 名 或数 据 项 名 决 定 输 出 文 件 中 的 段 名 。仅 当 使 用 这 些 选 项 有 明 显 的 好 处 时 , 才 使 用 这 些 选 项 。 当 指 定这 些 选 项 时 , 汇 编 器 和 链 接 器 可 能 生 成 较 大 的 目 标 文 件 和 可 执行 文 件 , 且 速 度 较 慢 。© 2005 Microchip Technology Inc. DS51284C_CN 第 43 页


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


使 用 MPLAB <strong>C30</strong> C 编 译 器表 3-9: 特 定 的 优 化 选 项 ( 续 )选 项-fstrict-aliasing定 义允 许 编 译 器 采 用 适 用 于 被 编 译 语 言 的 最 严 格 别 名 规 则 。 对 于C, 这 根 据 表 达 式 的 类 型 进 行 优 化 。 尤 其 是 , 假 定 一 种 类 型 的对 象 不 会 和 另 一 种 类 型 的 对 象 存 放 在 同 一 地 址 , 除 非 类 型 几 乎相 同 。 例 如 , unsigned int 可 引 用 int, 但 不 能 引 用void* 或 double。 字 符 类 型 可 引 用 任 何 其 他 类 型 。特 别 要 注 意 下 面 的 代 码 :union a_union {int i;double d;};-fthread-jumps-funroll-loops-funroll-all-loopsint 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。© 2005 Microchip Technology Inc. DS51284C_CN 第 45 页


MPLAB ® <strong>C30</strong> 用 户 指 南-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 <strong>C30</strong> 限 制 可 内 联 的 函 数 的 大 小 。 这个 选 项 允 许 控 制 显 式 声 明 为 inline 的 函 数 ( 即 用 inline关 键 字 标 记 的 函 数 ) 的 这 一 限 制 。 n 是 可 内 联 的 函 数 的 大小 , 以 虚 拟 指 令 的 条 数 为 单 位 ( 参 数 处 理 不 包 括 在 内 )。n 的 默 认 值 为 10000。 增 加 这 个 值 可 能 导 致 被 内 联 的 代 码更 多 , 并 可 能 增 加 编 译 时 间 和 存 储 器 开 销 。减 小 这 个 值 通 常 使 编 译 更 快 , 更 少 的 代 码 被 内 联 ( 可 能 程序 执 行 速 度 变 慢 )。 这 一 选 项 对 于 使 用 内 联 的 程 序 尤 其 有用 。注 : 在 这 里 , 虚 拟 指 令 代 表 函 数 大 小 的 抽 象 测 量 。 它 不 代表 汇 编 指 令 条 数 , 同 样 对 于 不 同 版 本 的 编 译 器 , 它 的 确 切含 义 可 能 会 有 所 不 同 。即 使 合 并 了 对 一 个 给 定 函 数 的 所 有 调 用 , 且 函 数 声 明 为static, 输 出 函 数 的 一 个 独 立 的 运 行 时 可 调 用 形 式 。 这个 选 项 不 影 响 extern 内 联 函 数 。当 没 有 开 启 优 化 时 , 发 出 声 明 为 static const 的 变 量 , 即使 变 量 没 有 被 引 用 。MPLAB <strong>C30</strong> 默 认 使 能 这 个 选 项 。 如 果 需 要 强 制 编 译 器 检查 是 否 引 用 了 这 个 变 量 , 而 不 管 是 否 开 启 了 优 化 , 使 用-fno-keep-static-consts 选 项 。不 要 将 函 数 的 地 址 存 放 在 寄 存 器 中 ; 使 调 用 constant 函 数的 每 条 指 令 显 式 包 含 函 数 的 地 址 。这 个 选 项 导 致 生 成 的 代 码 效 率 不 高 , 但 对 于 某 些 企 图 修 改程 序 的 人 来 说 , 会 对 不 使 用 这 个 选 项 而 生 成 的 优 化 程 序 感到 束 手 无 策 。DS51284C_CN 第 46 页© 2005 Microchip Technology Inc.


使 用 MPLAB <strong>C30</strong> C 编 译 器表 3-10: 独 立 于 机 器 的 优 化 选 项 ( 续 )选 项定 义-fno-inline不 要 理 会 inline 关 键 字 。 这 个 选 项 通 常 用 于 使 编 译 器 不要 展 开 任 何 内 联 函 数 。 如 果 不 使 能 优 化 , 不 会 展 开 任 何 内联 函 数 。-fomit-frame-pointer 对 于 不 需 要 帧 指 针 的 函 数 , 不 要 将 帧 指 针 存 放 在 寄 存 器中 。 这 可 以 避 免 指 令 保 护 、 设 置 和 恢 复 帧 指 针 ; 它 还 使 一个 额 外 的 寄 存 器 可 用 于 许 多 函 数 。-foptimize-sibling-calls 优 化 同 属 和 尾 递 归 调 用 。3.5.7 控 制 预 处 理 器 的 选 项表 3-11:选 项预 处 理 器 选 项定 义-Aquestion (answer)断 言 问 题 question 的 答 案 answer, 以 防 用 预 处 理 条 件 , 如#if #question(answer) 来 测 试 问 题 。 -A- 禁 止 通 常 描 述 目标 机 器 的 标 准 断 言 。例 如 , main 的 函 数 原 型 可 声 明 如 下 :#if #environ(freestanding)int main(void);#elseint 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 打 印 使 用 的 每 个 头 文 件 的 名 字 以 及 其 他 正 常 活 动 。© 2005 Microchip Technology Inc. DS51284C_CN 第 47 页


MPLAB ® <strong>C30</strong> 用 户 指 南表 3-11: 预 处 理 器 选 项 ( 续 )选 项定 义-I-仅 对 于 #include "file", 才 搜 索 在 -I- 选 项 之 前 -I 选 项指 定 的 任 何 目 录 ; 对 于 #include , 则 不 搜 索 这 些 目录 。如 果 在 -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 指 定 。 如 果 没 有 指 定 前 缀 , 将 使用 包 含 编 译 器 安 装 路 径 的 目 录 作 为 默 认 目 录 。-iwithprefixbeforedir将 一 个 目 录 添 加 到 主 包 含 路 径 。 目 录 名 由 前 缀 和 dir 组 成 , 这与 -iwithprefix 相 同 。DS51284C_CN 第 48 页© 2005 Microchip Technology Inc.


使 用 MPLAB <strong>C30</strong> C 编 译 器表 3-11: 预 处 理 器 选 项 ( 续 )选 项定 义-M 告 知 预 处 理 器 输 出 适 合 于 描 述 每 个 目 标 文 件 的 相 关 性 的 make的 规 则 。 对 于 每 个 源 文 件 , 预 处 理 器 输 出 目 标 为 该 源 文 件 目 标文 件 名 且 其 相 关 性 为 它 使 用 的 所 有 #include 头 文 件 的 make规 则 。 这 个 规 则 可 以 为 单 行 的 或 者 太 长 时 可 用 \ 换 行 符 来 继 续 。规 则 列 表 打 印 在 标 准 输 出 中 , 而 不 是 打 印 在 预 处 理 的 C 程 序中 。-M 隐 含 -E ( 参 见 第 3.5.2 节 “ 控 制 输 出 类 型 的 选 项 ”)。-MD与 -M 类 似 , 但 将 相 关 性 信 息 写 到 一 个 文 件 , 编 译 继 续 进 行 。 包含 相 关 性 信 息 的 文 件 的 名 字 与 带 .d 扩 展 名 的 源 文 件 名 字 相 同 。-MF file当 与 -M 或 -MM 一 起 使 用 时 , 指 定 向 其 中 写 入 相 关 性 信 息 的 文件 。 如 果 不 给 定 -MF 开 关 , 预 处 理 器 将 发 送 规 则 到 微 处 理 器 输出 发 送 到 的 地 方 。当 与 驱 动 程 序 选 项 -MD 或 -MMD 一 起 使 用 时 ,-MF 覆 盖 默 认 的相 关 性 输 出 文 件 。-MG将 缺 少 的 头 文 件 视 为 生 成 的 文 件 , 并 假 定 它 们 位 于 源 文 件 所 在的 目 录 中 。 如 果 指 定 了 -MG, 那 么 必 须 也 指 定 -M 或 -MM。-MD 或 -MMD 不 支 持 -MG。-MM类 似 于 -M, 但 输 出 仅 涉 及 到 用 #include “file" 包 含 的 用 户头 文 件 。 用 #include 包 含 的 系 统 头 文 件 被 忽 略 。-MMD 类 似 于 -MD, 但 仅 涉 及 到 用 户 头 文 件 , 不 涉 及 到 系 统 头 文 件 。-MP这 个 选 项 指 示 CPP 除 主 文 件 外 , 还 要 为 每 个 相 关 性 添 加 假 目标 , 使 每 个 不 依 赖 于 任 何 其 他 。 如 果 删 除 头 文 件 时 不 更 新Makefile 来 匹 配 , 这 些 假 规 则 将 避 开 make 发 出 的 错 误 。下 面 是 典 型 的 输 出 :test.o: test.c test.htest.h:-MQ 与 -MT 相 同 , 但 它 将 特 定 于 Make 的 任 何 字 符 用 引 号 括 起 来 。-MQ '$(objpfx)foo.o' 给 出 $$(objpfx)foo.o:foo.c默 认 的 目 标 自 动 被 引 号 括 起 来 , 就 像 指 定 了 -MQ 一 样 。-MT target改 变 相 关 性 生 成 发 出 的 规 则 的 目 标 。 默 认 情 况 下 , CPP 采 用 主输 入 文 件 的 名 字 , 包 含 任 何 路 径 , 删 除 任 何 文 件 后 缀 ( 如.c), 并 添 加 平 台 的 通 常 目 标 后 缀 。 结 果 就 是 目 标 。-MT 选 项 将 目 标 设 置 为 你 指 定 的 字 符 串 。 如 果 需 要 多 个 目 标 , 可件 它 们 指 定 为 -MT 的 一 个 参 数 , 或 使 用 多 个 -MT 选 项 。例 如 :-MT '$(objpfx)foo.o' 可 能 得 到 $(objpfx)foo.o:foo.c© 2005 Microchip Technology Inc. DS51284C_CN 第 49 页


MPLAB ® <strong>C30</strong> 用 户 指 南表 3-11: 预 处 理 器 选 项 ( 续 )选 项定 义-nostdinc不 要 在 标 准 系 统 目 录 中 搜 索 头 文 件 。 仅 搜 索 用 -I 选 项 指 定 的 目录 ( 及 当 前 目 录 , 如 果 需 要 的 话 )。( 关 于 -I 选 项 的 信 息 , 请参 阅 第 3.5.10 节 “ 目 录 搜 索 选 项 ”)。通 过 同 时 使 用 -nostdinc 和 -I-, 可 将 头 文 件 搜 索 路 径 限 制为 仅 包 括 显 式 指 定 的 目 录 。-P 告 知 预 处 理 器 不 要 产 生 #line 伪 指 令 。 与 -E 选 项 一 起 使 用( 参 阅 第 3.5.2 节 “ 控 制 输 出 类 型 的 选 项 ”)。-trigraphs 支 持 ANSI C 三 字 母 组 合 。-ansi 选 项 也 有 这 个 作 用 。-Umacro取 消 宏 macro 定 义 。 -U 选 项 在 所 有 -D 选 项 之 后 , 但 在 任 何-include 和 -imacros 选 项 之 前 起 作 用 。-undef 不 要 预 定 义 任 何 非 标 准 宏 。( 包 括 结 构 标 志 )。3.5.8 汇 编 选 项表 3-12:选 项-Wa,option汇 编 选 项定 义把 option 作 为 一 个 选 项 传 递 给 汇 编 器 。 如 果 option 中 包 含 逗号 , 说 明 有 多 个 选 项 通 过 逗 号 分 隔 开 。DS51284C_CN 第 50 页© 2005 Microchip Technology Inc.


使 用 MPLAB <strong>C30</strong> C 编 译 器3.5.9 链 接 选 项如 果 使 用 了 -c、 -S 或 -E 选 项 中 的 任 何 一 个 , 则 链 接 器 不 会 运 行 , 且 不 应 将 目 标 文 件 名 用 作参 数 。表 3-13:选 项链 接 选 项定 义-Ldir 将 目 录 dir 添 加 到 命 令 行 选 项 -l 指 定 的 在 其 中 搜 索 库 的 目 录 列 表 中 。-llibrary 链 接 时 搜 索 名 为 library 的 库 。链 接 器 在 标 准 目 录 列 表 中 搜 索 库 , 实 际 上 是 一 个 名 为 liblibrary.a的 文 件 。 链 接 器 随 后 对 这 个 文 件 的 使 用 , 就 好 像 已 经 通 过 文 件 名 精 确 指定 了 这 个 文 件 一 样 。在 命 令 中 的 何 处 写 这 个 选 项 是 有 所 不 同 的 , 链 接 器 按 照 指 定 库 文 件 和 目标 文 件 的 顺 序 来 处 理 这 些 文 件 。 因 此 , foo.o -lz bar.o 先 搜 索foo.o, 再 搜 索 库 z, 最 后 搜 索 bar.o。 如 果 bar.o 引 用 libz.a 中 的 函数 , 则 可 能 不 装 载 这 些 函 数 。搜 索 的 目 录 包 括 几 个 标 准 系 统 目 录 和 使 用 -L 指 定 的 任 何 目 录 。通 常 采 用 这 种 方 法 找 到 的 文 件 是 库 文 件 ( 其 成 员 为 目 标 文 件 的 归 档 文件 )。 链 接 器 通 过 浏 览 归 档 文 件 查 找 定 义 目 前 引 用 过 但 未 定 义 的 符 号 的成 员 来 处 理 归 档 文 件 。 但 如 果 找 到 的 文 件 是 一 个 普 通 的 目 标 文 件 , 则 以通 常 的 方 式 链 接 这 个 文 件 。 使 用 -l 选 项 ( 如 -lmylib) 和 指 定 文 件 名( 如 libmylib.a) 的 唯 一 不 同 之 处 在 于 ,-l 按 照 指 定 搜 索 几 个 目 录 。默 认 情 况 下 , 链 接 器 被 指 示 在 \lib 中 搜 索 -l 选 项指 定 的 库 。 对 于 安 装 到 默 认 路 径 的 编 译 器 , 这 个 目 录 为 :c:\pic30_tools\lib。可 使 用 在 第 3.6 节 “ 环 境 变 量 ” 中 定 义 的 环 境 变 量 覆 盖 这 个 操 作 。-nodefaultlibs 链 接 时 不 要 使 用 标 准 系 统 库 文 件 。 仅 指 定 的 库 文 件 会 被 传 递 给 链 接 器 。编 译 器 可 能 产 生 对 memcmp、 memset 和 memcpy 的 调 用 。 这 些 入 口 通常 由 标 准 编 译 器 库 中 的 入 口 解 析 。 当 指 定 这 个 选 项 时 , 应 通 过 其 他 某 个机 制 来 提 供 这 些 入 口 点 。-nostdlib 链 接 时 不 要 使 用 标 准 系 统 启 动 文 件 或 库 文 件 。 没 有 启 动 文 件 , 仅 指 定 的库 文 件 会 被 传 递 给 链 接 器 。 编 译 器 可 能 产 生 对 memcmp、 memset和 memcpy 的 调 用 。 这 些 入 口 通 常 由 标 准 编 译 器 库 中 的 入 口 解 析 。 当 指定 这 个 选 项 时 , 应 通 过 其 他 某 个 机 制 来 提 供 这 些 入 口 点 。-s 从 可 执 行 文 件 删 除 所 有 符 号 表 和 重 定 位 信 息 。-u symbol 假 定 symbol 未 定 义 , 强 制 链 接 库 模 块 来 定 义 这 个 符 号 。 可 对 不 同 的 符号 多 次 使 用 -u 来 强 制 装 载 其 他 库 模 块 , 这 样 做 是 合 法 的 。-Wl,option 将 option 作 为 一 个 选 项 传 递 给 链 接 器 。 如 果 option 包 含 逗 号 , 它 包含 逗 号 分 隔 开 的 多 个 选 项 。-Xlinker option 将 option 作 为 一 个 选 项 传 递 给 链 接 器 。 可 使 用 这 个 选 项 提 供 MPLAB<strong>C30</strong> 不 知 如 何 识 别 的 特 定 系 统 链 接 器 选 项 。© 2005 Microchip Technology Inc. DS51284C_CN 第 51 页


MPLAB ® <strong>C30</strong> 用 户 指 南3.5.10 目 录 搜 索 选 项表 3-14:选 项-Bprefix-specs=file目 录 搜 索 选 项定 义这 个 选 项 指 定 在 哪 里 查 找 可 执 行 文 件 、 库 文 件 、 头 文 件 和 编 译 器 本身 的 数 据 文 件 。编 译 器 驱 动 程 序 运 行 子 程 序 pic30-cpp、 pic30-cc1、pic30-as 和 pic30 中 的 一 个 或 多 个 子 程 序 。 它 将 其 运 行 的 每 个 程序 加 上 prefix 作 为 前 缀 。对 于 要 运 行 的 每 个 子 程 序 , 编 译 器 驱 动 程 序 首 先 使 用 -B 前 缀 ( 如果 存 在 的 话 )。 如 果 找 不 到 子 程 序 , 或 未 指 定 -B, 驱 动 程 序 将 使用 PI<strong>C30</strong>_EXEC_PREFIX 环 境 变 量 ( 如 果 设 置 了 的 话 ) 中 保 存 的值 。 更 多 信 息 , 请 参 阅 第 3.6 节 “ 环 境 变 量 ”。 最 后 , 驱 动 程 序 将在 当 前 的 PATH 环 境 变 量 中 搜 索 子 程 序 。有 效 指 定 目 录 名 的 -B 前 缀 也 适 用 于 链 接 器 中 的 库 , 因 为 编 译 器 将这 些 选 项 翻 译 为 链 接 器 的 -L 选 项 。 它 们 也 适 用 于 预 处 理 器 中 的 头文 件 , 因 为 编 译 器 将 这 些 选 项 转 化 为 预 处 理 器 的 -isystem 选 项 。在 这 种 情 况 下 , 编 译 器 在 前 缀 上 附 加 include。 指 定 很 像 -B 这样 的 前 缀 的 另 外 一 种 方 法 是 使 用 环 境 变 量PI<strong>C30</strong>_EXEC_PREFIX。为 覆 盖 当 确 定 哪 些 开 关 传 递 给 pic30-cc1、 pic30-as 和pic30-ld 等 时 , pic30-gcc 驱 动 程 序 使 用 的 默 认 设 置 , 在 编 译器 读 入 标 准 specs 文 件 后 处 理 文 件 。 可 在 命 令 行 中 指 定 多 个-specs=file, 以 自 左 向 右 的 顺 序 处 理 这 些 文 件 。DS51284C_CN 第 52 页© 2005 Microchip Technology Inc.


使 用 MPLAB <strong>C30</strong> C 编 译 器3.5.11 代 码 生 成 约 定 选 项-fflag 形 式 的 选 项 指 定 独 立 于 机 器 的 标 志 。 大 多 数 标 志 都 有 正 的 形 式 和 负 的 形 式 ;-ffoo 负 的 形 式 为 -fno-foo。 在 下 表 中 , 仅 列 出 了 一 种 形 式 ( 非 默 认 形 式 )。表 3-15:-fcall-saved-reg-fcall-used-reg-ffixed-reg选 项-fargument-alias-fargument-noalias-fargumentnoalias-global-finstrumentfunctions代 码 生 成 约 定 选 项定 义指 定 参 数 之 间 以 及 参 数 和 全 局 数 据 之 间 的 可 能 关 系 。-fargument-alias 指 定 实 参 ( 形 参 ) 可 互 相 引 用 , 并 可 引 用 全局 存 储 。-fargument-noalias 指 定 实 参 不 能 互 相 引 用 , 但 可 引 用 全 局 存储 。-fargument-noalias-global 指 定 实 参 不 能 互 相 引 用 , 也 不 能引 用 全 局 存 储 。每 种 语 言 都 自 动 使 用 语 言 标 准 所 要 求 的 选 项 。 不 需 要 自 己 使 用 这 些选 项 。将 名 为 reg 的 寄 存 器 视 为 函 数 保 存 的 可 分 配 寄 存 器 。 甚 至 可 在 其 中分 配 临 时 变 量 或 跨 调 用 有 效 的 变 量 。 如 果 函 数 使 用 了 寄 存 器 reg,那 么 采 用 这 种 方 式 编 译 的 函 数 将 保 护 和 恢 复 这 个 寄 存 器 。对 帧 指 针 和 堆 栈 指 针 使 用 这 个 标 志 是 错 误 的 。 将 这 个 标 志 用 于 在 机器 执 行 模 型 中 有 固 定 重 要 作 用 的 其 他 寄 存 器 , 将 产 生 灾 难 性 结 果 。将 这 个 标 志 用 于 保 存 函 数 返 回 值 的 寄 存 器 将 产 生 另 一 种 灾 难 性 结果 。在 所 有 模 块 中 , 这 个 标 志 应 该 一 致 。将 名 为 reg 的 寄 存 器 视 为 被 函 数 调 用 破 坏 的 可 分 配 寄 存 器 。 可 将 这个 寄 存 器 分 配 给 临 时 变 量 或 跨 调 用 无 效 的 变 量 。 采 用 这 个 选 项 编 译的 函 数 不 会 保 护 和 恢 复 寄 存 器 reg。对 帧 指 针 或 堆 栈 指 针 使 用 这 个 选 项 是 错 误 的 。 将 这 个 标 志 用 于 在 机器 执 行 模 型 中 有 固 定 重 要 作 用 的 其 他 寄 存 器 , 将 产 生 灾 难 性 结 果 。在 所 有 模 块 中 , 这 个 标 志 应 该 一 致 。将 名 为 reg 的 寄 存 器 视 为 固 定 寄 存 器 ; 生 成 的 代 码 绝 对 不 能 引 用 它( 除 非 作 为 堆 栈 指 针 、 帧 指 针 或 某 个 其 他 固 定 的 功 能 )。reg 必 须 为 寄 存 器 的 名 字 , 如 -ffixed-w3。编 译 时 在 函 数 的 入 口 和 出 口 生 成 instrumentation 调 用 。 在 函 数 入 口之 后 和 函 数 出 口 之 前 , 将 通 过 当 前 函 数 的 地 址 及 其 调 用 地 址 来 调 用下 面 的 profiling 函 数 。void __cyg_profile_func_enter(void *this_fn, void *call_site);void __cyg_profile_func_exit(void *this_fn, void *call_site);第 一 个 参 数 是 当 前 函 数 的 起 始 地 址 , 可 在 符 号 表 中 查 找 到 。profiling 函 数 应 由 用 户 提 供 。函 数 instrumentation 要 求 使 用 帧 指 针 。 某 些 优 化 级 别 禁 止 使 用 帧 指针 。 使 用 -fno-omit-frame-pointer 将 禁 止 这 一 点 。© 2005 Microchip Technology Inc. DS51284C_CN 第 53 页


MPLAB ® <strong>C30</strong> 用 户 指 南表 3-15: 代 码 生 成 约 定 选 项 ( 续 )选 项定 义instrumentation 也 可 用 于 在 其 他 函 数 中 扩 展 内 联 的 函 数 。 profiling调 用 表 明 从 概 念 上 来 讲 在 哪 里 进 入 和 退 出 内 联 函 数 。 这 意 味 着 这 种函 数 必 须 具 有 可 寻 址 形 式 。 如 果 对 一 个 函 数 的 所 有 使 用 都 扩 展 内联 , 这 会 增 加 额 外 增 加 代 码 长 度 。 如 果 要 在 C 代 码 中 使 用 externinline, 必 须 提 供 这 种 函 数 的 可 寻 址 形 式 。可 对 函 数 指 定 属 性 no_instrument_function, 在 这 种 情 况 下不 会 进 行 instrumentation。-fno-ident 忽 略 #ident 伪 指 令 。-fpack-struct 将 所 有 结 构 成 员 无 缝 隙 地 压 缩 在 一 起 。 通 常 不 希 望 使 用 这 个 选 项 ,因 为 它 使 代 码 不 是 最 优 化 的 , 且 结 构 成 员 的 偏 移 量 与 系 统 库 不 相符 。-fpcc-structreturn-fno-short-double-fshort-enums-fverbose-asm-fno-verbose-asm-fvolatile-fvolatile-global-fvolatile-staticdsPIC 器 件 要 求 字 按 偶 数 字 节 边 界 对 齐 , 因 此 当 使 用 packed 属 性时 要 小 心 , 避 免 运 行 时 寻 址 错 误 。像 长 值 一 样 , 将 短 struct 和 union 值 返 回 到 存 储 器 中 , 而 不 是返 回 到 寄 存 器 中 。 这 样 做 效 率 不 高 , 但 其 优 点 是 可 以 使 MPLAB<strong>C30</strong> 编 译 的 文 件 与 其 他 编 译 器 编 译 的 文 件 兼 容 。短 结 构 和 联 合 指 长 度 和 对 齐 都 与 整 型 匹 配 的 结 构 和 联 合 。默 认 情 况 下 , 编 译 器 使 用 与 float 等 价 的 double 型 。 这 个 选 项使 得 double 与 long double 等 价 。 如 果 模 块 通 过 参 数 传 递 直 接或 通 过 共 享 缓 冲 空 间 间 接 共 用 double 数 据 , 跨 模 块 混 合 使 用 这 个选 项 可 能 会 产 生 异 常 结 果 。 无 论 使 用 哪 个 开 关 设 置 , 随 产 品 提 供 的库 都 可 正 常 工 作 。按 照 enum 类 型 声 明 的 可 能 值 范 围 的 需 要 , 为 其 分 配 字 节 。 具 体 来说 , enum 类 型 等 价 于 有 足 够 空 间 的 最 小 整 型 。在 输 出 的 汇 编 代 码 中 加 入 额 外 的 注 释 信 息 以 增 强 可 读 性 。默 认 设 置 为 -fno-verbose-asm, 将 给 出 额 外 的 信 息 , 当 比 较 两个 汇 编 文 件 时 有 用 。将 通 过 指 针 进 行 的 所 有 存 储 器 引 用 视 为 volatile。将 对 外 部 和 全 局 数 据 项 的 所 有 存 储 器 引 用 视 为 volatile。 使 用 这 个开 关 对 于 static 数 据 没 有 影 响 。将 对 static 数 据 的 所 有 存 储 器 引 用 视 为 volatile。DS51284C_CN 第 54 页© 2005 Microchip Technology Inc.


使 用 MPLAB <strong>C30</strong> C 编 译 器3.6 环 境 变 量本 节 中 提 到 的 变 量 是 可 选 的 , 但 是 如 果 定 义 了 这 些 变 量 , 将 由 编 译 器 使 用 。 如 果 没 有设 置 下 面 某 些 环 境 变 量 的 值 , 编 译 器 驱 动 程 序 或 其 他 子 程 序 , 可 能 选 择 为 这 些 变 量 确定 适 当 的 值 。 驱 动 程 序 或 其 他 子 程 序 , 利 用 有 关 MPLAB <strong>C30</strong> 安 装 的 内 部 知 识 。 只 要安 装 结 构 是 完 整 的 , 所 有 子 目 录 和 可 执 行 文 件 在 相 同 的 相 对 路 径 中 , 驱 动 程 序 或 子 程序 就 能 确 定 可 使 用 的 值 。表 3-16:选 项PI<strong>C30</strong>_C_INCLUDE_PATHPI<strong>C30</strong>_COMPILER_PATHPI<strong>C30</strong>_EXEC_PREFIXPI<strong>C30</strong>_LIBRARY_PATHPI<strong>C30</strong>_OMFTMPDIR与 编 译 器 有 关 的 环 境 变 量定 义此 变 量 的 值 是 一 个 分 号 分 隔 开 的 目 录 列 表 , 很 像 PATH。 当 MPLAB<strong>C30</strong> 搜 索 头 文 件 时 , 它 在 搜 索 标 准 头 文 件 目 录 之 前 , 搜 索 -I 指 定 的 目录 之 后 , 搜 索 此 变 量 中 列 出 的 目 录 。如 果 未 定 义 该 环 境 变 量 , 预 处 理 器 根 据 标 准 安 装 选 择 适 当 的 值 。 默 认情 况 下 , 在 下 面 的 目 录 中 搜 索 头 文 件 :\include 和\support\h。PI<strong>C30</strong>_COMPILER_PATH 的 值 是 一 个 分 号 分 隔 的 目 录 列 表 , 很 像PATH。 搜 索 子 程 序 时 , 如 果 MPLAB <strong>C30</strong> 使 用 PI<strong>C30</strong>_EXEC_PREFIX找 不 到 子 程 序 , 它 在 这 个 变 量 指 定 的 目 录 中 搜 索 。如 果 设 置 了 PI<strong>C30</strong>_EXEC_PREFIX, 它 指 定 要 在 编 译 器 执 行 的 子 程 序的 名 字 中 使 用 的 前 缀 。 当 这 个 前 缀 和 子 程 序 名 一 起 使 用 时 , 不 添 加 目录 分 隔 符 , 但 如 果 需 要 的 话 , 可 以 指 定 一 个 以 斜 杠 符 结 束 的 前 缀 。 如果 MPLAB <strong>C30</strong> 使 用 指 定 的 前 缀 找 不 到 子 程 序 , 它 将 在 PATH 环 境 变 量中 查 找 。如 果 PI<strong>C30</strong>_EXEC_PREFIX 环 境 变 量 未 设 置 或 设 置 为 空 值 , 则 编 译 器驱 动 程 序 根 据 标 准 安 装 选 择 适 当 的 值 。 如 果 安 装 没 有 被 修 改 , 那 么 驱动 程 序 将 能 找 到 所 需 要 的 子 程 序 。使 用 -B 命 令 行 选 项 指 定 的 其 他 前 缀 优 先 于 PI<strong>C30</strong>_EXEC_PREFIX 的用 户 定 义 值 或 驱 动 程 序 定 义 值 。通 常 情 况 下 , 最 好 将 此 值 保 持 为 未 定 义 , 让 驱 动 程 序 查 找 子 程 序 。这 个 变 量 的 值 是 分 号 分 隔 的 目 录 列 表 , 很 像 PATH。 这 个 变 量 指 定 要 传递 给 链 接 器 的 目 录 列 表 。 驱 动 程 序 对 这 个 变 量 的 默 认 求 值 为 :\lib; \support\gld.指 定 MPLAB 30 要 使 用 的 目 标 模 块 格 式 (Object Module Format,OMF)。 默 认 情 况 下 , 工 具 生 成 COFF 目 标 文 件 。 如 果 环 境 变 量PI<strong>C30</strong>_OMF 的 值 为 elf, 工 具 将 生 成 ELF 目 标 文 件 。如 果 设 置 了 TMPDIR, 它 指 定 临 时 文 件 使 用 的 目 录 。 MPLAB <strong>C30</strong> 使 用临 时 文 件 来 保 存 编 译 的 一 个 阶 段 的 输 出 , 这 个 输 出 将 用 作 编 译 的 下 一个 阶 段 的 输 入 : 例 如 , 预 处 理 器 的 输 出 是 编 译 器 的 输 入 。© 2005 Microchip Technology Inc. DS51284C_CN 第 55 页


MPLAB ® <strong>C30</strong> 用 户 指 南3.7 预 定 义 常 量MPLAB <strong>C30</strong> 编 译 器 定 义 了 如 下 预 处 理 符 号 。符 号 是 否 通 过 -ansi 命 令 行 选 项 定 义 ?dsPI<strong>C30</strong>__dsPI<strong>C30</strong>__dsPI<strong>C30</strong>__编 译 器 的 ELF 版 本 定 义 了 如 下 预 处 理 符 号 。否是是符 号 是 否 通 过 -ansi 命 令 行 选 项 定 义 ?dsPI<strong>C30</strong>ELF__dsPI<strong>C30</strong>ELF__dsPI<strong>C30</strong>ELF__编 译 器 的 COFF 版 本 定 义 了 如 下 预 处 理 符 号 。否是是符 号 是 否 通 过 -ansi 命 令 行 选 项 定 义 ?dsPI<strong>C30</strong>COFF__dsPI<strong>C30</strong>COFF__dsPI<strong>C30</strong>COFF__否是是3.8 通 过 命 令 行 编 译 单 个 文 件本 节 说 明 如 何 编 译 和 链 接 单 个 文 件 。 为 便 于 讨 论 , 假 定 编 译 器 安 装 在 c: 驱 动 器 的pic30-tools 目 录 中 。 因 此 就 有 下 面 的 目 录 :表 3-17:目 录c:\pic30_tools\includec:\pic30_tools\support\h与 编 译 器 有 关 的 目 录内 容包 含 ANSI C 头 文 件 的 目 录 。 编 译 器 在 该 目 录 中 存 放 标 准 C 函数 库 的 系 统 头 文 件 。PI<strong>C30</strong>_C_INCLUDE_PATH 环 境 变 量 指 向这 个 目 录 。( 在 DOS 命 令 提 示 符 下 键 入 set 来 检 查 这 一 点 。)包 含 针 对 dsPIC 器 件 的 头 文 件 的 目 录 。 编 译 器 在 该 目 录 中 存 放针 对 dsPIC 器 件 的 头 文 件 。 PI<strong>C30</strong>_C_INCLUDE_PATH 环 境变 量 指 向 这 个 目 录 。( 在 DOS 命 令 提 示 符 下 键 入 set 来 检 查这 一 点 。)c:\pic30_tools\lib 库 文 件 目 录 : 该 目 录 中 存 放 库 文 件 和 预 编 译 目 标 文 件 。c:\pic30_tools\support\gldc:\pic30_tools\bin链 接 描 述 文 件 目 录 : 在 这 个 目 录 中 存 放 不 同 型 号 器 件 的 链 接 描述 文 件 。可 执 行 文 件 目 录 : 存 放 编 译 程 序 。 PATH 环 境 变 量 包 含 这 个 目录 。DS51284C_CN 第 56 页© 2005 Microchip Technology Inc.


使 用 MPLAB <strong>C30</strong> C 编 译 器下 面 是 一 个 两 数 相 加 的 简 单 C 程 序 。使 用 任 何 文 本 编 辑 器 创 建 下 面 的 程 序 并 保 存 为 ex1.c。#include int main(void);unsigned int Add(unsigned int a, unsigned int b);unsigned int x, y, z;intmain(void){x = 2;y = 5;z = Add(x,y);return 0;}unsigned intAdd(unsigned int a, unsigned int b){return(a+b);}程 序 的 第 一 行 包 含 了 头 文 件 p30f2010.h, 这 个 头 文 件 提 供 了 该 器 件 的 所 有 特 殊 功 能寄 存 器 的 定 义 。 关 于 头 文 件 的 详 细 信 息 , 参 见 第 6 章 “ 器 件 支 持 文 件 ”。在 DOS 提 示 符 下 输 入 如 下 命 令 行 来 编 译 该 程 序 :C:\> pic30-gcc -o ex1.o ex1.c命 令 行 选 项 -o ex1.cof 命 名 输 出 COFF 可 执 行 文 件 ( 若 未 指 定 -o 选 项 , 则 输 出 文件 名 为 a.exe)。 COFF 可 执 行 文 件 可 装 载 到 MPLAB IDE 中 。如 果 需 要 hex 文 件 , 如 要 装 入 器 件 编 程 器 中 , 可 以 使 用 下 面 的 命 令 :C:\> pic30-bin2hex ex1.o这 样 就 生 成 了 一 个 名 为 ex1.hex 的 Intel hex 文 件 。© 2005 Microchip Technology Inc. DS51284C_CN 第 57 页


MPLAB ® <strong>C30</strong> 用 户 指 南3.9 通 过 命 令 行 编 译 多 个 文 件将 Add() 函 数 移 到 名 为 add.c 的 文 件 中 来 说 明 在 一 个 应 用 程 序 中 多 个 文 件 的 使 用 。即 :文 件 1/* ex1.c */#include int main(void);unsigned int Add(unsigned int a, unsigned int b);unsigned int x, y, z;int main(void){x = 2;y = 5;z = Add(x,y);return 0;}文 件 2/* add.c */#include unsigned intAdd(unsigned int a, unsigned int b){return(a+b);}在 DOS 提 示 符 下 输 入 如 下 命 令 行 来 编 译 这 两 个 文 件 :C:\> pic30-gcc -o ex1.o ex1.c add.c这 个 命 令 编 译 模 块 ex1.c 和 add.c。 编 译 的 模 块 和 编 译 器 库 文 件 链 接 , 并 生 成 可 执 行文 件 ex1.o。DS51284C_CN 第 58 页© 2005 Microchip Technology Inc.


第 4 章 MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境MPLAB ® <strong>C30</strong>用 户 指 南4.1 简 介4.2 主 要 内 容本 章 讲 述 MPLAB <strong>C30</strong> C 编 译 器 的 运 行 时 环 境 。本 章 讨 论 的 内 容 包 括 :• 地 址 空 间• 代 码 段 和 数 据 段• 启 动 和 初 始 化• 存 储 空 间• 存 储 模 型• X 和 Y 数 据 空 间• 定 位 代 码 和 数 据• 软 件 堆 栈• C 的 堆 栈 使 用• C 的 堆 使 用• 函 数 调 用 约 定• 寄 存 器 约 定• 位 反 转 寻 址 和 模 寻 址• PSV 的 使 用4.3 地 址 空 间dsPIC ® 器 件 融 合 了 传 统 PICmicro 单 片 机 的 特 征 ( 外 设 、 哈 佛 架 构 和 RISC) 以 及 新的 DSP 功 能 。 dsPIC 器 件 具 有 两 个 独 立 的 存 储 器 :• 程 序 存 储 器 ( 图 4-1) 包 含 可 执 行 代 码 和 常 量 数 据 。• 数 据 存 储 器 ( 图 4-2) 包 含 外 部 变 量 、 静 态 变 量 、 系 统 堆 栈 和 数 据 寄 存 器 。 数 据 存储 器 由 near 数 据 和 far 数 据 组 成 , 其 中 ,near 数 据 指 数 据 存 储 空 间 的 前 8 KB,far数 据 指 数 据 存 储 空 间 的 上 面 56 KB。尽 管 程 序 存 储 区 和 数 据 存 储 区 是 完 全 独 立 的 , 但 编 译 器 可 通 过 程 序 空 间 可 视 性(Program Space Visibility, PSV) 窗 口 访 问 程 序 存 储 器 中 的 常 量 数 据 。© 2005 Microchip Technology Inc. DS51284C_CN 第 59 页


MPLAB ® <strong>C30</strong> 用 户 指 南图 4-1:程 序 存 储 空 间 映 射7FFFFFNEAR 一 般 程 序 存 储 空 间008000.const.dinit.text.handle程 序 存 储 器 中 的 常 量数 据 存 储 器 的 初 始 化 程 序一 般 程 序 存 储Far 代 码 句 柄0复 位 向 量 和 异 常 向 量图 4-2:数 据 存 储 空 间 映 射FFFFNEAR 一 般 数 据 存 储 空 间80002000.const.ybss, .ydata.bss, .data.nbss, .ndata.xbss, .xdata程 序 空 间 可 视 性数 据 窗 口 (PSV)堆 栈 ( 向 上 增 长 )堆 ( 可 选 )Y 数 据 存 储 空 间一 般 数 据 存 储 空 间X 数 据 存 储 空 间0存 储 器 映 射 SFRDS51284C_CN 第 60 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境4.4 代 码 段 和 数 据 段段 是 指 占 用 dsPIC 器 件 存 储 器 中 连 续 地 址 的 可 定 位 代 码 或 数 据 块 。 在 任 何 给 定 的 目 标文 件 中 , 通 常 都 有 几 个 段 。 例 如 , 一 个 文 件 中 可 能 包 含 一 个 程 序 代 码 段 、 一 个 未 初 始化 数 据 段 及 其 他 段 。除 非 通 过 段 属 性 ( 关 于 段 属 性 的 信 息 , 参 见 第 2.3 节 “ 关 键 字 差 别 ”) 指 定 , 否 则 ,MPLAB <strong>C30</strong> 编 译 器 将 代 码 和 数 据 存 放 在 默 认 的 段 中 。 所 有 由 编 译 器 生 成 的 可 执 行 代 码都 被 分 配 到 名 为 .text 的 段 中 , 而 数 据 则 根 据 数 据 类 型 分 配 在 不 同 的 段 中 , 见表 4-1。表 4-1:编 译 器 生 成 的 数 据 段已 初 始 化未 初 始 化变 量 ROM 中 的 常 量 RAM 中 的 常 量 变 量near .ndata .const .ndconst .nbssfar .data .const .dconst .bss下 面 列 出 了 每 个 默 认 的 段 , 并 描 述 了 存 储 到 段 中 的 信 息 的 类 型 。.text可 执 行 代 码 分 配 到 .text 段 中 。.data具 有 far 属 性 的 已 初 始 化 变 量 分 配 到 .data 段 中 。 当 选 择 大 数 据 存 储 模 型 时 ( 即 使用 -mlarge-data 命 令 行 选 项 时 ), 这 是 已 初 始 化 变 量 的 默 认 位 置 。.ndata具 有 near 属 性 的 已 初 始 化 变 量 分 配 到 .ndata 段 中 。 当 选 择 小 数 据 存 储 模 型 时 ( 即使 用 默 认 的 -msmall-data 命 令 行 选 项 时 ), 这 是 已 初 始 化 变 量 的 默 认 段 。.const当 使 用 默 认 的 -mconst-in-code 命 令 行 选 项 时 , 常 量 值 , 如 字 符 串 常 量 和 const限 定 的 变 量 , 分 配 到 .const 段 中 。 这 种 段 位 于 程 序 存 储 器 中 并 通 过 PSV 窗 口 访 问 。还 可 以 通 过 段 属 性 , 不 需 要 在 命 令 行 中 使 用 -mconst-in-code 选 项 , 将 变 量 存 放 到.const 段 中 :int i __attribute__((space(auto_psv)));© 2005 Microchip Technology Inc. DS51284C_CN 第 61 页


MPLAB ® <strong>C30</strong> 用 户 指 南.dconst当 使 用 -mlarge-data 命 令 行 选 项 时 , 不 需 使 用 -mconst-in-code 选 项 , 即 可 将常 量 值 , 如 字 符 串 常 量 和 const 限 定 的 变 量 分 配 到 .dconst 段 中 。 MPLAB <strong>C30</strong> 启动 代 码 将 通 过 从 .dinit 段 复 制 数 据 来 初 始 化 这 种 段 , 除 非 指 定 了 链 接 器 选 项--no-data-init。 .dinit 段 由 链 接 器 生 成 , 分 配 到 程 序 存 储 器 中 。.ndconst当 使 用 默 认 的 -msmall-data 命 令 行 选 项 时 , 不 需 使 用 -mconst-in-code 命 令 行选 项 , 即 可 将 常 量 值 , 如 字 符 串 常 量 和 const 限 定 的 变 量 分 配 到 .ndconst 段 中 。MPLAB<strong>C30</strong> 启 动 代 码 将 通 过 从 .dinit 段 中 复 制 数 据 来 初 始 化 这 种 段 。 .dinit 段 由链 接 器 生 成 , 位 于 程 序 存 储 器 中 。.bss具 有 far 属 性 的 未 初 始 化 变 量 分 配 到 .bss 段 中 。 当 选 择 了 大 数 据 存 储 模 型 时 ( 即 当使 用 -mlarge-data 命 令 行 选 项 时 ), 这 是 未 初 始 化 变 量 的 默 认 位 置 。.nbss具 有 near 属 性 的 未 初 始 化 变 量 分 配 到 .nbss 段 中 。 当 选 择 小 数 据 存 储 模 型 时 ( 即 使用 默 认 的 -msmall-data 命 令 行 选 项 时 ), 这 是 未 初 始 化 变 量 的 默 认 位 置 。.pbss - 持 久 数 据如 果 应 用 需 要 将 数 据 存 储 在 RAM 中 而 不 受 器 件 复 位 的 影 响 , 可 以 使 用 段 .pbss。 段.pbss 分 配 到 near 数 据 存 储 区 中 , 不 会 被 libpic30.a 中 的 默 认 启 动 模 块 修 改 。可 使 用 段 属 性 将 未 初 始 化 变 量 存 放 在 .pbss 段 中 :int i __attribute__((persistent));为 了 利 用 持 久 数 据 存 储 , main() 函 数 的 开 头 要 检 测 所 发 生 复 位 的 类 型 。 在 RCON 复位 控 制 寄 存 器 中 的 各 位 可 用 于 检 测 复 位 源 。 详 细 信 息 请 参 阅 《dsPI<strong>C30</strong>F 系 列 参 考 手册 》(DS70046C_CN) 的 第 8 章 。DS51284C_CN 第 62 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境4.5 启 动 和 初 始 化libpic30.a 归 档 / 库 中 包 含 两 个 C 运 行 时 启 动 模 块 。 这 两 个 启 动 模 块 的 入 口 点 都 是__reset。 链 接 描 述 文 件 在 程 序 存 储 器 的 地 址 0 存 放 了 一 条 GOTO __reset 指 令 , 在器 件 复 位 时 转 移 控 制 。默 认 情 况 下 链 接 主 启 动 模 块 并 进 行 以 下 操 作 :1. 使 用 链 接 器 或 用 户 定 义 链 接 描 述 文 件 提 供 的 值 对 堆 栈 指 针 (W15) 和 堆 栈 指 针限 制 寄 存 器 (SPLIM) 进 行 初 始 化 。 详 细 信 息 参 见 第 4.9 节 “ 软 件 堆 栈 ”。2. 如 果 定 义 了 .const 段 , 那 么 将 通 过 初 始 化 PSVPAG 和 CORCON 寄 存 器 将 其 映 射到 程 序 空 间 可 视 性 (PSV) 窗 口 。 注 意 , 当 在 MPLAB IDE 中 选 择 了“Constants in code space” 选 项 或 在 MPLAB <strong>C30</strong> 命 令 行 中 指 定 了 默 认 的-mconst-in-code 选 项 时 , 将 定 义 一 个 .const 段 。3. 读 取 .dinit 段 中 的 数 据 初 始 化 模 板 , 会 导 致 所 有 未 初 始 化 的 段 被 清 零 , 同 时 所有 已 初 始 化 段 被 初 始 化 为 从 程 序 存 储 器 中 读 取 的 值 。 数 据 初 始 化 模 板 由 链 接 器 创建 , 并 支 持 第 4.4 节 “ 代 码 段 和 数 据 段 ” 中 列 出 的 标 准 段 和 用 户 定 义 段 。注 : 持 久 数 据 段 .pbss 不 会 被 清 零 或 初 始 化 。4. 调 用 main 函 数 时 不 带 参 数 。5. 如 果 从 main 函 数 返 回 , 处 理 器 将 复 位 。当 指 定 -Wl、 --no-data-init 选 项 时 , 将 链 接 备 用 启 动 模 块 (crtl.o)。 它 执 行和 上 面 相 同 的 操 作 , 除 了 第 3 步 , 这 一 步 省 略 掉 。 备 用 启 动 模 块 比 主 启 动 模 块 小 , 所以 当 不 需 要 初 始 化 数 据 时 , 可 选 择 该 模 块 来 节 省 程 序 存 储 空 间 。这 两 个 模 块 的 源 代 码 ( 采 用 dsPIC 汇 编 语 言 ) 存 放 在 c:\pic30_tools\src 目 录中 。 如 果 需 要 , 可 以 对 启 动 模 块 进 行 修 改 。 例 如 , 如 果 应 用 需 要 在 调 用 main 函 数 时带 参 数 , 可 通 过 改 变 条 件 汇 编 伪 指 令 来 提 供 这 一 支 持 。© 2005 Microchip Technology Inc. DS51284C_CN 第 63 页


MPLAB ® <strong>C30</strong> 用 户 指 南4.6 存 储 空 间静 态 和 外 部 变 量 通 常 分 配 到 一 般 数 据 存 储 区 中 。 如 果 选 择 了 constants-in-data 存 储 模型 , const 限 定 的 变 量 将 被 分 配 到 一 般 数 据 存 储 区 中 ; 如 果 选 择 了 constants-in-code存 储 模 型 , const 限 定 的 变 量 将 被 分 配 到 程 序 存 储 器 中 。为 配 合 dsPIC DSC 的 架 构 特 点 , MPLAB <strong>C30</strong> 定 义 了 几 个 专 用 存 储 空 间 。 可 通 过 使 用space 属 性 ( 参 见 第 2.3.1 节 “ 指 定 变 量 的 属 性 ”), 将 静 态 和 外 部 变 量 分 配 到 专 用存 储 空 间 中 :data一 般 数 据 空 间 。 可 使 用 普 通 C 语 句 访 问 一 般 数 据 空 间 中 的 变 量 。 这 是 默 认 的 分 配 。xmemoryX 数 据 地 址 空 间 。 可 使 用 普 通 C 语 句 访 问 X 数 据 空 间 中 的 变 量 。 X 数 据 地 址 空 间 尤 其适 用 于 针 对 DSP 的 函 数 库 和 / 或 汇 编 语 言 指 令 。ymemoryY 数 据 地 址 空 间 。 可 使 用 普 通 C 语 句 访 问 Y 数 据 空 间 中 的 变 量 。Y 数 据 地 址 空 间 尤 其 适用 于 针 对 DSP 的 函 数 库 和 / 或 汇 编 语 言 指 令 。prog一 般 程 序 空 间 , 通 常 保 留 给 可 执 行 代 码 。 不 能 使 用 普 通 C 语 句 访 问 程 序 空 间 中 的 变量 。 这 些 变 量 必 须 由 编 程 人 员 显 式 访 问 , 通 常 通 过 表 访 问 行 内 汇 编 指 令 , 或 使 用 程 序空 间 可 视 性 窗 口 访 问 。const程 序 空 间 中 编 译 器 管 理 的 区 域 , 用 于 程 序 空 间 可 视 性 (PSV) 窗 口 访 问 。 const 空 间中 的 变 量 可 通 过 普 通 C 语 句 读 取 , 总 分 配 空 间 最 大 为 32K。psv程 序 空 间 , 用 于 程 序 空 间 可 视 性 (PSV) 窗 口 访 问 。 psv 空 间 中 的 变 量 不 由 编 译 器 管理 , 不 能 通 过 普 通 C 语 句 访 问 。 这 些 变 量 必 须 由 编 程 人 员 显 式 访 问 , 通 常 通 过 表 访 问行 内 汇 编 指 令 , 或 使 用 程 序 空 间 可 视 性 窗 口 访 问 。 可 通 过 使 用 PSVPAG 寄 存 器 的 设置 , 访 问 psv 空 间 中 的 变 量 。eedata数 据 EEPROM 空 间 , 位 于 程 序 存 储 器 高 地 址 的 16 位 宽 非 易 失 性 存 储 区 。 eedata 空 间中 的 变 量 不 能 使 用 普 通 C 语 句 访 问 。 这 些 变 量 必 须 由 编 程 人 员 显 式 访 问 , 通 常 使 用 表访 问 行 内 汇 编 指 令 , 或 使 用 程 序 空 间 可 视 性 窗 口 访 问 。DS51284C_CN 第 64 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境4.7 存 储 模 型编 译 器 支 持 几 种 存 储 模 型 。 提 供 了 命 令 行 选 项 来 根 据 所 使 用 的 特 定 dsPIC 器 件 和 存 储器 类 型 , 选 择 最 佳 的 存 储 模 型 。表 4-2:存 储 模 型 命 令 行 选 项选 项 存 储 区 定 义 描 述-msmall-data 8 KB 数 据 存 储 区 。这 是 默 认 设 置 。-msmall-scalar 8 KB 的 数 据 存 储 区 。这 是 默 认 设 置 。允 许 使 用 类 PIC18 指 令 访 问 数 据 存 储器 。允 许 使 用 类 PIC18 指 令 访 问 数 据 存 储器 中 的 标 量 。-mlarge-data 大 于 8 KB 的 数 据 存 储 区 。 使 用 数 据 引 用 伪 指 令 。-msmall-code 32 K 字 的 程 序 存 储 区 。这 是 默 认 设 置 。函 数 指 针 不 使 用 跳 转 表 。 函 数 调 用 使用 RCALL 指 令 。-mlarge-code 大 于 32 K 字 的 程 序 存 储 区 。 函 数 指 针 使 用 跳 转 表 。 函 数 调 用 使 用CALL 指 令 。-mconst-in-data 位 于 数 据 存 储 器 中 的 常 量 。 由 启 动 代 码 从 程 序 存 储 器 中 复 制 的 值 。-mconst-in-code 位 于 程 序 存 储 器 中 的 常 量 。这 是 默 认 设 置 。通 过 程 序 空 间 可 视 性 (PSV) 数 据 窗口 访 问 这 些 值 。命 令 行 选 项 适 用 于 所 有 被 编 译 的 模 块 。 各 个 变 量 和 函 数 可 以 声 明 为 near 或 far, 以便 更 好 的 控 制 代 码 的 生 成 。 关 于 设 置 变 量 和 函 数 属 性 的 信 息 , 请 参 阅 第 2.3.1 节 “ 指定 变 量 的 属 性 ” 和 第 2.3.2 节 “ 指 定 函 数 的 属 性 ”。4.7.1 Near 数 据 和 Far 数 据如 果 变 量 分 配 到 near 数 据 段 中 , 通 常 编 译 器 能 生 成 更 好 ( 更 紧 凑 ) 的 代 码 。 如 果 一 个应 用 的 所 有 变 量 能 存 放 在 8KB 的 near 数 据 存 储 区 中 , 那 么 编 译 器 在 编 译 每 个 模 块 时就 会 被 要 求 使 用 默 认 的 -msmall-data 命 令 行 选 项 来 将 这 些 变 量 存 放 在 near 数 据 存储 区 中 。 如 果 标 量 类 型 ( 非 数 组 或 结 构 类 型 ) 所 占 用 的 数 据 总 量 小 于 8 KB 的 话 , 可使 用 默 认 的 -msmall-scalar 选 项 。 这 要 求 编 译 器 仅 将 应 用 中 的 标 量 存 放 在 near 数据 段 中 。如 果 这 些 全 局 选 项 都 不 适 合 , 那 么 就 使 用 下 面 的 可 选 方 案 :1. 可 以 使 用 -mlarge-data 或 -mlarge-scalar 命 令 行 选 项 编 译 应 用 的 某 些 模块 。 在 这 种 情 况 下 , 仅 这 些 模 块 使 用 的 变 量 被 分 配 到 far 数 据 段 中 。 如 果 使 用 这个 可 选 方 案 , 在 使 用 外 部 定 义 的 变 量 时 一 定 要 小 心 。 如 果 使 用 这 两 个 命 令 行 选 项之 一 编 译 的 模 块 使 用 了 一 个 外 部 定 义 的 变 量 , 则 定 义 这 个 变 量 的 模 块 也 要 使 用 相同 的 选 项 编 译 , 或 者 在 变 量 声 明 和 定 义 时 指 定 far 属 性 。© 2005 Microchip Technology Inc. DS51284C_CN 第 65 页


MPLAB ® <strong>C30</strong> 用 户 指 南2. 如 果 使 用 了 -mlarge-data 或 -mlarge-scalar 命 令 行 选 项 , 那 么 可 通 过 指 定near 属 性 将 变 量 排 除 在 far 数 据 空 间 外 ( 即 存 放 在 near 数 据 空 间 )。3. 命 令 行 选 项 的 作 用 域 仅 限 于 模 块 内 部 , 也 可 以 不 使 用 命 令 行 选 项 , 而 通 过 指 定far 属 性 将 变 量 存 放 在 far 数 据 段 中 。如 果 应 用 的 near 变 量 在 8K 的 near 数 据 空 间 中 存 放 不 下 , 链 接 器 将 产 生 错 误 消 息 。4.7.2 Near 代 码 和 Far 代 码具 有 near 属 性 的 函 数 ( 函 数 在 彼 此 的 32K 字 范 围 内 ) 互 相 调 用 时 比 非 near 属 性 的 函数 效 率 高 。 如 果 已 知 应 用 程 序 中 的 所 有 函 数 都 是 near 的 , 那 么 在 编 译 每 个 模 块 时 就 可以 使 用 默 认 的 -msmall-code 命 令 行 选 项 来 指 示 编 译 器 采 用 更 高 效 的 函 数 调 用 形 式 。如 果 这 个 默 认 的 选 项 不 适 合 , 可 以 使 用 下 面 的 可 选 方 案 :1. 可 以 使 用 -msmall-code 命 令 行 选 项 来 编 译 应 用 程 序 的 某 些 模 块 。 在 这 种 情 况下 , 只 有 这 些 模 块 中 的 函 数 调 用 可 以 采 用 更 高 效 的 函 数 调 用 形 式 。2. 如 果 已 使 用 -msmall-code 命 令 行 选 项 , 那 么 编 译 器 可 能 被 指 示 对 具 有 far 属 性的 函 数 使 用 长 函 数 调 用 形 式 。3. 命 令 行 选 项 的 作 用 域 限 于 模 块 内 部 , 可 以 不 使 用 命 令 行 选 项 , 而 通 过 在 函 数 的 定义 和 声 明 中 指 定 near 属 性 , 指 示 编 译 器 使 用 更 高 效 的 函 数 调 用 形 式 调 用 这 些 函数 。-msmall-code 命 令 行 选 项 与 -msmall-data 命 令 行 选 项 的 区 别 在 于 , 采 用 前 者时 , 为 确 保 函 数 彼 此 “ 靠 近 ” 分 配 , 编 译 器 不 需 进 行 特 别 的 操 作 ; 而 采 用 后 者 时 , 编译 器 要 将 变 量 分 配 到 特 殊 的 段 中 。如 果 函 数 声 明 为 near, 而 其 调 用 函 数 无 法 采 用 函 数 调 用 的 更 高 效 形 式 调 用 它 时 , 链 接器 将 产 生 错 误 信 息 。DS51284C_CN 第 66 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境4.8 定 位 代 码 和 数 据正 如 第 4.4 节 “ 代 码 段 和 数 据 段 ” 中 所 述 , 编 译 器 将 代 码 存 放 在 .text 段 中 , 而 根 据所 使 用 的 存 储 模 型 和 数 据 是 否 已 初 始 化 将 数 据 存 放 在 指 定 的 段 中 。 链 接 模 块 时 , 链 接器 根 据 各 个 段 的 属 性 来 确 定 段 的 起 始 地 址 。某 些 情 况 下 必 须 将 特 定 函 数 或 变 量 存 放 在 某 个 特 定 地 址 或 某 个 地 址 范 围 。 为 实 现 这 一点 , 最 简 单 的 方 法 是 使 用 address 属 性 , 如 第 2.3 节 “ 关 键 字 差 别 ” 所 述 。 例 如 ,将 函 数 存 放 到 程 序 存 储 器 的 地 址 0x8000 中 :int __attribute__ ((address(0x8000))) PrintString (const char *s);同 样 , 将 变 量 Mabonga 存 放 到 数 据 存 储 器 的 地 址 0x1000 中 :int __attribute__ ((address(0x1000))) Mabonga = 1;定 位 代 码 和 数 据 的 另 一 种 方 法 是 将 函 数 或 变 量 存 放 到 用 户 定 义 的 段 中 , 并 在 自 定 义 的链 接 描 述 文 件 中 指 定 该 段 的 起 始 地 址 。 具 体 如 下 :1. 在 C 源 程 序 中 修 改 代 码 或 数 据 的 声 明 来 指 定 用 户 定 义 的 段 。2. 将 这 个 用 户 定 义 段 加 入 到 一 个 自 定 义 的 链 接 描 述 文 件 中 来 指 定 段 的 起 始 地 址 。例 如 , 要 将 函 数 PrintString 存 放 到 程 序 存 储 器 的 0x8000 地 址 中 , 首 先 要 在 C 源程 序 中 对 函 数 进 行 如 下 声 明 :int __attribute__((__section__(".myTextSection")))PrintString(const char *s);段 属 性 指 定 将 函 数 存 放 到 名 为 .myTextSection 的 段 中 , 而 不 是 默 认 的 .text 段中 。 它 没 有 指 定 用 户 定 义 的 段 存 存 放 在 哪 里 。 这 必 须 在 一 个 自 定 义 的 链 接 描 述 文 件 中指 定 , 如 下 所 示 。 以 针 对 器 件 的 链 接 描 述 文 件 为 基 础 , 加 入 如 下 段 定 义 :.myTextSection 0x8000 :{*(.myTextSection);} >program这 指 定 了 输 出 文 件 应 包 括 一 个 名 为 .myTextSection 的 段 , 这 个 段 位 于 地 址0x8000, 包 含 所 有 名 为 .myTextSection 的 输 入 段 。 由 于 在 本 例 中 , 在 该 段 中 只 有一 个 函 数 PrintString, 那 么 这 个 函 数 将 位 于 程 序 存 储 器 的 地 址 0x8000 处 。类 似 地 , 要 将 变 量 Mabonga 存 放 到 数 据 存 储 器 的 地 址 0x1000 中 , 首 先 要 在 C 源 程 序中 声 明 该 变 量 如 下 :int __attribute__((__section__(".myDataSection"))) Mabonga = 1;© 2005 Microchip Technology Inc. DS51284C_CN 第 67 页


MPLAB ® <strong>C30</strong> 用 户 指 南4.9 软 件 堆 栈段 属 性 指 定 将 变 量 存 放 到 名 为 .myDataSection 的 段 中 , 而 不 是 默 认 的 .data 段中 。 它 没 有 指 定 用 户 定 义 的 段 存 放 在 哪 里 。 同 样 地 , 这 必 须 在 一 个 自 定 义 的 链 接 描 述文 件 中 指 定 , 如 下 所 示 。 以 特 定 器 件 的 链 接 描 述 文 件 为 基 础 , 加 入 如 下 段 定 义 :.myDataSection 0x1000 :{*(.myDataSection);} >data这 指 定 了 输 出 文 件 应 包 含 一 个 名 为 .myDataSection 的 段 , 这 个 段 位 于 地 址0x1000, 包 含 所 有 名 为 .myDataSection 的 输 入 段 。 在 这 个 例 子 中 , 由 于 该 段 中 仅包 含 一 个 变 量 Mabonga, 那 么 该 变 量 将 被 存 放 到 数 据 存 储 器 的 地 址 0x1000 中 。dsPIC 器 件 的 寄 存 器 W15 专 门 用 作 软 件 堆 栈 指 针 。 所 有 处 理 器 堆 栈 操 作 , 包 括 函 数 调用 、 中 断 和 异 常 都 使 用 软 件 堆 栈 。 堆 栈 是 向 上 增 长 的 , 向 高 存 储 地 址 增 长 。dsPIC 器 件 也 支 持 堆 栈 溢 出 检 测 。 如 果 堆 栈 指 针 限 制 寄 存 器 SPLIM 已 被 初 始 化 , 器 件将 对 所 有 堆 栈 操 作 的 溢 出 进 行 检 测 。 如 果 发 生 溢 出 , 处 理 器 将 启 动 一 个 堆 栈 错 误 异 常处 理 。 默 认 情 况 下 , 这 将 引 起 处 理 器 复 位 。 应 用 还 可 通 过 定 义 一 个 名 为_StackError 的 中 断 函 数 来 安 装 一 个 堆 栈 错 误 异 常 处 理 程 序 。 详 细 信 息 请 参 阅 第 7章 “ 中 断 ”。C 运 行 时 启 动 模 块 在 启 动 和 初 始 化 过 程 中 对 堆 栈 指 针 (W15) 和 堆 栈 指 针 限 制 寄 存 器(SPLIM) 进 行 初 始 化 。 初 值 通 常 由 链 接 器 提 供 , 链 接 器 尽 可 能 在 未 使 用 的 数 据 存 储 器中 分 配 最 大 的 堆 栈 。 链 接 映 射 输 出 文 件 中 给 出 堆 栈 的 地 址 。 通 过 -stack 链 接 器 命 令行 选 项 , 应 用 可 确 保 至 少 可 获 得 一 个 最 小 的 堆 栈 。 详 细 信 息 请 参 阅 MPLAB ASM30,MPLAB LINK30 and Utilities User’s Guide (DS51317)。另 外 , 可 以 通 过 自 定 义 链 接 描 述 文 件 中 的 用 户 定 义 段 来 分 配 指 定 大 小 的 堆 栈 。 在 下 面的 示 例 中 , 0x100 字 节 的 数 据 存 储 区 保 留 给 了 堆 栈 。 声 明 了 用 于 C 运 行 时 启 动 模 块 的两 个 符 号 , __SP_init 和 __SPLIM_init。.stack :{__SP_init = .;. += 0x100__SPLIM_init = .;. += 8} >data__SP_init 定 义 了 堆 栈 指 针 (W15) 的 初 值 , 而 __SPLIM_init 定 义 了 堆 栈 指 针 限制 寄 存 器 (SPLIM) 的 初 值 。 __SPLIM_INIT 的 值 应 比 物 理 堆 栈 限 制 小 至 少 8 个 字节 , 以 便 允 许 堆 栈 错 误 异 常 处 理 。 如 果 安 装 了 堆 栈 错 误 中 断 处 理 程 序 , 由 于 要 考 虑 到中 断 处 理 程 序 本 身 的 堆 栈 使 用 , __SPLIM_INIT 的 值 应 该 更 小 。 默 认 的 中 断 处 理 程 序不 需 要 额 外 使 用 堆 栈 。DS51284C_CN 第 68 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境4.10 C 堆 栈 使 用C 编 译 器 使 用 软 件 堆 栈 来 进 行 如 下 操 作 :• 分 配 自 动 变 量• 传 递 函 数 参 数• 在 中 断 函 数 中 保 存 处 理 器 状 态• 保 存 函 数 返 回 地 址• 存 储 临 时 变 量• 函 数 调 用 时 保 护 寄 存 器运 行 时 堆 栈 是 向 上 增 长 的 , 从 低 地 址 向 高 地 址 增 长 。 编 译 器 使 用 两 个 工 作 寄 存 器 来 管理 堆 栈 :• W15 – 这 是 堆 栈 指 针 。 它 指 向 栈 顶 , 栈 顶 定 义 为 堆 栈 的 第 一 个 未 使 用 单 元 。• W14 – 这 是 帧 指 针 (frame pointer, FP)。 它 指 向 当 前 函 数 的 帧 。 如 果 需 要 , 每个 函 数 都 会 在 栈 顶 创 建 一 个 新 的 帧 来 分 配 自 动 变 量 和 临 时 变 量 。 可 使 用 编 译 器 选 项-fomit-frame-pointer 来 限 制 帧 指 针 的 使 用 。图 4-3:堆 栈 指 针 和 帧 指 针堆 栈向 高地 址增 长函 数 帧SP(W15)FP(W14)C 运 行 时 启 动 模 块 (libpic30.a 中 的 crt0.o 和 crt1.o) 初 始 化 堆 栈 指 针 W15使 其 指 向 栈 底 , 初 始 化 堆 栈 指 针 限 制 寄 存 器 使 其 指 向 栈 顶 。 堆 栈 向 上 增 长 , 如 果 堆 栈超 出 堆 栈 指 针 限 制 寄 存 器 中 的 值 , 将 转 入 堆 栈 错 误 陷 阱 。 用 户 可 以 通 过 初 始 化 堆 栈 指针 限 制 寄 存 器 来 进 一 步 限 制 堆 栈 的 增 长 。下 图 说 明 了 调 用 一 个 函 数 的 步 骤 。 执 行 CALL 或 RCALL 指 令 将 返 回 地 址 压 入 软 件 堆栈 。 参 见 图 4-4。© 2005 Microchip Technology Inc. DS51284C_CN 第 69 页


MPLAB ® <strong>C30</strong> 用 户 指 南图 4-4:CALL 或 RCALLSP(W15)返 回 地 址 [23:16]返 回 地 址 [15:0]堆 栈向 高地 址增 长参 数 1:参 数 n-1参 数 n调 用 函 数 的 帧FP(W14)现 在 被 调 用 函 数 可 以 为 其 局 部 现 场 分 配 空 间 了 ( 图 4-5)。图 4-5:被 调 用 函 数 的 空 间 分 配SP (W15)局 部 变 量和 临 时 变 量FP (W14)前 一 个 FP堆 栈向 高地 址增 长返 回 地 址 [23:16]返 回 地 址 [15:0]参 数 1:参 数 n-1参 数 n调 用 函 数 的 帧最 后 , 函 数 中 用 到 的 所 有 被 调 用 函 数 保 存 寄 存 器 被 压 入 堆 栈 ( 图 4-6)。DS51284C_CN 第 70 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境图 4-6:将 被 调 用 函 数 保 存 的 寄 存 器 弹 出 堆 栈SP(W15)堆 栈向 高地 址增 长被 调 用 函 数保 存 的 寄 存 器局 部 变 量和 临 时 变 量前 一 个 FP返 回 地 址 [23:16]返 回 地 址 [15:0]参 数 1:参 数 n-1参 数 n[W14+n] 访 问局 部 现 场FP (W14)[W14-n] 访 问基 于 堆 栈 的函 数 参 数调 用 函 数 的 帧4.11 C 堆 使 用C 运 行 时 堆 是 数 据 存 储 器 中 的 未 初 始 化 区 域 , 用 于 使 用 标 准 C 函 数 库 中 的 动 态 存 储 器管 理 函 数 calloc、 malloc 和 realloc 进 行 动 态 存 储 器 分 配 。 如 果 不 使 用 这 些 函数 , 就 不 需 要 分 配 堆 。 默 认 情 况 下 不 创 建 堆 。如 果 确 实 需 要 通 过 调 用 一 个 存 储 器 分 配 函 数 直 接 使 用 动 态 存 储 器 分 配 , 或 通 过 使 用 标准 C 函 数 库 的 输 入 / 输 出 函 数 来 间 接 使 用 动 态 存 储 器 分 配 的 话 , 就 必 须 创 建 一 个 堆 。通 过 使 用 链 接 器 命 令 行 选 项 --heap 在 链 接 器 命 令 行 中 指 定 堆 的 大 小 即 可 创 建 一 个堆 。 例 如 , 使 用 命 令 行 来 分 配 一 个 512K 字 节 的 堆 :pic30-gcc foo.c -Wl,--heap=512链 接 器 会 在 堆 栈 下 面 分 配 一 个 堆 ( 图 4-2)。如 果 使 用 标 准 C 函 数 库 的 输 入 / 输 出 函 数 , 就 必 须 分 配 一 个 堆 。 如 果 stdout 是 使 用的 唯 一 文 件 , 那 么 堆 的 大 小 为 0, 即 使 用 命 令 行 选 项 :-Wl,--heap=0如 果 打 开 几 个 文 件 , 那 么 对 于 同 时 打 开 的 每 个 文 件 , 堆 的 大 小 必 须 包 含 40 个 字 节 。 如果 堆 存 储 区 的 空 间 不 足 , open 函 数 将 返 回 错 误 指 示 。 对 于 每 个 应 被 缓 存 的 文 件 , 都 需要 514 字 节 的 堆 空 间 。 如 果 没 有 足 够 的 堆 存 储 区 空 间 用 于 缓 存 , 文 件 将 以 非 缓 存 模 式打 开 。© 2005 Microchip Technology Inc. DS51284C_CN 第 71 页


MPLAB ® <strong>C30</strong> 用 户 指 南4.12 函 数 调 用 约 定调 用 函 数 时 :• 寄 存 器 W0-W7 由 调 用 函 数 保 存 。 为 保 存 寄 存 器 的 值 , 调 用 函 数 必 须 将 这 些 值 压 入堆 栈 。• 寄 存 器 W8-W14 由 被 调 用 函 数 保 存 。 被 调 用 函 数 必 须 保 存 它 会 修 改 的 任 何 这 些 寄 存器 。• 寄 存 器 W0-W4 用 于 存 放 函 数 返 回 值 。表 4-3:需 要 的 寄 存 器数 据 类 型char 1int 1short 1pointer 1需 要 的 寄 存 器 数long 2 ( 邻 近 的 – 对 齐 到 偶 数 编 号 的 寄 存 器 )float 2 ( 邻 近 的 – 对 齐 到 偶 数 编 号 的 寄 存 器 )double* 2 ( 邻 近 的 – 对 齐 到 偶 数 编 号 的 寄 存 器 )long double 2 ( 邻 近 的 – 对 齐 到 以 4 的 倍 数 编 号 的 寄 存 器 )structure 结 构 中 2 个 字 节 使 用 1 个 寄 存 器* 如 果 使 用 -fno-short-double, double 等 价 于 long double。参 数 存 放 到 可 用 的 第 一 批 ( 个 ) 对 齐 的 邻 近 寄 存 器 中 。 如 果 需 要 的 话 , 调 用 函 数 必 须保 存 参 数 。 结 构 没 有 任 何 对 齐 限 制 ; 如 果 有 足 够 的 寄 存 器 来 保 存 整 个 结 构 , 结 构 参 数将 占 用 寄 存 器 。 函 数 结 果 存 储 在 从 W0 开 始 的 连 续 寄 存 器 中 。4.12.1 函 数 参 数前 八 个 工 作 寄 存 器 (W0-W7) 用 于 存 储 函 数 参 数 。 参 数 以 自 左 向 右 的 顺 序 分 配 到 寄 存器 中 , 且 参 数 被 分 配 到 对 齐 适 当 的 第 一 个 可 用 寄 存 器 中 。下 面 的 示 例 中 , 所 有 参 数 都 通 过 寄 存 器 传 递 , 尽 管 这 些 参 数 不 是 以 在 声 明 中 出 现 的 顺序 存 放 在 寄 存 器 中 。 这 种 格 式 允 许 MPLAB <strong>C30</strong> 编 译 器 最 高 效 地 使 用 可 用 的 参 数 寄 存器 。例 4-1:函 数 调 用 模 型voidparams0(short p0, long p1, int p2, char p3, float p4, void *p5){/*** W0 p0** W1 p2** W3:W2 p1** W4 p3** W5 p5** W7:W6 p4*/...}DS51284C_CN 第 72 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境下 面 这 个 示 例 说 明 如 何 传 递 结 构 给 函 数 。 如 果 整 个 结 构 都 可 以 存 放 在 可 用 的 寄 存 器 中 ,那 么 通 过 寄 存 器 来 传 递 结 构 ; 否 则 结 构 参 数 将 存 放 在 堆 栈 中 。例 4-2:typedef struct bar {int i;double d;} bar;voidparams1(int i, bar b) {/*** W0 i** W1 b.i** W5:W2 b.d*/函 数 调 用 模 型 , 传 递 结 构}与 长 度 可 变 参 数 列 表 中 的 省 略 号 (...) 对 应 的 参 数 不 分 配 到 寄 存 器 中 。 任 何 不 分 配 到寄 存 器 的 参 数 都 以 自 右 向 左 的 顺 序 压 入 堆 栈 。下 面 的 示 例 中 , 由 于 结 构 参 数 太 大 而 不 能 存 放 到 寄 存 器 中 。 但 是 , 这 并 不 会 禁 止 使 用寄 存 器 来 存 放 下 一 个 参 数 。例 4-3:函 数 调 用 模 型 , 基 于 堆 栈 的 参 数typedef struct bar {double d,e;} bar;voidparams2(int i, bar b, int j) {/*** W0 i** stack b** W1 j*/}对 存 放 到 堆 栈 的 参 数 的 访 问 与 是 否 创 建 了 帧 指 针 有 关 。 编 译 器 一 般 情 况 下 都 创 建 帧 指针 ( 除 非 已 另 外 指 示 编 译 器 不 要 这 样 做 ), 将 通 过 帧 指 针 寄 存 器 (W14) 访 问 基 于 堆栈 的 参 数 。 在 上 面 的 示 例 中 , 通 过 W14-22 访 问 b。 已 通 过 减 去 上 一 个 FP 的 2 个 字节 , 返 回 地 址 的 4 个 字 节 , 和 b 的 16 个 字 节 , 计 算 出 相 对 于 帧 指 针 的 偏 移 量 为 -22( 参 见 图 4-6)。不 使 用 帧 指 针 时 , 汇 编 编 程 人 员 必 须 知 晓 自 过 程 的 入 口 开 始 使 用 了 多 少 堆 栈 空 间 。 如果 没 有 额 外 使 用 堆 栈 空 间 , 计 算 与 上 面 类 似 。 将 通 过 W15-20 访 问 b:4 个 字 节 用 于 返回 地 址 , 16 个 字 节 用 于 访 问 b 的 首 地 址 。© 2005 Microchip Technology Inc. DS51284C_CN 第 73 页


MPLAB ® <strong>C30</strong> 用 户 指 南4.12.2 返 回 值8 位 或 16 位 标 量 的 函 数 返 回 值 返 回 到 W0 中 , 32 位 标 量 的 函 数 返 回 值 返 回 到 W1:W0中 , 而 64 位 标 量 的 函 数 返 回 值 返 回 到 W3:W2:W1:W0 中 。 聚 集 通 过 W0 间 接 返 回 ,W0 由 调 用 函 数 设 置 为 包 含 聚 集 值 的 地 址 。4.12.3 调 用 函 数 时 保 存 寄 存 器对 于 一 般 的 函 数 调 用 , 编 译 器 指 定 函 数 调 用 时 保 护 寄 存 器 W8-W15。 寄 存 器 W0-W7可 用 作 暂 存 寄 存 器 。 对 于 中 断 函 数 , 编 译 器 指 定 保 护 所 有 必 需 的 寄 存 器 , 即 W0-W15和 RCOUNT。4.13 寄 存 器 约 定特 定 寄 存 器 在 C 运 行 时 环 境 中 起 着 特 殊 的 作 用 。 寄 存 器 变 量 使 用 一 个 或 多 个 工 作 寄 存器 , 参 见 表 4-4。表 4-4:寄 存 器 约 定变 量工 作 寄 存 器char, signed char, unsigned char W0-W13 和 W14 ( 如 果 没 有 用 作 帧 指 针 的 话 )。short, signed short, unsignedshortW0-W13 和 W14 ( 如 果 没 有 用 作 帧 指 针 的 话 )。int, signed int,unsigned int W0-W13 和 W14 ( 如 果 没 有 用 作 帧 指 针 的 话 )。void * (or any pointer) W0-W13 和 W14 ( 如 果 没 有 用 作 帧 指 针 的 话 )。long, signed long, unsigned long 一 对 邻 近 的 寄 存 器 , 第 一 个 寄 存 器 是 {W0, W2,W4, W6, W8, W10, W12} 之 一 。 低 编 号 的 寄 存 器包 含 值 的 最 低 16 位 。long long, signed long long,unsigned long long四 个 邻 近 的 寄 存 器 , 第 一 个 寄 存 器 是 {W0, W4,W8} 之 一 。 低 编 号 的 寄 存 器 包 含 值 的 最 低 16位 。 接 着 的 较 高 编 号 寄 存 器 包 含 接 着 的 较 高 位 。float 一 对 邻 近 的 寄 存 器 , 第 一 个 寄 存 器 是 {W0, W2,W4, W6, W8, W10, W12} 之 一 。 低 编 号 的 寄 存 器包 含 值 的 最 低 16 位 。double* 四 个 邻 近 的 寄 存 器 , 第 一 个 寄 存 器 是 {W0, W2,W4, W6, W8, W10, W12} 之 一 。 低 编 号 的 寄 存 器包 含 值 的 最 低 16 位 。long double 四 个 邻 近 的 寄 存 器 , 第 一 个 寄 存 器 是 {W0, W4,W8} 之 一 。 低 编 号 的 寄 存 器 包 含 值 的 最 低 16位 。* 如 果 使 用 了 -fno-short-double, double 等 价 于 long double。DS51284C_CN 第 74 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 运 行 时 环 境4.14 位 反 转 寻 址 和 模 寻 址编 译 器 并 不 直 接 支 持 位 反 转 寻 址 和 模 寻 址 的 使 用 。 如 果 对 一 个 寄 存 器 使 能 了 这 两 种 寻址 模 式 之 一 , 那 么 编 程 人 员 要 确 保 编 译 器 不 将 该 寄 存 器 用 作 指 针 。 当 使 能 这 两 种 寻 址模 式 之 一 时 , 在 产 生 中 断 时 要 特 别 小 心 。可 以 在 C 中 定 义 将 在 存 储 器 中 对 齐 适 当 的 数 组 用 于 通 过 汇 编 语 言 函 数 进 行 模 寻 址 。aligned 属 性 可 用 于 定 义 用 作 递 增 模 缓 冲 区 的 数 组 。 reverse 属 性 可 用 于 定 义 用 作递 减 模 缓 冲 区 的 数 组 。 关 于 这 些 属 性 的 详 细 信 息 , 请 参 阅 第 2.3 节 “ 关 键 字 差 别 ”。关 于 模 寻 址 的 更 多 信 息 , 请 参 阅 《dsPI<strong>C30</strong>F 系 列 参 考 手 册 》(DS70046C_CN) 的 第3 章 。4.15 程 序 空 间 可 视 性 (PSV) 的 使 用默 认 情 况 下 , 编 译 器 自 动 将 字 符 串 和 const 限 定 的 未 初 始 化 变 量 分 配 到 映 射 到 PSV窗 口 的 .const 段 。 然 后 PSV 管 理 由 编 译 器 进 行 管 理 , 编 译 器 不 会 移 动 PSV, 将 可访 问 程 序 存 储 区 的 大 小 限 制 为 PSV 窗 口 本 身 的 大 小 。或 者 , 应 用 程 序 可 控 制 PSV 窗 口 来 完 成 自 己 的 功 能 。 在 应 用 程 序 直 接 控 制 PSV 使 用的 优 点 是 , 这 比 将 一 个 .const 段 永 久 映 射 到 PSV 窗 口 更 为 灵 活 。 缺 点 是 , 应 用 程 序必 须 管 理 PSV 控 制 寄 存 器 和 位 。 指 定 -mconst-in-data 选 项 来 指 示 编 译 器 不 要 使用 PSV 窗 口 。space 属 性 可 用 来 定 义 在 PSV 窗 口 中 使 用 的 变 量 。 为 指 定 某 些 变 量 分 配 到 编 译 器 管 理的 段 .const 中 , 使 用 属 性 space(auto_psv)。 为 将 用 于 PSV 访 问 的 变 量 分 配 到不 由 编 译 器 管 理 的 段 中 , 使 用 属 性 space(psv)。 关 于 这 些 属 性 的 更 多 信 息 , 请 参 阅第 2.3 节 “ 关 键 字 差 别 ”。关 于 PSV 使 用 的 更 多 信 息 , 请 参 阅 MPLAB ASM30, MPLAB LINK30 and UtilitiesUser’s Guide (DS51317)。© 2005 Microchip Technology Inc. DS51284C_CN 第 75 页


MPLAB ® <strong>C30</strong> 用 户 指 南注 :DS51284C_CN 第 76 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南第 5 章 数 据 类 型5.1 简 介本 章 讲 述 MPLAB <strong>C30</strong> 的 数 据 类 型 。5.2 主 要 内 容本 章 讲 述 的 内 容 包 括 :• 数 据 表 示• 整 型• 浮 点 型• 指 针5.3 数 据 表 示多 字 节 量 以 “little endian” 格 式 存 储 , 即 :• 低 字 节 存 储 在 低 地 址 中• 低 位 存 储 在 编 号 低 的 位 地 址 中例 如 , 0x12345678 在 地 址 0x100 中 存 储 如 下 :0x100 0x78 0x56 0x1010x102 0x34 0x12 0x103而 0x12345678 在 寄 存 器 W4 和 W5 中 存 储 如 下 :W40x5678W50x12345.4 整 型表 5-1 列 出 了 MPLAB <strong>C30</strong> 所 支 持 的 整 型 数 据 类 型 。表 5-1: 整 型 数 据 类 型类 型 位 最 小 值 最 大 值char, signed char 8 -128 127unsigned char 8 0 255short, signed short 16 -32768 32767unsigned short 16 0 65535int, signed int 16 -32768 32767unsigned int 16 0 65535long, signed long 32 -2 31 2 31 - 1unsigned long 32 0 2 32 - 1long long**, signed long long** 64 -2 63 2 63 - 1unsigned long long** 64 0 2 64 - 1** ANSI-89 扩 展 类 型关 于 实 现 定 义 的 整 型 的 信 息 , 请 参 阅 第 A.6 节 “ 整 型 ”。© 2005 Microchip Technology Inc. DS51284C_CN 第 77 页


MPLAB ® <strong>C30</strong> 用 户 指 南5.5 浮 点 型MPLAB <strong>C30</strong> 使 用 IEEE-754 格 式 。 表 5-2 列 出 了 所 支 持 的 浮 点 型 数 据 类 型 。表 5-2:浮 点 型 数 据 类 型联 系 位 E 最 小 值 E 最 大 值 N 最 小 值 N 最 大 值float 32 -126 127 2 -126 2 128double* 32 -126 127 2 -126 2 128long double 64 -1022 1023 2 -1022 2 1024E = 指 数N = 归 一 化 的 ( 近 似 值 )* 如 果 使 用 -fno-short-double, double 等 价 于 long double。关 于 实 现 定 义 的 浮 点 型 数 的 更 多 信 息 , 请 参 阅 第 A.7 节 “ 浮 点 型 ”。5.6 指 针所 有 MPLAB <strong>C30</strong> 指 针 都 是 16 位 宽 的 。 这 对 于 整 个 数 据 空 间 (64 KB) 的 访 问 和 小 代码 模 型 (32K 字 的 代 码 ) 足 够 了 。 在 大 代 码 模 型 ( 大 于 32K 字 的 代 码 ) 中 , 指 针 可解 析 为 “ 句 柄 ”; 即 , 指 针 是 位 于 程 序 空 间 前 32K 字 的 GOTO 指 令 的 地 址 。DS51284C_CN 第 78 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南第 6 章 器 件 支 持 文 件6.1 简 介本 章 讲 述 为 支 持 MPLAB <strong>C30</strong> 编 译 使 用 的 器 件 支 持 文 件 。6.2 主 要 内 容6.3 处 理 器 头 文 件本 章 讨 论 的 内 容 包 括 :• 处 理 器 头 文 件• 寄 存 器 定 义 文 件• 使 用 特 殊 功 能 寄 存 器• 使 用 宏• 从 C 代 码 访 问 EEDATA处 理 器 头 文 件 随 语 言 工 具 提 供 。 这 些 头 文 件 定 义 了 每 个 dsPIC 器 件 中 可 用 的 特 殊 功 能寄 存 器 (Special Function Register, SFR)。 要 在 C 中 使 用 头 文 件 , 使 用 :#include 其 中 xxxx 对 应 器 件 的 型 号 。 C 头 文 件 包 含 在 support\h 目 录 中 。为 使 用 特 殊 功 能 寄 存 器 名 ( 如 CORCONbits), 必 须 包 含 头 文 件 。例 如 下 面 的 模 块 , 是 为 PI<strong>C30</strong>F2010 器 件 编 写 的 , 包 括 两 个 函 数 : 一 个 函 数 用 于 使 能PSV 窗 口 , 另 一 个 函 数 用 于 禁 止 PSV 窗 口 。#include voidEnablePSV(void){CORCONbits.PSV = 1;}voidDisablePSV(void){CORCONbits.PSV = 0;}© 2005 Microchip Technology Inc. DS51284C_CN 第 79 页


MPLAB ® <strong>C30</strong> 用 户 指 南处 理 器 头 文 件 的 约 定 是 , 使 用 器 件 数 据 手 册 中 的 寄 存 器 名 对 每 一 个 SFR 命 名 。 例 如 ,CORCON 指 内 核 控 制 寄 存 器 。 如 果 SFR 中 有 一 些 重 要 的 位 , 因 此 头 文 件 中 还 有 为 该SFR 定 义 的 结 构 , 结 构 名 与 SFR 的 名 字 相 同 , 只 是 在 后 面 附 加 了 “bits”。 例 如 ,CORCONbits 是 内 核 控 制 寄 存 器 的 结 构 。 使 用 数 据 手 册 中 位 的 名 字 命 名 结 构 中 的 各 位( 或 位 域 ), 如 PSV 表 示 CORCON 寄 存 器 中 的 PSV 位 。 下 面 是 对 CORCON 的 完 整 定义 ( 将 来 可 能 会 有 所 变 化 ):/* CORCON: CPU Mode control Register */extern volatile unsigned int CORCON __attribute__((__near__));typedef struct tagCORCONBITS {unsigned IF :1; /* Integer/Fractional mode */unsigned RND :1; /* Rounding mode */unsigned PSV :1; /* Program Space Visibility enable */unsigned IPL3 :1;unsigned ACCSAT :1; /* Acc saturation mode */unsigned SATDW :1; /* Data space write saturation enable */unsigned SATB :1; /* Acc B saturation enable */unsigned SATA :1; /* Acc A saturation enable */unsigned DL :3; /* DO loop nesting level status */unsigned :4;} CORCONBITS;extern volatile CORCONBITS CORCONbits __attribute__((__near__));注 :符 号 CORCON 和 CORCONbits 指 同 一 个 寄 存 器 , 在 链 接 时 将 解 析 为 同 一地 址 。6.4 寄 存 器 定 义 文 件第 6.3 节 “ 处 理 器 头 文 件 ” 中 描 述 的 处 理 器 头 文 件 指 定 了 每 个 器 件 的 所 有 SFR, 但 并未 定 义 SFR 的 地 址 。 support\gld 目 录 中 有 每 个 器 件 的 链 接 描 述 文 件 。 链 接 描 述 文件 定 义 了 SFR 的 地 址 。 要 使 用 链 接 描 述 文 件 , 指 定 链 接 器 命 令 行 选 项 :-T p30fxxxx.gld其 中 xxxx 指 器 件 的 型 号 。例 如 , 假 定 有 一 个 名 为 app2010.c 的 文 件 , 它 包 含 PI<strong>C30</strong>F2010 器 件 的 一 个 应 用 程序 , 则 可 使 用 下 面 的 命 令 行 编 译 和 链 接 这 个 文 件 :pic30-gcc -o app2010.o -T p30f2010.gld app2010.c-o 命 令 行 选 项 命 名 输 出 COFF 可 执 行 文 件 , -T 选 项 给 出 PI<strong>C30</strong>F2010 器 件 的 名 称 。如 果 在 当 前 的 目 录 中 找 不 到 p30f2010.gld, 链 接 器 将 在 已 知 的 库 路 径 中 搜 索 。 对 于默 认 的 安 装 , 链 接 描 述 文 件 包 含 在 PI<strong>C30</strong>_LIBRARAY_PATH 中 。 更 多 信 息 参 见 第 3.6节 “ 环 境 变 量 ”。DS51284C_CN 第 80 页© 2005 Microchip Technology Inc.


器 件 支 持 文 件6.5 使 用 特 殊 功 能 寄 存 器在 应 用 程 序 中 使 用 特 殊 功 能 寄 存 器 时 要 遵 循 以 下 三 个 步 骤 :1. 包 含 所 使 用 器 件 的 处 理 器 头 文 件 。 这 样 能 提 供 该 型 号 器 件 特 殊 功 能 寄 存 器 的 源代 码 。 例 如 , 下 面 的 语 句 包 含 了 PI<strong>C30</strong>F6014 器 件 的 头 文 件 :#include 2. 像 访 问 任 何 其 他 C 变 量 一 样 访 问 特 殊 功 能 寄 存 器 。 源 代 码 可 对 特 殊 功 能 寄 存 器 进行 读 和 写 。例 如 , 下 面 的 语 句 将 Timer1 特 殊 功 能 寄 存 器 中 的 所 有 位 清 零 。TMR1 = 0;下 面 一 条 语 句 中 的 T1CONbits.TON 表 示 T1CON 寄 存 器 中 的 第 15 位 , 即 “ 定 时器 开 启 ” 位 。 这 条 语 句 将 名 为 TON 的 位 置 1 来 启 动 定 时 器 。T1CONbits.TON = 1;3. 链 接 相 应 器 件 的 寄 存 器 定 义 文 件 或 链 接 描 述 文 件 。 链 接 器 提 供 特 殊 功 能 寄 存 器 的地 址 。( 请 记 住 位 结 构 在 链 接 时 具 有 和 SFR 相 同 的 地 址 )。 例 6.1 将 使 用 :p30f6014.gld关 于 使 用 链 接 描 述 文 件 的 更 多 信 息 , 请 参 阅 MPLAB ASM30, MPLAB LINK30 andUtilities User's Guide (DS51317)。下 面 的 例 子 是 实 时 时 钟 的 示 例 代 码 。 它 使 用 了 几 个 特 殊 功 能 寄 存 器 。 这 些 特 殊 功 能 寄存 器 的 描 述 参 见 p30f6014.h 文 件 。 该 文 件 将 和 特 定 于 器 件 的 链 接 描 述 文 件p30f6014.gld 相 链 接 。© 2005 Microchip Technology Inc. DS51284C_CN 第 81 页


MPLAB ® <strong>C30</strong> 用 户 指 南例 6-1:实 时 时 钟 示 例 代 码/*** Sample Real Time Clock for dsPIC**** Uses Timer1, TCY clock timer mode** and interrupt on period match*/#include /* Timer1 period for 1 ms with FOSC = 20 MHz */#define TMR1_PERIOD 0x1388struct clockType{unsigned int timer; /* countdown timer, milliseconds */unsigned int ticks; /* absolute time, milliseconds */unsigned int seconds; /* absolute time, seconds */} volatile RTclock;void reset_clock(void){RTclock.timer = 0; /* clear software registers */RTclock.ticks = 0;RTclock.seconds = 0;TMR1 = 0; /* clear timer1 register */PR1 = TMR1_PERIOD; /* set period1 register */T1CONbits.TCS = 0; /* set internal clock source */IPC0bits.T1IP = 4; /* set priority level */IFS0bits.T1IF = 0; /* clear interrupt flag */IEC0bits.T1IE = 1; /* enable interrupts */SRbits.IPL = 3; /* enable CPU priority levels 4-7*/T1CONbits.TON = 1; /* start the timer*/}void __attribute__((__interrupt__)) _T1Interrupt(void){ static int sticks=0;}if (RTclock.timer > 0) /* if countdown timer is active */RTclock.timer -= 1; /* decrement it */RTclock.ticks++; /* increment ticks counter */if (sticks++ > 1000){ /* if time to rollover */sticks = 0; /* clear seconds ticks */RTclock.seconds++; /* and increment seconds */}IFS0bits.T1IF = 0; /* clear interrupt flag */return;DS51284C_CN 第 82 页© 2005 Microchip Technology Inc.


器 件 支 持 文 件6.6 使 用 宏处 理 器 头 文 件 除 定 义 了 特 殊 功 能 寄 存 器 外 , 还 为 dsPI<strong>C30</strong>F 系 列 数 字 信 号 控 制 器 定 义了 有 用 的 宏 。6.6.1 配 置 位 设 置 宏提 供 了 可 用 来 设 置 配 置 位 的 宏 。 例 如 , 为 使 用 宏 设 置 FOSC 位 , 可 在 C 源 代 码 开 头 前插 入 下 面 的 代 码 :_FOSC(CSW_FSCM_ON & EC_PLL16);这 将 使 能 外 部 时 钟 , PLL 设 置 为 16x。 同 时 使 能 时 钟 切 换 和 时 钟 失 效 保 护 监 测 。同 样 , 设 置 FBORPOR 位 :_FBORPOR(PBOR_ON & BORV_27 & PWRT_ON_64 & MCLR_DIS);这 将 使 能 2.7V 的 欠 压 复 位 , 将 上 电 延 时 定 时 器 初 始 化 为 64 ms, 并 将 MCLR 引 脚 配 置为 普 通 I/O 口 。每 个 配 置 位 的 设 置 列 表 , 参 见 处 理 器 头 文 件 。6.6.2 行 内 汇 编 使 用 的 宏下 面 列 出 了 用 于 在 C 中 定 义 汇 编 代 码 的 宏 :#define Nop() {__asm__ volatile ("nop");}#define ClrWdt() {__asm__ volatile ("clrwdt");}#define Sleep() {__asm__ volatile ("pwrsav #0");}#define Idle() {__asm__ volatile ("pwrsav #1");}6.6.3 数 据 存 储 器 分 配 宏本 节 讲 述 可 用 于 分 配 数 据 存 储 空 间 的 宏 。 有 两 种 类 型 : 需 要 参 数 的 宏 和 不 需 要 参 数 的宏 。下 面 的 宏 需 要 一 个 参 数 N 来 指 定 对 齐 。 N 必 须 是 2 的 次 幂 , 最 小 值 为 2。#define _XBSS(N) __attribute__((space(xmemory), aligned(N)))#define _XDATA(N) __attribute__((space(xmemory), aligned(N)))#define _YBSS(N) __attribute__((space(ymemory), aligned(N)))#define _YDATA(N) __attribute__((space(ymemory), aligned(N)))#define _EEDATA(N) __attribute__((space(eedata), aligned(N)))例 如 , 声 明 一 个 未 初 始 化 数 组 位 于 X 存 储 区 中 , 对 齐 到 32 字 节 地 址 :int _XBSS(32) xbuf[16];声 明 一 个 未 初 始 化 数 组 位 于 数 据 EEPROM 中 , 没 有 特 殊 对 齐 方 式 :int _EEDATA(2) table1[] = {0, 1, 1, 2, 3, 5, 8, 13, 21};下 面 的 宏 不 需 要 参 数 。 这 些 宏 可 用 于 将 变 量 分 配 到 持 久 数 据 存 储 区 或 near 数 据 存 储 区中 。#define _PERSISTENT __attribute__((persistent))#define _NEAR __attribute__((near))例 如 , 声 明 器 件 复 位 后 能 保 留 其 值 的 两 个 变 量 :int _PERSISTENT var1,var2;© 2005 Microchip Technology Inc. DS51284C_CN 第 83 页


MPLAB ® <strong>C30</strong> 用 户 指 南6.6.4 中 断 服 务 程 序 声 明 宏下 面 的 宏 可 用 于 声 明 中 断 服 务 程 序 (ISR):#define _ISR __attribute__((interrupt))#define _ISRFAST __attribute__((interrupt, shadow))例 如 , 声 明 timer0 中 断 的 中 断 服 务 程 序 :void _ISR _INT0Interrupt(void);声 明 SPI1 中 断 的 快 速 现 场 保 护 中 断 服 务 程 序 :void _ISRFAST _SPI1Interrupt(void);注 :如 果 中 断 服 务 程 序 使 用 了 表 7-1 中 给 出 的 保 留 名 , 中 断 服 务 程 序 的 地 址 将自 动 填 充 到 中 断 向 量 表 中 。6.7 从 C 代 码 访 问 EEDATAMPLAB <strong>C30</strong> 提 供 了 一 些 方 便 的 宏 定 义 来 允 许 将 数 据 存 放 在 器 件 的 EE 数 据 区 中 。 这 实 现起 来 很 简 单 :int _EEDATA(2) user_data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };user_data 将 被 存 放 在 EE 数 据 空 间 中 , 为 给 定 的 初 值 保 留 10 个 字 。dsPIC 器 件 为 编 程 人 员 提 供 了 两 种 方 法 来 访 问 这 种 存 储 区 。 一 种 方 法 是 通 过 程 序 空 间可 视 性 (PSV) 窗 口 。 另 一 种 方 法 是 使 用 特 殊 机 器 指 令 (TBLRDx)。6.7.1 通 过 PSV 访 问 EEDATA编 译 器 通 常 管 理 PSV 窗 口 来 访 问 存 储 在 程 序 存 储 器 中 的 常 量 。 否 则 ,PSV 窗 口 可 用 于访 问 EEDATA 存 储 器 。要 使 用 PSV 窗 口 :• PSVPAG 寄 存 器 必 须 设 置 为 要 访 问 的 程 序 存 储 器 的 正 确 地 址 。 对 于 EE 数 据 , 该 地址 为 0xFF, 但 最 好 使 用 __builtin_psvpage() 函 数 。• 还 应 通 过 置 位 CORCON 寄 存 器 中 的 PSV 位 来 使 能 PSV 窗 口 。 如 果 该 位 没 有 置 位 ,使 用 PSV 窗 口 将 始 终 读 为 0x0000。例 6-2:通 过 PSV 访 问 EEDATA#include int main(void) {PSVPAG = __builtin_psvpage(&user_data);CORCONbits.PSV = 1;/* ... */if (user_data[2]) ;/* do something */}这 些 步 骤 仅 需 要 执 行 一 次 。 除 非 改 变 了 PSVPAG, 否 则 可 通 过 像 普 通 C 变 量 一 样 引 用EE 数 据 空 间 中 的 变 量 来 读 这 些 变 量 , 如 本 例 。注 : 这 一 访 问 模 式 与 编 译 器 管 理 的 PSV (-mconst-in-code) 模 式 不 兼 容 。要 注 意 防 止 出 现 冲 突 。DS51284C_CN 第 84 页© 2005 Microchip Technology Inc.


器 件 支 持 文 件6.7.2 使 用 TBLRDx 指 令 访 问 EEDATA编 译 器 不 直 接 支 持 TBLRDx 指 令 , 但 可 以 通 过 行 内 汇 编 使 用 这 些 指 令 。 像 PSV 访 问 一样 , 通 过 一 个 SFR 值 形 成 一 个 23 位 的 地 址 , 并 将 地 址 编 码 为 指 令 的 一 部 分 。 为 访 问与 前 面 示 例 中 的 存 储 器 , 可 使 用 下 面 的 代 码 :要 使 用 TBLRDx 指 令 :• TBLPAG 寄 存 器 必 须 设 置 为 要 访 问 的 程 序 存 储 器 的 正 确 地 址 。 对 于 EE 数 据 存 储 器 ,这 一 地 址 为 0x7F, 但 最 好 使 用 __builtin_tblpage() 函 数 。• TBLRDx 指 令 只 能 通 过 __asm__ 语 句 访 问 。 关 于 这 一 指 令 的 信 息 , 请 参 阅Programmers Reference Manual (DS70030)。例 6-3:通 过 表 读 访 问 EEDATA#include #define eedata_read(src, dest) { \register int eedata_addr; \register int eedata_val; \\eedata_addr = __builtin_tbloffset(&src); \__asm__("tblrdl [%1], %0" : "=r"(eedata_val) : "r"(eedata_addr)); \dest = eedata_val; \}int main(void) {int value;TBLPAG = __builtin_tblpage(&user_data);eedata_read(user_data[2], value);if (value) ; /* do something */}6.7.3 其 他 信 息 来 源《dsPI<strong>C30</strong>F 系 列 参 考 手 册 》 的 第 5 章 (DS70052C_CN) 对 dsPIC 器 件 提 供 的 闪 存程 序 存 储 器 和 EE 数 据 存 储 器 的 使 用 进 行 了 很 好 的 论 述 。 本 章 也 包 含 关 于 程 序 存 储 器和 EE 数 据 存 储 器 运 行 时 编 程 的 信 息 。© 2005 Microchip Technology Inc. DS51284C_CN 第 85 页


MPLAB ® <strong>C30</strong> 用 户 指 南注 :DS51284C_CN 第 86 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南第 7 章 中 断7.1 简 介中 断 处 理 对 于 大 多 数 单 片 机 应 用 来 说 都 是 很 重 要 的 一 个 方 面 。 中 断 用 来 使 软 件 操 作 与实 时 发 生 的 事 件 同 步 。 当 发 生 中 断 时 , 软 件 的 正 常 执 行 流 程 被 打 断 , 调 用 专 门 的 函 数来 处 理 事 件 。 当 中 断 处 理 结 束 时 , 恢 复 先 前 的 现 场 信 息 并 继 续 正 常 执 行 流 程 。dsPI<strong>C30</strong>F 器 件 支 持 多 个 内 部 和 外 部 中 断 源 。 另 外 , 允 许 高 优 先 级 中 断 中 断 任 何 正 在 处理 的 低 优 先 级 中 断 。MPLAB <strong>C30</strong> 编 译 器 完 全 支 持 在 C 或 行 内 汇 编 代 码 中 进 行 中 断 处 理 。 本 章 将 对 中 断 处理 做 一 个 概 括 介 绍 。7.2 主 要 内 容本 章 讨 论 的 主 题 包 括 :• 编 写 中 断 服 务 程 序 — 可 以 将 一 个 或 多 个 C 函 数 指 定 为 中 断 服 务 程 序 , 在 发 生 中 断时 调 用 。 为 了 获 得 最 好 的 性 能 , 通 常 将 长 的 计 算 或 需 要 调 用 库 函 数 的 操 作 放 在 主 应用 程 序 中 。 当 中 断 事 件 发 生 很 快 时 , 这 种 方 式 可 以 优 化 性 能 并 最 大 程 度 降 低 信 息 丢失 的 可 能 性 。• 写 中 断 向 量 — 当 发 生 中 断 时 ,dsPI<strong>C30</strong>F 器 件 使 用 中 断 向 量 来 转 移 应 用 控 制 。 中 断向 量 是 程 序 存 储 器 中 的 专 用 地 址 , 指 定 ISR 的 地 址 。 为 使 用 中 断 , 应 用 必 须 在 这些 地 址 中 包 含 有 效 的 函 数 地 址 。• 中 断 服 务 程 序 现 场 保 护 — 为 了 保 证 从 中 断 返 回 到 代 码 后 , 条 件 状 态 与 中 断 前 相同 , 必 须 保 护 特 定 寄 存 器 的 现 场 信 息 。• 中 断 响 应 时 间 — 从 中 断 事 件 发 生 到 执 行 ISR 第 一 条 指 令 之 间 的 时 间 就 是 中 断 响 应时 间• 中 断 嵌 套 — MPLAB <strong>C30</strong> 支 持 中 断 嵌 套 。• 使 能 / 禁 止 中 断 — 通 过 两 种 方 式 使 能 和 禁 止 中 断 源 : 全 局 和 单 独 。© 2005 Microchip Technology Inc. DS51284C_CN 第 87 页


MPLAB ® <strong>C30</strong> 用 户 指 南7.3 编 写 中 断 服 务 程 序可 以 根 据 本 节 提 供 的 要 领 , 仅 使 用 C 语 言 语 法 结 构 编 写 所 有 应 用 代 码 , 其 中 包 括 中 断服 务 程 序 (ISR)。7.3.1 编 写 中 断 服 务 程 序 的 要 领编 写 ISR 的 要 领 为 :• 不 带 参 数 并 以 void 返 回 值 类 型 声 明 ISR ( 强 制 )• 不 要 通 过 一 般 程 序 调 用 ISR ( 强 制 )• 不 要 用 ISR 调 用 其 他 函 数 ( 建 议 )MPLAB <strong>C30</strong> 的 ISR 和 任 何 其 他 C 函 数 一 样 , 可 以 有 局 部 变 量 , 可 以 访 问 全 局 变 量 。但 是 , ISR 需 要 声 明 为 没 有 参 数 , 没 有 返 回 值 。 这 是 必 须 的 , 因 为 ISR 作 为 对 硬 件 中断 或 陷 阱 的 响 应 , 对 它 的 调 用 与 一 般 C 程 序 异 步 ( 即 ISR 不 是 按 通 常 的 方 式 调 用 的 ,因 此 不 能 有 参 数 和 返 回 值 )。ISR 只 能 通 过 硬 件 中 断 或 陷 阱 调 用 , 不 能 通 过 其 他 C 函 数 调 用 。 ISR 使 用 中 断 返 回(RETFIE) 指 令 退 出 函 数 , 而 不 是 使 用 一 般 的 RETURN 指 令 。 不 恢 复 现 场 使 用RETFIE 指 令 退 出 中 断 服 务 程 序 会 破 坏 处 理 器 资 源 , 如 status 寄 存 器 的 值 。最 后 , 由 于 中 断 响 应 时 间 的 原 因 , 建 议 不 要 使 用 ISR 调 用 其 他 函 数 。 更 多 信 息 请 参 阅第 7.6 节 “ 中 断 响 应 时 间 ”。7.3.2 编 写 中 断 服 务 程 序 的 语 法为 将 C 函 数 声 明 为 中 断 服 务 程 序 , 指 定 函 数 的 interrupt 属 性 ( 参 见 § 2.3 中 关 于__attribute__ 关 键 字 的 描 述 )。 interrupt 属 性 的 语 法 如 下 :__attribute__((interrupt [([ save(symbol-list)][, irq(irqid)][, altirq(altirqid)][, preprologue(asm)])]))可 以 在 interrupt 属 性 名 和 参 数 名 的 前 后 加 下 划 线 字 符 。 因 此 , interrupt 和__interrupt__ 是 等 价 的 , save 和 __save__ 也 是 等 价 的 。可 选 的 save 参 数 指 定 进 入 和 退 出 ISR 时 需 要 保 护 和 恢 复 的 一 个 或 多 个 变 量 。 变 量 名列 表 包 含 在 括 号 内 , 变 量 名 中 间 用 逗 号 分 隔 开 。如 果 不 想 导 出 全 局 变 量 的 值 , 应 该 保 护 可 能 在 ISR 中 修 改 的 全 局 变 量 。 被 ISR 修 改 的全 局 变 量 应 该 用 volatile 限 定 。可 选 的 irq 参 数 允 许 将 一 个 中 断 向 量 对 应 于 一 个 特 定 的 中 断 , 可 选 的 altirq 参 数 允许 将 一 个 中 断 向 量 对 应 于 一 个 指 定 的 备 用 中 断 。 每 个 参 数 都 需 要 一 个 括 号 括 起 来 的 中断 ID 号 。( 参 阅 第 7.4 节 “ 写 中 断 向 量 ” 中 的 中 断 ID 列 表 。)可 选 的 preprologue 参 数 允 许 在 生 成 的 代 码 中 , 编 译 器 生 成 的 函 数 prologue 前 插 入汇 编 语 句 。DS51284C_CN 第 88 页© 2005 Microchip Technology Inc.


中 断7.3.3 为 中 断 服 务 程 序 编 写 代 码下 面 的 原 型 声 明 了 函 数 isr0 为 中 断 服 务 程 序 :void __attribute__((__interrupt__)) isr0(void);由 原 型 可 以 看 出 , 中 断 函 数 必 须 不 带 参 数 , 没 有 返 回 值 。 如 果 需 要 的 话 , 编 译 器 将 保护 所 有 工 作 寄 存 器 , 以 及 status 寄 存 器 和 重 复 计 数 寄 存 器 。 将 其 他 变 量 指 定 为interrupt 属 性 的 参 数 , 可 以 保 护 这 些 变 量 。 例 如 , 要 使 编 译 器 自 动 保 护 和 恢 复 变 量var1 和 var2, 使 用 下 面 的 原 型 :void __attribute__((__interrupt__(__save__(var1,var2)))) isr0(void);为 请 求 编 译 器 使 用 快 速 现 场 保 护 ( 使 用 push.s 和 pop.s 指 令 ), 指 定 函 数 的shadow 属 性 ( 参 阅 第 2.3.2 节 “ 指 定 函 数 的 属 性 ”)。 例 如 :void __attribute__((__interrupt__, __shadow__)) isr0(void);7.3.4 使 用 宏 声 明 简 单 的 中 断 服 务 程 序如 果 一 个 中 断 服 务 程 序 不 需 要 interrupt 属 性 的 任 何 可 选 参 数 , 则 可 使 用 简 单 的 语 法 。在 针 对 器 件 的 头 文 件 中 定 义 了 下 面 的 宏 :#define _ISR __attribute__((interrupt))#define _ISRFAST __attribute__((interrupt, shadow))例 如 , 声 明 timer0 中 断 的 中 断 服 务 程 序 :#include void _ISR _INT0Interrupt(void);用 快 速 现 场 保 护 声 明 SPI1 中 断 的 中 断 服 务 程 序 :#include void _ISRFAST _SPI1Interrupt(void);© 2005 Microchip Technology Inc. DS51284C_CN 第 89 页


MPLAB ® <strong>C30</strong> 用 户 指 南7.4 写 中 断 向 量dsPIC 器 件 有 两 个 中 断 向 量 表 — 主 表 和 备 用 表 — 每 个 表 都 包 含 62 个 异 常 向 量 。62 个 异 常 源 有 主 异 常 向 量 和 备 用 异 常 向 量 与 之 相 关 联 , 每 个 向 量 占 据 一 个 程 序 字 , 如表 7-1 所 示 。 当 INTCON2 寄 存 器 中 的 ALTIVT 位 置 位 时 , 使 用 备 用 向 量 名 。注 :dsPIC 器 件 复 位 不 通 过 中 断 向 量 表 处 理 。 而 是 在 器 件 复 位 时 , 清 零 dsPIC程 序 计 数 器 。 这 使 处 理 器 从 地 址 0 处 开 始 执 行 。 按 照 约 定 , 链 接 描 述 文 件在 该 地 址 处 构 建 GOTO 指 令 来 转 移 控 制 到 C 运 行 时 启 动 模 块 。表 7-1: 中 断 向 量IRQ# 向 量 函 数 主 向 量 名 备 用 向 量 名n/a 保 留 _ReservedTrap0 _AltReservedTrap0n/a 振 荡 器 失 效 陷 阱 _OscillatorFail _AltOscillatorFailn/a 地 址 错 误 陷 阱 _AddressError _AltAddressErrorn/a 堆 栈 错 误 陷 阱 _StackError _AltStackErrorn/a 数 学 错 误 陷 阱 _MathError _AltMathErrorn/a 保 留 _ReservedTrap5 _AltReservedTrap5n/a 保 留 _ReservedTrap6 _AltReservedTrap6n/a 保 留 _ReservedTrap7 _AltReservedTrap70 INT0 — 外 部 中 断 0 _INT0Interrupt _AltINT0Interrupt1 IC1 — 输 入 捕 捉 1 _IC1Interrupt _AltIC1Interrupt2 OC1 — 输 出 比 较 1 _OC1Interrupt _AltOC1Interrupt3 TMR1 — 定 时 器 1 _T1Interrupt _AltT1Interrupt4 IC2 — 输 入 捕 捉 2 _IC2Interrupt _AltIC2Interrupt5 OC2 — 输 出 比 较 2 _OC2Interrupt _AltOC2Interrupt6 TMR2 — 定 时 器 2 _T2Interrupt _AltT2Interrupt7 TMR3 — 定 时 器 3 _T3Interrupt _AltT3Interrupt8 SPI1 — 串 行 外 设 接 口 1 _SPI1Interrupt _AltSPI1Interrupt9 UART1RX — UART1 接 收 器 _U1RXInterrupt _AltU1RXInterrupt10 UART1TX — UART1 发 送 器 _U1TXInterrupt _AltU1TXInterrupt11 ADC — ADC 转 换 完 成 _ADCInterrupt _AltADCInterrupt12 NVM — NVM 写 完 成 _NVMInterrupt _AltNVMInterrupt13 从 I 2 C 中 断 _SI2CInterrupt _AltSI2CInterrupt14 主 I 2 C 中 断 _MI2CInterrupt _AltMI2CInterrupt15 CN — 输 入 变 化 中 断 _CNInterrupt _AltCNInterrupt16 INT1 — 外 部 中 断 1 _INT1Interrupt _AltINT1Interrupt17 IC7 — 输 入 捕 捉 7 _IC7Interrupt _AltIC7Interrupt18 IC8 — 输 入 捕 捉 8 _IC8Interrupt _AltIC8Interrupt19 OC3 — 输 出 比 较 3 _OC3Interrupt _AltOC3Interrupt20 OC4 — 输 出 比 较 4 _OC4Interrupt _AltOC4Interrupt21 TMR4 — 定 时 器 4 _T4Interrupt _AltT4Interrupt22 TMR5 — 定 时 器 5 _T5Interrupt _AltT5Interrupt23 INT2 — 外 部 中 断 2 _INT2Interrupt _AltINT2InterruptDS51284C_CN 第 90 页© 2005 Microchip Technology Inc.


中 断表 7-1: 中 断 向 量 ( 续 )IRQ# 向 量 函 数 主 向 量 名 备 用 向 量 名24 UART2RX — UART2 接 收 器 _U2RXInterrupt _AltU2RXInterrupt25 UART2TX — UART2 发 送 器 _U2TXInterrupt _AltU2TXInterrupt26 SPI2 — 串 行 外 设 接 口 2 _SPI2Interrupt _AltSPI2Interrupt27 CAN1 — 组 合 IRQ _C1Interrupt _AltC1Interrupt28 IC3 — 输 入 捕 捉 3 _IC3Interrupt _AltIC3Interrupt29 IC4 — 输 入 捕 捉 4 _IC4Interrupt _AltIC4Interrupt30 IC5 — 输 入 捕 捉 5 _IC5Interrupt _AltIC5Interrupt31 IC6 — 输 入 捕 捉 6 _IC6Interrupt _AltIC6Interrupt32 OC5 — 输 出 比 较 5 _OC5Interrupt _AltOC5Interrupt33 OC6 — 输 出 比 较 6 _OC6Interrupt _AltOC6Interrupt34 OC7 — 输 出 比 较 7 _OC7Interrupt _AltOC7Interrupt35 OC8 — 输 出 比 较 8 _OC8Interrupt _AltOC8Interrupt36 INT3 — 外 部 中 断 3 _INT3Interrupt _AltINT3Interrupt37 INT4 — 外 部 中 断 4 _INT4Interrupt _AltINT4Interrupt38 CAN2 — 组 合 IRQ _C2Interrupt _AltC2Interrupt39 PWM — PWM 周 期 匹 配 _PWMInterrupt _AltPWMInterrupt40 QEI — 位 置 计 数 器 比 较 _QEIInterrupt _AltQEIInterrupt41 DCI — CODEC 传 输 完 成 _DCIInterrupt _AltDCIInterrupt42 PLVD — 低 电 压 检 测 _LVDInterrupt _AltLVDInterrupt43 FLTA — MPWM 故 障 A _FLTAInterrupt _AltFLTAInterrupt44 FLTB — MPWM 故 障 B _FLTBInterrupt _AltFLTBInterrupt45 保 留 _Interrupt45 _AltInterrupt4546 保 留 _Interrupt46 _AltInterrupt4647 保 留 _Interrupt47 _AltInterrupt4748 保 留 _Interrupt48 _AltInterrupt4849 保 留 _Interrupt49 _AltInterrupt4950 保 留 _Interrupt50 _AltInterrupt5051 保 留 _Interrupt51 _AltInterrupt5152 保 留 _Interrupt52 _AltInterrupt5253 保 留 _Interrupt53 _AltInterrupt53为 响 应 一 个 中 断 , 必 须 将 函 数 的 地 址 填 充 到 一 个 向 量 表 的 恰 当 地 址 , 且 函 数 必 须 保 护它 使 用 的 任 何 系 统 资 源 。 函 数 必 须 使 用 RETFIE 处 理 器 指 令 返 回 到 前 台 任 务 。 中 断 函数 可 用 C 编 写 。 当 将 一 个 C 函 数 指 定 为 中 断 处 理 函 数 时 , 编 译 器 将 保 护 编 译 器 使 用 的所 有 系 统 资 源 , 并 使 用 恰 当 的 指 令 从 函 数 返 回 。 编 译 器 可 以 可 选 地 用 中 断 函 数 的 地 址填 充 中 断 向 量 表 。© 2005 Microchip Technology Inc. DS51284C_CN 第 91 页


MPLAB ® <strong>C30</strong> 用 户 指 南为 使 编 译 器 填 充 指 向 中 断 函 数 的 中 断 向 量 , 按 照 前 表 命 名 函 数 。 例 如 , 如 果 定 义 了 下列 函 数 , 堆 栈 错 误 向 量 将 自 动 被 填 充 :void __attribute__((__interrupt__)) _StackError(void);注 意 下 划 线 是 放 在 前 面 的 。 类 似 地 , 如 果 定 义 了 下 面 的 函 数 , 备 用 堆 栈 错 误 向 量 将 自动 被 填 充 :void __attribute__((__interrupt__)) _AltStackError(void);同 样 要 注 意 下 划 线 是 放 在 前 面 的 。对 于 没 有 指 定 处 理 函 数 的 所 有 中 断 向 量 , 将 自 动 填 充 一 个 默 认 的 中 断 处 理 函 数 。 默 认的 中 断 处 理 函 数 由 链 接 器 提 供 , 仅 复 位 器 件 。 应 用 程 序 也 可 通 过 用 名 字_DefaultInterrupt 声 明 一 个 中 断 函 数 来 提 供 默 认 的 中 断 处 理 函 数 。每 个 表 中 的 最 后 九 个 中 断 向 量 没 有 预 定 义 的 硬 件 函 数 。 可 通 过 使 用 前 表 中 给 出 的 名 字 ,或 者 更 适 合 应 用 的 名 字 , 填 充 这 些 向 量 , 同 时 , 仍 使 用 interrupt 属 性 的 irq 或altirq 参 数 填 充 适 当 的 向 量 入 口 。 例 如 , 为 指 定 一 个 函 数 使 用 主 中 断 向 量 52, 使 用 下面 的 语 句 :void __attribute__((__interrupt__(__irq__(52)))) MyIRQ(void);7.5 中 断 服 务 程 序 现 场 保 护类 似 地 , 指 定 一 个 函 数 使 用 备 用 中 断 向 量 52, 使 用 下 面 的 语 句 :void __attribute__((__interrupt__(__altirq__(52)))) MyAltIRQ(void);irq/altirq 号 可 以 为 中 断 请 求 编 号 45 至 53 中 的 一 个 。 如 果 使 用 了 interrupt 属 性 的 irq参 数 , 编 译 器 将 生 成 外 部 符 号 名 __Interruptn, 其 中 n 为 向 量 号 。 因 此 , C 标 识 符_Interrupt45 到 _Interrupt53 被 编 译 器 保 留 。 同 样 , 如 果 使 用 了 interrupt 属 性 的altirq 参 数 , 编 译 器 将 生 成 外 部 符 号 名 __AltInterruptn, 其 中 n 为 向 量 编 号 。 因此 , C 标 识 符 _AltInterrupt45 到 _AltInterrupt53 被 编 译 器 保 留 。中 断 , 就 其 本 质 来 说 , 在 不 可 预 测 的 时 刻 发 生 。 因 此 , 被 中 断 的 代 码 必 须 能 以 与 中 断发 生 时 相 同 的 机 器 状 态 继 续 执 行 。为 正 确 处 理 中 断 返 回 , 中 断 函 数 的 设 置 (prologue) 代 码 自 动 在 堆 栈 中 保 护 编 译 器 管理 的 工 作 寄 存 器 和 特 殊 功 能 寄 存 器 , 以 便 在 ISR 末 尾 恢 复 这 些 寄 存 器 内 容 。 可 使 用interrupt 属 性 的 可 选 save 参 数 指 定 要 保 护 和 恢 复 的 其 他 变 量 和 特 殊 功 能 寄 存 器 。在 某 些 应 用 中 , 可 能 需 要 在 中 断 服 务 程 序 中 , 在 编 译 器 生 成 的 函 数 prologue 前 插 入 汇编 语 句 。 例 如 , 在 中 断 服 务 程 序 的 入 口 可 能 需 要 递 增 一 个 信 号 。 可 以 这 样 来 实 现 :void__attribute__((__interrupt__(__preprologue__("inc _semaphore"))))isr0(void);DS51284C_CN 第 92 页© 2005 Microchip Technology Inc.


中 断7.6 中 断 响 应 时 间7.7 中 断 嵌 套7.8 使 能 / 禁 止 中 断有 两 个 因 素 影 响 中 断 源 发 生 到 执 行 ISR 代 码 第 一 条 指 令 之 间 的 周 期 数 。 这 两 个 因 素是 :• 处 理 器 处 理 中 断 时 间 — 处 理 器 识 别 中 断 并 跳 转 到 中 断 向 量 第 一 个 地 址 的 时 间 。 这个 值 与 具 体 器 件 和 所 使 用 中 断 源 有 关 , 为 确 定 这 个 值 的 大 小 , 请 参 考 相 应 器 件 的 数据 手 册 。• ISR 代 码 — MPLAB <strong>C30</strong> 在 ISR 中 保 存 它 使 用 的 寄 存 器 , 这 包 括 工 作 寄 存 器 和RCOUNT 特 殊 功 能 寄 存 器 。 而 且 , 如 果 ISR 调 用 一 个 普 通 的 函 数 , 编 译 器 要 保 存所 有 的 工 作 寄 存 器 和 RCOUNT, 即 使 在 ISR 中 没 有 显 式 使 用 这 些 寄 存 器 。 必 须 要保 存 这 些 寄 存 器 , 因 为 一 般 来 说 , 编 译 器 不 知 道 被 调 用 函 数 使 用 了 哪 些 资 源 。dsPI<strong>C30</strong>F 器 件 支 持 中 断 嵌 套 。 由 于 在 ISR 中 将 处 理 器 资 源 保 存 在 堆 栈 中 , 对 嵌 套 ISR的 编 码 与 非 嵌 套 中 断 的 编 码 相 同 。 通 过 清 零 INTCON1 寄 存 器 中 的 NSTDIS 位 ( 嵌 套中 断 禁 止 位 ) 来 使 能 中 断 嵌 套 。 注 意 这 是 默 认 设 置 , 因 为 dsPI<strong>C30</strong>F 器 件 在 复 位 时 是使 能 嵌 套 中 断 的 。 在 中 断 优 先 级 控 制 寄 存 器 (IPCn) 中 , 为 每 个 中 断 源 分 配 了 一 个 优先 级 。 如 果 有 一 个 处 于 等 待 状 态 的 中 断 请 求 (IRQ), 其 优 先 级 等 于 或 高 于 处 理 器 状 态寄 存 器 中 的 (ST 寄 存 器 中 的 CPUPRI 字 段 ) 当 前 处 理 器 优 先 级 , 处 理 器 将 响 应 中断 。可 单 独 禁 止 或 使 能 每 个 中 断 源 。 每 个 IRQ 的 都 有 一 个 中 断 使 能 位 位 于 中 断 使 能 控 制 寄存 器 (IECn) 中 。 将 中 断 使 能 位 置 1 将 使 能 相 应 的 中 断 ; 将 中 断 使 能 位 清 零 将 禁 止 相应 的 中 断 。 dsPIC 器 件 复 位 时 , 所 有 中 断 使 能 位 都 被 清 零 。 另 外 , 处 理 器 还 有 一 个 禁止 中 断 指 令 (disable interrupt instruction,DISI), 可 在 指 定 的 指 令 周 期 数 内 禁 止 所 有中 断 。注 : 陷 阱 , 如 地 址 错 误 陷 阱 , 不 能 禁 止 。 只 有 IRQ 是 可 以 被 禁 止 的 。© 2005 Microchip Technology Inc. DS51284C_CN 第 93 页


MPLAB ® <strong>C30</strong> 用 户 指 南可 通 过 行 内 汇 编 可 在 C 程 序 中 使 用 DISI 指 令 。 例 如 下 面 的 行 内 汇 编 语 句 :__asm__ volatile ("disi #16");将 在 源 程 序 中 这 条 语 句 的 所 在 处 发 出 指 定 的 DISI 指 令 。 采 用 这 种 方 式 使 用 DISI 的 一个 缺 点 是 , C 编 程 人 员 不 能 总 是 确 定 C 编 译 器 如 何 将 C 源 代 码 翻 译 为 机 器 指 令 , 因 此可 能 难 以 确 定 DISI 指 令 的 周 期 数 。 通 过 将 要 保 护 的 代 码 放 在 DISI 指 令 对 中 断 的 操 作之 间 , 可 以 解 决 这 个 问 题 。 DISI 指 令 的 第 一 条 指 令 将 周 期 数 设 置 为 最 大 值 , 第 二 条 指令 将 周 期 数 设 置 为 零 。 例 如 ,__asm__ volatile("disi #0x3FFF"); /* disable interrupts *//* ... protected C code ... */__asm__ volatile("disi #0x0000"); /* enable interrupts */另 一 种 可 选 方 案 是 直 接 写 DISCNT 寄 存 器 , 这 在 硬 件 上 和 DISI 指 令 的 作 用 相 同 , 但 对于 C 程 序 具 有 避 免 使 用 行 内 汇 编 的 优 点 。 这 是 需 要 的 , 因 为 在 函 数 中 使 用 行 内 汇 编 时编 译 器 可 能 不 会 执 行 某 些 优 化 。 所 以 可 以 不 使 用 上 面 的 指 令 序 列 , 而 使 用DISICNT = 0x3FFF; /* disable interrupts *//* ... protected C code ... */DISICNT = 0x0000; /* enable interrupts */DS51284C_CN 第 94 页© 2005 Microchip Technology Inc.


第 8 章 汇 编 语 言 和 C 模 块 混 合 编 程MPLAB ® <strong>C30</strong>用 户 指 南8.1 简 介本 章 讲 述 如 何 混 合 使 用 汇 编 语 言 和 C 模 块 。 给 出 了 在 汇 编 代 码 中 使 用 C 变 量 和 函 数 的例 子 , 以 及 在 C 中 使 用 汇 编 变 量 和 函 数 的 例 子 。8.2 主 要 内 容本 章 主 要 讨 论 的 内 容 有 :• 在 汇 编 语 言 中 使 用 C 变 量 和 C 函 数 — 可 对 独 立 的 汇 编 模 块 进 行 汇 编 , 然 后 与 编 译 后的 C 模 块 相 链 接 。• 使 用 行 内 汇 编 — 汇 编 指 令 可 直 接 嵌 入 到 C 代 码 中 。 行 内 汇 编 既 支 持 简 单 的 ( 不 带参 数 的 ) 汇 编 语 句 , 也 支 持 扩 展 的 ( 带 参 数 的 ) 汇 编 语 句 , 其 中 C 变 量 可 作 为 汇编 指 令 的 操 作 数 访 问 。8.3 在 汇 编 语 言 中 使 用 C 变 量 和 C 函 数下 面 的 指 导 原 则 指 明 了 独 立 的 汇 编 模 块 如 何 与 C 模 块 接 口 。• 遵 循 第 4.13 节 “ 寄 存 器 约 定 ” 所 述 的 寄 存 器 约 定 。 尤 其 是 , 寄 存 器 W0-W7 用 于 参数 传 递 。 汇 编 函 数 将 接 收 参 数 , 并 通 过 这 些 寄 存 器 将 参 数 传 递 到 被 调 用 函 数 。• 不 在 中 断 处 理 期 间 调 用 的 函 数 必 须 保 护 寄 存 器 W8-W15。 即 这 些 寄 存 器 的 值 必 须 在被 修 改 前 保 存 并 在 返 回 到 调 用 函 数 前 恢 复 。 使 用 寄 存 器 W0-W7 时 可 不 恢 复 其 值 。• 中 断 函 数 必 须 保 护 所 有 的 寄 存 器 。 不 同 于 一 般 的 函 数 调 用 , 中 断 可 能 发 生 在 程 序 执行 过 程 中 的 任 意 时 刻 。 当 返 回 到 正 常 的 程 序 执 行 时 , 所 有 寄 存 器 的 值 必 须 与 中 断 发生 前 相 同 。• 汇 编 文 件 中 声 明 的 变 量 或 函 数 , 如 果 要 被 任 何 C 源 文 件 引 用 , 应 该 使 用 汇 编 伪 指 令.global 声 明 为 全 局 的 。 外 部 符 号 前 应 至 少 有 一 个 下 划 线 。C 函 数 main 在 汇 编 中命 名 为 _main, 相 反 , 汇 编 符 号 _do_something 在 C 中 引 用 时 为do_something。 在 汇 编 文 件 中 使 用 的 未 声 明 符 号 将 视 为 外 部 定 义 的 。下 面 的 示 例 说 明 了 如 何 在 汇 编 语 言 和 C 中 使 用 变 量 和 函 数 , 而 与 变 量 和 函 数 原 来 是 在哪 里 定 义 的 无 关 。文 件 ex1.c 定 义 了 将 在 汇 编 文 件 中 使 用 的 foo 和 cVariable。 C 文 件 还 说 明 了 如 何调 用 汇 编 函 数 asmFunction, 以 及 如 何 访 问 汇 编 定 义 的 变 量 asmVariable。© 2005 Microchip Technology Inc. DS51284C_CN 第 95 页


MPLAB ® <strong>C30</strong> 用 户 指 南例 8-1:C 和 汇 编 混 合 编 程/*** file: ex1.c*/extern unsigned int asmVariable;extern void asmFunction(void);unsigned int cVariable;void foo(void){asmFunction();asmVariable = 0x1234;}文 件 ex2.s 定 义 了 链 接 应 用 程 序 需 要 使 用 的 asmFunction 和 asmVariable。 汇 编文 件 还 说 明 了 如 何 调 用 C 函 数 foo, 以 及 如 何 访 问 C 定 义 的 变 量 cVariable。;; file: ex2.s;.text.global _asmFunction_asmFunction:mov #0,w0mov w0,_cVariablereturn.global _begin_main:call _fooreturn.bss.global _asmVariable.align 2_asmVariable: .space 2.end在 C 文 件 ex1.c 中 , 使 用 了 标 准 的 extern 关 键 字 声 明 了 对 汇 编 文 件 中 定 义 的 符 号的 外 部 引 用 ; 注 意 汇 编 源 文 件 中 的 asmFunction 或 _asmFunction 是 一 个 void 函数 , 进 行 了 相 应 声 明 。在 汇 编 文 件 ex1.s 中 , 通 过 使 用 .global 汇 编 伪 指 令 , 使 符 号 _asmFunction、_main 和 _asmVariable 全 局 可 见 , 并 可 被 任 何 其 他 源 文 件 访 问 。 仅 引 用 了 符 号_main, 未 进 行 声 明 ; 因 此 , 汇 编 器 将 其 视 为 外 部 引 用 。下 面 的 MPLAB <strong>C30</strong> 示 例 展 示 了 如 何 调 用 带 两 个 参 数 的 汇 编 函 数 。 call1.c 中 的 C 函数 main 调 用 call2.s 中 带 两 个 参 数 的 asmFunction。DS51284C_CN 第 96 页© 2005 Microchip Technology Inc.


汇 编 语 言 和 C 模 块 混 合 编 程8.4 使 用 行 内 汇 编例 8-2:在 C 中 调 用 汇 编 函 数/*** file: call1.c*/extern int asmFunction(int, int);int x;voidmain(void){x = asmFunction(0x100, 0x200);}汇 编 函 数 将 两 个 参 数 相 加 , 并 返 回 结 果 。;; file: call2.s;.global _asmFunction_asmFunction:add w0,w1,w0return.end关 于 C 中 参 数 传 递 的 详 细 描 述 , 请 参 阅 第 4.12.2 节 “ 返 回 值 ”。 在 前 面 的 例 子 中 , 两个 整 型 参 数 通 过 W0 和 W1 寄 存 器 传 递 。 整 型 返 回 结 果 通 过 寄 存 器 W0 传 递 。 对 于 更为 复 杂 的 参 数 列 表 , 可 能 需 要 更 多 不 同 的 寄 存 器 , 且 要 注 意 在 编 写 汇 编 程 序 时 要 遵 循指 导 原 则 。在 C 函 数 中 , 可 使 用 asm 语 句 将 一 行 汇 编 代 码 插 入 到 编 译 器 生 成 的 汇 编 语 句 中 。 行 内汇 编 有 两 种 形 式 : 简 单 的 和 扩 展 的 。在 简 单 形 式 中 , 使 用 下 面 的 语 法 写 汇 编 指 令 :asm ("instruction");其 中 instruction 是 一 个 有 效 的 汇 编 语 言 语 法 结 构 。 如 果 在 ANSI C 程 序 中 写 行 内 汇 编 ,使 用 __asm__ , 而 不 是 asm。注 : 只 能 传 递 一 个 字 符 串 到 简 单 形 式 的 行 内 汇 编 。在 使 用 asm 的 扩 展 汇 编 指 令 中 , 使 用 C 表 达 式 指 定 指 令 的 操 作 数 。 扩 展 行 内 汇 编 的 语法 如 下 :asm("template" [ : [ "constraint"(output-operand) [ , ... ] ][ : [ "constraint"(input-operand) [ , ... ] ][ "clobber" [ , ... ] ]]]);必 须 指 定 汇 编 指 令 template, 并 为 每 个 操 作 数 指 定 操 作 数 constraint 字 符 串 。template 指 定 指 令 助 记 符 , 以 及 操 作 数 的 占 位 符 ( 可 选 )。 constraint 字 符 串 指定 操 作 数 约 束 , 例 如 , 指 定 一 个 操 作 数 必 须 位 于 寄 存 器 中 ( 通 常 是 这 样 的 ), 或 者 操作 数 必 须 为 立 即 值 。MPLAB <strong>C30</strong> 支 持 如 下 约 束 字 母 。© 2005 Microchip Technology Inc. DS51284C_CN 第 97 页


MPLAB ® <strong>C30</strong> 用 户 指 南表 8-1:字 母MPLAB <strong>C30</strong> 支 持 的 约 束 字 母约 束= 表 明 这 个 操 作 数 对 于 这 条 指 令 来 说 是 只 写 的 : 先 前 的 值 被 舍 弃 并 被 输 出 数 据 代替 。+ 表 明 这 个 操 作 数 可 被 指 令 读 和 写 。&表 明 这 个 操 作 数 是 一 个 earlyclobber 操 作 数 , 在 指 令 使 用 完 输 入 操 作 数 之 前被 修 改 了 。 因 此 , 这 个 操 作 数 不 能 存 放 在 用 作 输 入 操 作 数 或 任 何 存 储 器 地 址 一 部分 的 寄 存 器 中 。g 允 许 任 何 寄 存 器 、 存 储 区 或 立 即 整 型 操 作 数 , 不 是 一 般 寄 存 器 的 寄 存 器 除 外 。i允 许 ( 具 有 常 数 值 的 ) 立 即 整 型 操 作 数 。 这 包 括 其 值 仅 在 汇 编 时 已 知 的 符 号 常量 。r 允 许 寄 存 器 操 作 数 , 前 提 是 寄 存 器 要 为 一 般 寄 存 器 。0, 1, … ,9允 许 与 指 定 操 作 数 编 号 匹 配 的 操 作 数 。 如 果 在 同 一 选 择 中 , 数 字 和 字 母 一 起 使用 , 应 把 数 字 放 在 后 面 。T near 或 far 数 据 操 作 数 。U near 数 据 操 作 数 。例 如 , 下 面 的 语 句 说 明 了 如 何 使 用 dsPIC 器 件 的 swap 指 令 ( 编 译 器 一 般 不 使 用 这 条指 令 ):asm ("swap %0" : "+r"(var));其 中 var 是 操 作 数 的 C 表 达 式 , 同 时 为 输 入 操 作 数 和 输 出 操 作 数 。 该 操 作 数 约 束 为 类型 r, 表 示 为 寄 存 器 操 作 数 。 +r 中 的 + 表 明 该 操 作 数 既 是 输 入 操 作 数 , 也 是 输 出 操作 数 。每 个 操 作 数 都 通 过 操 作 数 约 束 字 符 串 , 后 跟 括 在 括 号 中 的 C 表 达 式 来 描 述 。 冒 号 将 汇编 模 板 与 第 一 个 输 出 操 作 数 分 隔 开 , 另 外 一 个 冒 号 将 最 后 一 个 输 出 操 作 数 和 第 一 个 输入 操 作 数 分 隔 开 ( 如 果 存 在 的 话 )。 逗 号 分 隔 开 各 输 出 操 作 数 和 各 输 入 操 作 数 。如 果 没 有 输 出 操 作 数 , 有 输 入 操 作 数 , 那 么 在 输 出 操 作 数 的 两 边 必 须 有 两 个 连 续 的 逗号 。 编 译 器 要 求 输 出 操 作 数 表 达 式 必 须 为 左 值 。 输 入 操 作 数 不 必 为 左 值 。 编 译 器 不 能检 查 出 操 作 数 是 否 具 有 对 于 正 在 执 行 指 令 合 理 的 数 据 类 型 。 它 不 解 析 汇 编 指 令 模 板 ,不 知 道 其 含 义 , 或 者 是 否 是 有 效 的 汇 编 输 入 。 扩 展 的 asm 功 能 经 常 用 于 编 译 器 本 身 不知 道 其 存 在 的 机 器 指 令 。 如 果 不 能 对 输 出 表 达 式 直 接 寻 址 ( 例 如 它 是 一 个 位 域 ), 那么 约 束 必 须 允 许 寄 存 器 。 在 这 种 情 况 下 , MPLAB <strong>C30</strong> 将 使 用 寄 存 器 作 为 asm 的 输出 , 然 后 将 该 寄 存 器 的 值 存 储 到 输 出 。 如 果 输 出 操 作 数 是 只 写 的 , MPLAB <strong>C30</strong> 将 假定 执 行 指 令 之 前 这 些 操 作 数 中 的 值 是 不 变 的 值 , 不 需 要 输 出 。某 些 指 令 会 破 坏 特 定 硬 件 寄 存 器 的 值 。 为 说 明 这 一 点 , 在 输 入 操 作 数 后 写 第 三 个 逗 号 ,后 跟 被 破 坏 的 硬 件 寄 存 器 的 名 字 ( 作 为 字 符 串 给 出 , 中 间 用 逗 号 隔 开 )。 下 面 是dsPIC 器 件 的 一 个 例 子 :asm volatile ("mul.b %0": /* no outputs */: "U" (nvar): "w2");DS51284C_CN 第 98 页© 2005 Microchip Technology Inc.


汇 编 语 言 和 C 模 块 混 合 编 程在 这 个 例 子 中 , 由 于 指 定 了 “U” 约 束 , 操 作 数 nvar 是 声 明 到 near 数 据 空 间 的 字 符变 量 。 如 果 汇 编 指 令 可 能 修 改 标 志 ( 条 件 代 码 ) 寄 存 器 , 添 加 “cc” 到 被 破 坏 寄 存 器的 列 表 。 如 果 汇 编 指 令 以 不 可 预 估 的 方 式 修 改 存 储 器 , 添 加 “memory” 到 被 破 坏 寄存 器 的 列 表 。 这 将 使 MPLAB <strong>C30</strong> 不 跨 汇 编 指 令 保 存 存 储 在 寄 存 器 中 的 存 储 器 值 。可 以 在 一 个 asm 模 板 中 放 多 条 汇 编 指 令 , 中 间 用 换 行 ( 写 \n) 分 隔 开 。 输 入 操 作 数和 输 出 操 作 数 的 地 址 保 证 不 会 使 用 任 何 被 破 坏 的 寄 存 器 , 所 以 可 以 任 意 多 次 读 和 写 被破 坏 的 寄 存 器 。 下 面 是 在 一 个 模 板 中 有 多 条 指 令 的 例 子 ; 它 假 定 子 程 序 _foo 接 受 寄存 器 W0 和 W1 中 的 参 数 :asm ("mov %0,w0\nmov %1,W1\ncall _foo": /* no outputs */: "g" (a), "g" (b): "W0", "W1");在 这 个 例 子 中 , 约 束 字 符 串 “g” 表 明 一 个 普 通 操 作 数 。 假 定 在 产 生 输 出 之 前 使 用 了输 入 , MPLAB <strong>C30</strong> 可 能 将 输 出 分 配 到 无 关 的 输 入 操 作 数 存 放 的 寄 存 器 , 除 非 输 出 操作 数 有 & 约 束 修 饰 符 。 如 果 汇 编 代 码 实 际 上 包 含 多 条 指 令 , 这 个 假 定 可 能 是 错 误 的 。在 这 种 情 况 下 , 对 每 个 输 出 操 作 数 使 用 & , 不 会 与 输 入 操 作 数 重 叠 。 例 如 , 考 虑 下 面的 函 数 :intexprbad(int a, int b){int c;__asm__("add %1,%2,%0\n sl %0,%1,%0": "=r"(c) : "r"(a), "r"(b));return(c);}这 个 函 数 的 目 的 是 计 算 值 (a + b)


MPLAB ® <strong>C30</strong> 用 户 指 南当 汇 编 指 令 有 一 个 读 — 写 操 作 数 , 或 者 有 一 个 仅 某 些 位 将 被 修 改 的 操 作 数 时 , 必 须 在逻 辑 上 将 其 功 能 拆 分 为 两 个 独 立 的 操 作 数 : 一 个 是 输 入 操 作 数 , 一 个 是 只 写 输 出 操 作数 。 这 两 个 操 作 数 之 间 的 关 系 由 指 明 执 行 指 令 时 两 个 操 作 数 需 要 在 同 一 地 址 的 约 束 表明 。 可 对 两 个 操 作 数 使 用 相 同 的 或 不 同 的 C 表 达 式 。 例 如 , 下 面 的 add 指 令 中 , bar作 为 只 读 源 操 作 数 , foo 作 为 读 — 写 目 标 操 作 数 :asm ("add %2,%1,%0": "=r" (foo): "0" (foo), "r" (bar));操 作 数 1 的 约 束 “0” 表 明 该 操 作 数 必 须 与 操 作 数 0 占 用 相 同 的 地 址 。 仅 允 许 在 输 入操 作 数 的 约 束 中 使 用 数 字 , 并 且 必 须 指 向 输 出 操 作 数 。 约 束 中 只 有 数 字 可 保 证 一 个 操作 数 将 和 另 一 个 操 作 数 存 放 在 同 一 地 址 。 foo 是 两 个 操 作 数 的 值 并 不 足 以 保 证 两 个 操作 数 在 生 成 的 汇 编 代 码 中 位 于 相 同 的 地 址 。 下 面 的 代 码 可 以 做 到 这 一 点 :asm ("add %2,%1,%0": "=r" (foo): "r" (foo), "r" (bar));各 种 优 化 和 重 载 可 能 导 致 操 作 数 0 和 操 作 数 1 位 于 不 同 的 寄 存 器 中 。 例 如 , 编 译 器 可能 在 一 个 寄 存 器 中 找 到 foo 的 值 的 一 个 拷 贝 , 将 这 个 寄 存 器 用 于 操 作 数 1, 但 是 在 另一 个 寄 存 器 中 生 成 了 输 出 操 作 数 0 ( 将 其 拷 贝 到 foo 自 身 地 址 的 后 面 )。还 可 以 使 用 可 在 汇 编 代 码 模 板 内 引 用 的 符 号 名 来 指 定 输 入 和 输 出 操 作 数 。 这 些 符 号 名在 约 束 字 符 串 前 的 方 括 号 内 指 定 , 可 使 用 %[name] ( 而 不 是 百 分 号 加 操 作 数 编 号 ) 在汇 编 代 码 模 板 内 引 用 。 使 用 指 定 的 操 作 数 , 上 面 的 例 子 可 编 码 如 下 :asm ("add %[foo],%[bar],%[foo]": [foo] "=r" (foo): "0" (foo), [bar] "r" (bar));通 过 在 asm 后 写 关 键 字 volatile, 可 禁 止 asm 指 令 被 删 除 、 明 显 移 动 或 组 合 。 例如 :#define disi(n) \asm volatile ("disi #%0" \: /* no outputs */ \: "i" (n))在 这 个 例 子 中 , 约 束 字 母 “i” 表 示 disi 指 令 要 求 的 立 即 操 作 数 。DS51284C_CN 第 100 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南附 录 A 实 现 定 义 的 操 作A.1 简 介本 章 讲 述 MPLAB <strong>C30</strong> 实 现 定 义 的 操 作 。 C 的 ISO 标 准 要 求 各 厂 商 提 供 关 于 语 言 的“ 实 现 定 义 ” 细 节 方 面 的 文 档 。本 章 讲 述 的 主 要 内 容 有 :• 翻 译• 环 境• 标 识 符• 字 符• 整 型• 浮 点 型• 数 组 和 指 针• 寄 存 器• 结 构 、 联 合 、 枚 举 和 位 域• 限 定 符• 声 明 符• 语 句• 预 处 理 伪 指 令• 库 函 数• 信 号• 流 和 文 件• tmpfile• errno• 存 储 区• abort• exit• getenv• system• strerror© 2005 Microchip Technology Inc. DS51284C_CN 第 101 页


MPLAB ® <strong>C30</strong> 用 户 指 南A.2 翻 译A.3 环 境翻 译 的 实 现 定 义 在 ANSI C 标 准 的 G.3.1 章 节 中 有 详 细 介 绍 。是 否 空 白 字 符 ( 换 行 符 除 外 ) 的 每 个 非 空 序 列 都 被 保 留 了 , 或 者 它 被 一 个 空 格 字 符 替代 ? (ISO 5.1.1.2)它 被 一 个 空 格 字 符 替 代 。如 何 标 识 一 个 诊 断 消 息 ? (ISO 5.1.1.3)诊 断 消 息 是 通 过 用 与 消 息 对 应 的 源 文 件 名 和 行 号 为 前 缀 来 标 识 的 , 用 冒 号 (“:”) 分隔 开 。是 否 存 在 不 同 种 类 的 消 息 ? (ISO 5.1.1.3)是 的 。如 果 是 , 都 有 哪 些 消 息 ? (ISO 5.1.1.3)错 误 消 息 , 禁 止 产 生 输 出 文 件 ; 警 告 消 息 , 不 禁 止 输 出 文 件 的 生 成 。翻 译 器 对 于 每 种 消 息 返 回 什 么 状 态 代 码 ?对 于 错 误 消 息 , 返 回 状 态 码 1 ; 对 于 警 告 消 息 , 返 回 状 态 码 0。可 以 控 制 诊 断 的 级 别 吗 ?是 的 。如 果 是 , 那 么 控 制 会 采 用 什 么 形 式 ?可 使 用 编 译 器 命 令 行 选 项 来 请 求 或 禁 止 警 告 消 息 的 产 生 。环 境 的 实 现 定 义 在 ANSI C 标 准 的 G.3.2 章 节 中 有 详 细 介 绍 。哪 些 库 函 数 可 供 独 立 的 程 序 使 用 ? (ISO 5.1.2.1)标 准 C 函 数 库 的 所 有 函 数 都 可 使 用 , 只 要 为 环 境 定 制 了 一 小 组 函 数 , 这 在 “ 运 行 时 函数 库 ” 章 节 中 有 详 细 介 绍 。描 述 一 下 在 独 立 环 境 中 的 程 序 终 止 。如 果 主 函 数 返 回 或 者 调 用 了 函 数 退 出 , 会 在 无 限 循 环 内 执 行 HALT 指 令 。 这 种 操 作 用户 是 可 以 自 定 义 的 。描 述 一 下 传 递 到 main 函 数 的 参 数 ? (ISO 5.1.2.2.1)没 有 参 数 传 递 到 main 函 数 。判 断 以 下 是 否 是 合 法 的 交 互 设 备 :(ISO 5.1.2.3)异 步 终 端 不 是显 示 器 和 键 盘 不 是程 序 间 连 接 不 是其 他 ? 请 描 述 没 有DS51284C_CN 第 102 页© 2005 Microchip Technology Inc.


实 现 定 义 的 操 作A.4 标 识 符标 识 符 的 实 现 定 义 在 ANSI C 标 准 的 G.3.3 章 节 中 有 详 细 介 绍 。在 没 有 外 部 链 接 的 标 识 符 中 , 除 31 个 字 符 外 , 有 多 少 字 符 是 有 效 的 ? (ISO 6.1.2)所 有 字 符 都 是 有 效 的 。在 有 外 部 链 接 的 标 识 符 中 , 除 6 个 字 符 外 , 有 多 少 字 符 是 有 效 的 ? (ISO 6.1.2)所 有 字 符 都 是 有 效 的 。对 于 有 外 部 链 接 的 标 识 符 中 , 是 否 区 分 大 小 写 ? ( ISO 6.1.2)是 的 。A.5 字 符字 符 的 实 现 定 义 在 ANSI C 标 准 的 G.3.4 章 节 中 有 详 细 介 绍 。请 详 述 标 准 未 明 确 指 定 的 任 何 源 字 符 和 执 行 字 符 。(ISO 5.2.1)无 。列 出 所 列 出 序 列 产 生 的 转 义 序 列 值 。 (ISO 5.2.2)表 A-1:转 义 序 列 字 符 及 其 值序 列值\a 7\b 8\f 12\n 10\r 13\t 9\v 11执 行 字 符 集 中 的 一 个 字 符 中 有 多 少 位 ? (ISO 5.2.4.2)8 位 。源 字 符 集 ( 字 符 和 字 符 串 ) 中 的 元 素 到 执 行 字 符 集 中 元 素 的 映 射 是 什 么 ?(ISO 6.1.3.4)identity 函 数 。无 符 号 说 明 的 char 的 等 价 类 型 是 什 么 ? (ISO 6.2.1.1)都 可 以 ( 由 用 户 定 义 )。 默 认 等 价 类 型 为 signed char。 可 使 用 一 个 编 译 器 命 令 行 选项 来 使 默 认 类 型 变 为 unsigned char。© 2005 Microchip Technology Inc. DS51284C_CN 第 103 页


MPLAB ® <strong>C30</strong> 用 户 指 南A.6 整 型整 型 的 实 现 定 义 在 ANSI C 标 准 的 G.3.5 章 节 中 有 详 细 介 绍 。下 面 列 出 了 各 种 整 型 的 长 度 及 其 范 围 :(ISO 6.1.2.5)表 A-2:将 一 个 整 型 转 换 为 较 短 的 有 符 号 整 型 , 或 者 将 一 个 无 符 号 整 型 转 换 为 相 同 长 度 的 有 符号 整 型 , 如 果 不 能 表 示 值 , 结 果 怎 样 ? (ISO 6.2.1.2)会 丢 失 有 效 位 。 不 会 发 出 错 误 。对 有 符 号 整 型 进 行 位 操 作 的 结 果 是 什 么 ? (ISO 6.3)移 位 操 作 符 保 留 符 号 。 其 他 操 作 符 象 对 无 符 号 整 型 进 行 位 操 作 一 样 , 对 有 符 号 整 型 进行 位 操 作 。整 型 除 法 中 余 数 的 符 号 是 什 么 ? (ISO 6.3.5)+。负 值 有 符 号 整 型 右 移 的 结 果 是 什 么 ? (ISO 6.3.7)保 留 符 号 。整 型数 据 类 型 长 度 ( 位 数 ) 范 围char 8 -128 … 127signed char 8 -128 … 127unsigned char 8 0 … 255short 16 -32768 … 32767signed short 16 -32768 … 32767unsigned short 16 0 … 65535int 16 -32768 … 32767signed int 16 -32768 … 32767unsigned int 16 0 … 65535long 32 -2147483648 … 2147438647signed long 32 -2147483648 … 2147438647unsigned long 32 0 … 4294867295A.7 浮 点 型浮 点 型 的 实 现 定 义 在 ANSI C 标 准 的 G.3.6 中 讲 述 。在 浮 点 型 的 可 表 示 值 范 围 内 的 浮 点 型 常 量 定 标 值 , 是 最 相 近 的 可 表 示 值 ? 还 是 与 之 相邻 且 大 于 它 的 可 表 示 值 ? 还 是 与 之 相 邻 且 小 于 它 的 可 表 示 值 ? (ISO 6.1.3.1)最 相 近 的 可 表 示 值 。DS51284C_CN 第 104 页© 2005 Microchip Technology Inc.


实 现 定 义 的 操 作下 表 给 出 了 浮 点 数 的 各 种 类 型 三 长 度 及 其 范 围 :(ISO 6.1.2.5)A.8 数 组 和 指 针表 A-3:将 整 型 数 转 化 为 浮 点 数 , 而 浮 点 数 不 能 精 确 地 表 示 原 来 的 值 时 , 截 取 方 向 如 何 ?(ISO 6.2.1.3)向 下 截 取 。当 将 一 个 浮 点 数 转 化 为 较 短 的 浮 点 数 时 , 截 取 或 舍 入 方 向 如 何 ? (ISO 6.2.1.4)向 下 截 取 或 舍 入 。数 组 和 指 针 的 实 现 定 义 在 ANSI C 标 准 的 G.3.7 章 节 中 讲 述 。保 存 数 组 最 大 长 度 所 需 的 整 型 , 即 操 作 符 长 度 size_t 的 类 型 是 什 么 ? (ISO 6.3.3.4,ISO 7.1.1)unsigned int。将 指 针 转 化 为 整 型 所 需 要 的 整 型 的 长 度 ? (ISO 6.3.4)16 位 。浮 点 型数 据 类 型 长 度 ( 位 ) 范 围float 32 1.175494e-38 … 3.40282346e+38double* 32 1.175494e-38 … 3.40282346e+38long double 64 2.22507385e-308 … 1.79769313e+308* 如 果 使 用 了 -fno-short-double, double 与 long double 等 价 。将 指 针 强 制 转 换 为 整 型 或 反 之 的 结 果 是 什 么 ? (ISO 6.3.4)映 射 为 identity 函 数 。保 存 指 向 同 一 数 组 的 元 素 的 两 个 指 针 之 间 的 区 别 所 需 的 整 型 ptrdiff_t? (ISO6.3.6, ISO 7.1.1)unsigned int。A.9 寄 存 器寄 存 器 的 实 现 定 义 在 ANSI C 标 准 的 G.3.8 章 节 中 讲 述 。存 储 类 别 修 饰 符 register 实 际 上 在 多 大 程 度 上 影 响 将 对 象 存 储 在 寄 存 器 中 ? (ISO6.5.1)如 果 禁 止 优 化 , 指 定 register 存 储 类 别 ; 否 则 忽 略 这 个 修 饰 符 。© 2005 Microchip Technology Inc. DS51284C_CN 第 105 页


MPLAB ® <strong>C30</strong> 用 户 指 南A.10 结 构 、 联 合 、 枚 举 和 位 域结 构 、 联 合 、 枚 举 和 位 域 的 实 现 定 义 在 ANSI C 标 准 的 A.6.3.9 和 G.3.9 章 节 中 讲 述 。如 果 联 合 对 象 中 的 一 个 成 员 被 一 个 不 同 类 型 的 成 员 访 问 结 果 如 何 ? (ISO 6.3.2.3)不 进 行 转 换 。描 述 一 下 结 构 的 成 员 的 填 充 和 对 齐 ? (ISO 6.5.2.1)字 符 是 字 节 对 齐 的 。 所 有 其 他 对 象 是 字 对 齐 的 。无 符 号 说 明 的 int 位 域 的 等 价 类 型 是 什 么 ? (ISO 6.5.2.1)由 用 户 定 义 。 默 认 情 况 下 是 signed int 位 域 。 可 使 用 一 个 命 令 行 选 项 使 等 价 类 型 变为 unsigned int 位 域 。一 个 int 中 位 域 的 分 配 顺 序 如 何 ? (ISO 6.5.2.1)位 以 自 低 位 向 高 位 的 顺 序 分 配 。位 域 能 否 跨 越 存 储 单 元 边 界 ? (ISO 6.5.2.1)能 。选 择 哪 个 整 型 来 表 示 枚 举 类 型 的 值 ? (ISO 6.5.2.2)int。A.11 限 定 符A.12 声 明 符A.13 语 句限 定 符 的 实 现 定 义 在 ANSI C 标 准 的 G.3.10 章 节 中 讲 述 。描 述 一 下 什 么 操 作 构 成 对 具 有 volatile 限 定 类 型 的 对 象 的 访 问 ? (ISO 6.5.3)如 果 在 一 个 表 达 式 中 指 定 了 一 个 对 象 , 则 它 已 经 被 访 问 了 。声 明 符 的 实 现 定 义 在 ANSI C 标 准 的 G.3.11 章 节 中 讲 述 。可 修 改 算 术 、 结 构 或 联 合 类 型 的 声 明 符 的 最 大 数 目 ? (ISO 6.5.4)没 有 限 制 。语 句 的 实 现 定 义 在 ANSI C 标 准 的 G.3.12 章 节 中 讲 述 。switch 语 句 中 case 值 的 最 大 值 是 多 少 ? (ISO 6.6.4.2)没 有 限 制 。DS51284C_CN 第 106 页© 2005 Microchip Technology Inc.


实 现 定 义 的 操 作A.14 预 处 理 伪 指 令预 处 理 伪 指 令 的 实 现 定 义 在 ANSI C 标 准 的 G.3.13 章 节 中 讲 述 。控 制 条 件 包 含 的 条 件 表 达 式 中 的 单 字 符 字 符 常 量 的 值 是 否 与 执 行 字 符 集 中 的 同 一 字 符常 量 相 符 ? (ISO 6.8.1)是 的 。这 种 字 符 常 量 可 以 有 负 值 吗 ? (ISO 6.8.1)是 的 。可 使 用 什 么 方 法 来 定 位 可 包 含 源 文 件 ? (ISO 6.8.2)预 处 理 器 搜 索 当 前 目 录 , 然 后 搜 索 使 用 命 令 行 选 项 指 定 的 目 录 。头 文 件 如 何 标 识 ? 其 位 置 如 何 指 定 ? (ISO 6.8.2)头 文 件 通 过 #include 伪 指 令 标 识 , 括 在 < 和 > 分 隔 符 之 间 , 或 者 “ 和 ” 分 隔 符 之间 。 使 用 命 令 行 选 项 指 定 其 位 置 。可 将 可 包 含 源 文 件 的 名 字 用 引 号 括 起 来 吗 ? (ISO 6.8.2)是 的 。分 隔 的 字 符 序 列 和 外 部 源 文 件 名 之 间 的 映 射 是 什 么 ? (ISO 6.8.2)identity 函 数 。描 述 一 下 可 识 别 的 #pragma 伪 指 令 的 操 作 。(ISO 6.8.6)表 A-4:#PRAGMA 操 作Pragma操 作#pragma code section-name 命 名 代 码 段 。#pragma code将 代 码 段 名 重 设 为 默 认 段 名 ( 即 .text)。#pragma idata section-name 命 名 已 初 始 化 的 数 据 段 。#pragma idata将 已 初 始 化 的 数 据 段 名 重 设 为 其 默 认 值( 即 .data)。#pragma udata section-name 命 名 未 初 始 化 的 数 据 段 。#pragma udata将 未 初 始 化 的 数 据 段 名 重 设 为 其 默 认 值( 即 .bss)。#pragma interrupt将 函 数 名 指 定 为 中 断 函 数 。function-name当 没 有 转 换 的 日 期 和 时 间 时 ,__ DATE __ 和 __ TIME __ 的 定 义 分 别 是 什 么 ? (ISO6.8.8)不 适 用 。 在 没 有 这 些 函 数 的 环 境 中 不 支 持 编 译 器 。© 2005 Microchip Technology Inc. DS51284C_CN 第 107 页


MPLAB ® <strong>C30</strong> 用 户 指 南A.15 库 函 数库 函 数 的 实 现 定 义 在 ANSI C 标 准 的 G.3.14 章 节 中 讲 述 。宏 NULL 扩 展 到 的 空 指 针 常 量 是 什 么 ? (ISO 7.1.5)0。是 如 何 识 别 assert 函 数 打 印 的 诊 断 消 息 的 , 函 数 是 如 何 终 止 的 ? (ISO 7.2)assert 函 数 打 印 文 件 名 、 行 号 和 检 测 表 达 式 , 中 间 用 冒 号 字 符 (“:”) 分 割 开 。 然 后调 用 abort 函 数 。通 过 isalnum、isalpha、scntrl、islower、isprint 和 isupper 函 数 检 测 哪 些 字 符 ? (ISO7.3.1)表 A-5:函 数IS 函 数 检 测 的 字 符检 测 的 字 符isalnum 一 个 字 母 或 数 字 :isalpha 或 isdigit。isalpha 一 个 字 母 :islower 或 isupper。iscntrl 五 个 标 准 运 动 控 制 字 符 、 退 格 和 警 告 字 符 之 一 :\f、 \n、 \r、 \t、 \v、\b 和 \a。islower “a” 到 “z” 中 的 一 个 字 母 。isprint 图 形 字 符 或 空 格 字 符 :isalnum、 ispunct 或 space。isupper “A” 到 “Z” 中 的 一 个 字 母 。ispunct 下 述 字 符 之 一 :! " # % & ' ( ) ; < = > ? [ \ ] * + , - . / : ^。定 义 域 错 误 后 , 数 学 函 数 返 回 什 么 值 ?(ISO 7.5.1)NaN。出 现 下 溢 范 围 错 误 时 , 数 学 函 数 将 整 型 表 达 式 errno 设 置 为 宏 ERANGE 的 值 吗 ?(ISO 7.5.1)是 的 。当 fmod 函 数 有 第 一 个 为 零 的 参 数 时 , 会 出 现 定 义 域 错 误 还 是 返 回 零 ? (ISO7.5.6.4)定 义 域 错 误 。DS51284C_CN 第 108 页© 2005 Microchip Technology Inc.


实 现 定 义 的 操 作A.16 信 号列 出 signal 函 数 的 信 号 集 。(ISO 7.7.1.1)表 A-6:名 称信 号 函 数描 述SIGABRT 异 常 终 止 。SIGINT 接 收 到 交 互 注 意 信 号 。SIGILL 检 测 到 无 效 函 数 映 象 。SIGFPE 错 误 的 算 术 运 算 。SIGSEGV 对 存 储 的 无 效 访 问 。SIGTERM 发 送 到 程 序 的 终 止 请 求 。描 述 一 下 signal 函 数 识 别 的 每 个 信 号 的 使 用 及 其 参 数 。(ISO 7.7.1.1)由 应 用 定 义 。描 述 一 下 signal 函 数 识 别 的 每 个 信 号 在 程 序 启 动 时 的 默 认 处 理 和 处 理 ?(ISO 7.7.1.1)无 。在 调 用 信 号 处 理 程 序 之 前 , 如 果 没 有 执 行 信 号 的 等 价 (sig,SIG_DFL), 执 行 什 么 信 号阻 塞 ? (ISO 7.7.1.1)无 。如 果 为 signal 函 数 指 定 的 处 理 程 序 接 收 到 SIGILL 信 号 , 默 认 的 处 理 被 复 位 吗 ? (ISO7.7.1.1)不 。A.17 流 和 文 件文 本 流 的 最 后 一 行 需 要 一 个 终 止 换 行 符 吗 ? (ISO 7.9.2)不 需 要 。当 读 回 流 时 , 会 出 现 写 到 紧 接 着 换 行 符 之 前 的 文 本 流 的 空 格 符 吗 ? (ISO 7.9.2)是 的 。可 向 写 到 二 进 制 流 的 数 据 附 加 多 少 个 空 字 符 ?(ISO 7.9.2)无 。附 加 模 式 流 的 文 件 位 置 指 示 符 最 初 是 放 在 文 件 的 开 始 还 是 结 束 ? (ISO 7.9.3)开 始 。写 文 本 流 会 导 致 该 点 之 后 的 相 关 文 件 被 截 取 吗 ? (ISO 7.9.3)由 应 用 定 义 。描 述 一 下 文 件 缓 冲 的 特 征 。(ISO 7.9.3)全 缓 冲 。零 长 度 的 文 件 实 际 上 存 在 吗 ? (ISO 7.9.3)是 的 。© 2005 Microchip Technology Inc. DS51284C_CN 第 109 页


MPLAB ® <strong>C30</strong> 用 户 指 南A.18 TMPFILE组 成 有 效 文 件 名 的 规 则 是 什 么 ? (ISO 7.9.3)由 应 用 定 义 。相 同 的 文 件 可 打 开 多 次 吗 ? (ISO 7.9.3)由 应 用 定 义 。remove 函 数 对 一 个 打 开 文 件 有 什 么 影 响 ? (ISO 7.9.4.1)由 应 用 定 义 。如 果 在 调 用 rename 函 数 之 前 存 在 有 新 名 字 的 函 数 , 会 有 什 么 影 响 (ISO 7.9.4.2)由 应 用 定 义 。fprintf 函 数 中 %p 转 换 的 输 出 形 式 如 何 ? (ISO 7.9.6.1)十 六 进 制 标 识 。fscanf 函 数 中 %p 转 换 的 输 入 形 式 如 何 ? (ISO 7.9.6.2)十 六 进 制 标 识 。如 果 程 序 异 常 终 止 , 打 开 的 临 时 文 件 会 被 删 除 吗 ? (ISO 7.9.4.3)是 的 。A.19 ERRNOA.20 存 储 器A.21 ABORTA.22 EXIT失 败 时 , 宏 errno 被 fgetpos 或 ftell 函 数 设 置 为 什 么 值 ?(ISO 7.9.9.1, ISO 7.9.9.4)由 应 用 定 义 。perror 函 数 生 成 的 消 息 的 格 式 如 何 ? (ISO 7.9.10.4)perror 的 参 数 , 后 跟 一 个 冒 号 , 然 后 是 值 errno 的 文 本 描 述 。如 果 请 求 的 长 度 为 零 , calloc、 malloc 或 realloc 函 数 如 何 操 作 ?(ISO 7.10.3)分 配 一 个 零 长 度 的 块 。调 用 abort 函 数 时 , 对 打 开 的 临 时 文 件 有 什 么 影 响 ? (ISO 7.10.4.1)没 有 影 响 。如 果 参 数 的 值 不 是 零 、 EXIT_SUCCESS 或 EXIT_FAILURE 函 数 返 回 的 状 态 如 何 ?(ISO 7.10.4.3)参 数 的 值 。DS51284C_CN 第 110 页© 2005 Microchip Technology Inc.


实 现 定 义 的 操 作A.23 GETENV对 环 境 名 有 什 么 限 制 ? (ISO 7.10.4.4)由 应 用 定 义 。描 述 一 下 用 于 改 变 调 用 getenv 函 数 获 得 的 环 境 列 表 的 方 法 。(ISO 7.10.4.4)由 应 用 定 义 。A.24 系 统描 述 传 递 到 系 统 函 数 的 字 符 串 的 格 式 。(ISO 7.10.4.5)由 应 用 定 义 。系 统 函 数 执 行 什 么 执 行 模 式 ? (ISO 7.10.4.5)由 应 用 定 义 。A.25 STRERROR描 述 由 strerror 函 数 输 出 的 错 误 消 息 的 格 式 。(ISO 7.11.6.2)不 带 符 号 说 明 的 字 符 串 。列 出 对 strerror 函 数 的 调 用 返 回 的 错 误 消 息 的 内 容 。(ISO 7.11.6.2)表 A-7:errno错 误 消 息 字 符 串消 息0 没 有 错 误EDOM定 义 域 错 误ERANGE范 围 错 误EFPOS文 件 定 位 错 误EFOPEN文 件 打 开 错 误nnn错 误 #nnn© 2005 Microchip Technology Inc. DS51284C_CN 第 111 页


MPLAB ® <strong>C30</strong> 用 户 指 南注 :DS51284C_CN 第 112 页© 2005 Microchip Technology Inc.


附 录 B MPLAB <strong>C30</strong> C 编 译 器 诊 断MPLAB ® <strong>C30</strong>用 户 指 南B.1 简 介本 附 录 列 出 了 MPLAB <strong>C30</strong> 编 译 器 产 生 的 最 常 见 的 诊 断 消 息 。MPLAB <strong>C30</strong> 编 译 器 能 产 生 两 种 诊 断 消 息 : 错 误 和 警 告 , 每 种 消 息 有 不 同 的 作 用 :• 如 果 产 生 错 误 , 说 明 程 序 不 能 通 过 编 译 。 在 MPLAB <strong>C30</strong> 编 译 器 报 告 的 错 误 中 , 包含 出 错 的 源 文 件 名 和 行 号 。• 如 果 产 生 警 告 , 虽 然 这 时 编 译 能 够 通 过 , 但 说 明 在 代 码 中 还 存 在 一 些 不 规 范 的 用法 , 可 能 有 问 题 。 警 告 也 会 指 出 源 文 件 名 和 行 号 , 但 每 条 消 息 中 含 有“warning:” 文 本 , 这 样 就 可 以 与 错 误 区 分 开 来 。警 告 指 出 了 程 序 中 可 能 存 在 问 题 的 地 方 , 在 这 些 地 方 应 该 确 认 程 序 是 否 真 正 表 达 了 您的 意 图 ; 或 者 确 认 是 否 存 在 无 效 的 用 法 ; 或 者 确 认 是 否 存 在 MPLAB <strong>C30</strong> C 中 不 规 范的 用 法 。 只 要 选 择 了 -W 选 项 中 的 一 种 , 就 会 出 现 许 多 您 所 需 要 的 警 告 ( 比 如 ,-Wall 选 项 就 要 求 多 种 有 用 的 消 息 )。在 极 少 数 情 况 下 , 编 译 器 可 能 发 出 内 部 错 误 消 息 报 告 。 这 表 示 编 译 器 本 身 检 测 到 一 些错 误 , 应 将 错 误 报 告 给 Microchip 的 技 术 支 持 , 具 体 联 系 方 式 在 本 手 册 的 相 应 章 节 可 以找 到 。B.2 错 误符 号\x used with no following HEX digits转 义 序 列 \x 后 应 该 跟 十 六 进 制 数 字 。‘&’ constraint used with no register classasm 语 句 无 效 。‘%’ constraint used with last operandasm 语 句 无 效 。#elif after #else在 预 处 理 器 条 件 编 译 中 , #else 子 句 必 须 出 现 在 任 何 #elif 子 句 之 后 。#elif without #if在 预 处 理 器 条 件 编 译 中 , 必 须 在 使 用 #elif 之 前 使 用 #if。#else after #else在 预 处 理 器 条 件 编 译 中 , #else 子 句 必 须 仅 出 现 一 次 。#else without #if在 预 处 理 器 条 件 编 译 中 , 必 须 在 使 用 #else 之 前 使 用 #if。© 2005 Microchip Technology Inc. DS51284C_CN 第 113 页


MPLAB ® <strong>C30</strong> 用 户 指 南#endif without #if在 预 处 理 条 件 编 译 中 , 必 须 在 使 用 #endif 之 前 使 用 #if 。#error ‘message’出 现 这 条 错 误 消 息 是 对 #error 伪 指 令 的 响 应 。#if with no expression需 要 一 个 求 值 为 常 数 值 的 表 达 式 。#include expects “FILENAME” or #include 缺 少 文 件 名 或 文 件 名 不 完 整 。 必 须 将 其 用 引 号 或 尖 括 号 括 起 来 。‘#’ is not followed by a macro parameter字 符 串 大 小 操 作 符 “#” 必 须 后 跟 一 个 宏 参 数 名 。‘#keyword’ expects “FILENAME” or 指 定 的 #keyword 要 求 以 用 引 号 或 尖 括 号 括 起 来 的 文 件 名 作 为 参 数 。‘#’ is not followed by a macro parameter“#” 操 作 符 应 该 后 跟 宏 参 数 名 。‘##’ cannot appear at either end of a macro expansion连 接 操 作 符 “##” 不 能 出 现 在 宏 扩 展 的 开 头 或 结 尾 。Aa parameter list with an ellipsis can’t match an empty parameter name listdeclaration函 数 的 声 明 和 定 义 必 须 一 致 。“symbol” after #line is not a positive integer#line 后 的 符 号 要 求 是 一 个 必 须 为 正 数 的 源 代 码 行 号 。aggregate value used where a complex was expected当 需 要 复 数 值 时 , 不 要 使 用 聚 集 值 。aggregate value used where a float was expected当 需 要 浮 点 型 值 时 , 不 要 使 用 聚 集 值 。aggregate value used where an integer was expected当 要 求 整 型 值 时 不 要 使 用 聚 集 值 。alias arg not a stringalias 属 性 的 参 数 必 须 是 为 当 前 标 识 符 是 别 名 的 目 标 命 名 的 字 符 串 。alignment may not be specified for ‘identifier’aligned 属 性 只 用 于 变 量 。‘__alignof’ applied to a bit-field“__alignof” 操 作 符 不 能 用 于 位 域 。alternate interrupt vector is not a constant中 断 向 量 号 必 须 为 整 型 常 量 。alternate interrupt vector number n is not valid需 要 一 个 有 效 的 中 断 向 量 号 。DS51284C_CN 第 114 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断ambiguous abbreviation argument指 定 的 命 令 行 缩 写 不 明 确 。an argument type that has a default promotion can’t match an empty parametername list declaration.函 数 的 声 明 和 定 义 必 须 一 致 。args to be formatted is not ...format 属 性 的 first-to-check 索 引 参 数 指 定 了 一 个 未 声 明 为 “…” 的 参 数 。argument ‘identifier’ doesn’t match prototype函 数 参 数 类 型 应 该 和 函 数 原 型 匹 配 。argument of ‘asm’ is not a constant string“asm” 的 参 数 必 须 为 常 量 字 符 串 。argument to ‘-B’ is missing缺 少 目 录 名 。argument to ‘-l’ is missing缺 少 库 名 。argument to ‘-specs’ is missing缺 少 specs 文 件 名 。argument to ‘-specs=’ is missing缺 少 specs 文 件 名 。argument to ‘-x’ is missing缺 少 语 言 名 。argument to ‘-Xlinker’ is missing缺 少 传 递 到 链 接 器 的 参 数 。arithmetic on pointer to an incomplete type不 允 许 对 指 向 不 完 全 类 型 的 指 针 进 行 算 术 运 算 。array index in non-array initializer不 要 在 非 数 组 初 始 化 中 使 用 数 组 下 标 。array size missing in ‘identifier’缺 少 数 组 长 度 。array subscript is not an integer数 组 的 下 标 必 须 为 整 型 。‘asm’ operand constraint incompatible with operand sizeasm 语 句 无 效 。‘asm’ operand requires impossible reloadasm 语 句 无 效 。asm template is not a string constantasm 模 板 必 须 为 字 符 串 常 量 。assertion without predicate#assert 或 #unassert 必 须 后 跟 一 个 谓 词 , 谓 词 必 须 是 一 个 标 识 符 。‘attribute’ attribute applies only to functions属 性 “attribute” 只 能 用 于 函 数 。© 2005 Microchip Technology Inc. DS51284C_CN 第 115 页


MPLAB ® <strong>C30</strong> 用 户 指 南Bbit-field ‘identifier’ has invalid type位 域 必 须 为 枚 举 类 型 或 整 型 。bit-field ‘identifier’ width not an integer constant位 域 宽 度 必 须 为 整 型 常 量 。both long and short specified for ‘identifier’变 量 的 类 型 不 能 同 时 为 long 和 short。both signed and unsigned specified for ‘identifier’变 量 不 能 同 时 为 signed 和 unsigned。braced-group within expression allowed only inside a function函 数 外 部 的 表 达 式 内 有 大 括 号 对 是 非 法 的 。break statement not within loop or switchBreak 语 句 只 能 用 于 循 环 或 switch 内 部 。__builtin_longjmp second argument must be 1__builtin_longjmp 要 求 其 第 二 个 参 数 为 1。Ccalled object is not a functionC 中 只 有 函 数 能 被 调 用 。cannot convert to a pointer type表 达 式 不 能 转 换 为 指 针 类 型 。cannot put object with volatile field into register将 带 有 易 变 字 段 的 对 象 存 放 到 寄 存 器 中 是 非 法 的 。cannot reload integer constant operand in ‘asm’asm 语 句 无 效 。cannot specify both near and far attributes属 性 near 和 far 是 互 斥 的 , 只 能 对 函 数 或 变 量 使 用 这 两 个 属 性 中 的 一 个 。cannot take address of bit-field ‘identifier’试 图 获 得 位 域 的 地 址 是 非 法 的 。can’t open ‘file’ for writing系 统 无 法 打 开 指 定 的 “file”。 可 能 的 原 因 包 括 没 有 足 够 的 磁 盘 空 间 来 打 开 文 件 , 目 录不 存 在 , 或 目 标 目 录 不 允 许 写 。can’t set ‘attribute’ attribute after definition定 义 符 号 时 必 须 使 用 “attribute” 属 性 。case label does not reduce to an integer constantcase 标 号 编 译 时 必 须 是 整 型 常 量 。case label not within a switch statementcase 标 号 必 须 在 switch 语 句 内 部 。cast specifies array type指 定 数 组 类 型 的 强 制 类 型 转 换 是 不 允 许 的 。DS51284C_CN 第 116 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断cast specifies function type指 定 函 数 类 型 的 强 制 类 型 转 换 是 不 允 许 的 。cast to union type from type not present in union不 能 将 联 合 中 不 存 在 的 类 型 强 制 转 换 为 联 合 类 型 。char-array initialized from wide string字 符 数 组 不 能 用 宽 字 符 串 初 始 化 。 要 使 用 普 通 字 符 串 。file: compiler compiler not installed on this system仅 安 装 了 C 编 译 器 , 不 支 持 其 他 高 级 语 言 。complex invalid for ‘identifier’复 数 限 定 符 只 能 用 于 整 型 和 浮 点 型 。conflicting types for ‘identifier’标 识 符 存 在 多 个 不 一 致 的 声 明 。continue statement not within loopcontinue 语 句 只 能 在 循 环 中 使 用 。conversion to non-scalar type requested只 能 对 标 量 类 型 ( 不 能 对 聚 集 类 型 ) 进 行 类 型 转 换 。Ddata type of ‘name’ isn't suitable for a register数 据 类 型 不 适 合 请 求 的 寄 存 器 。declaration for parameter ‘identifier’ but no such parameter只 能 声 明 参 数 列 表 中 的 参 数 。declaration of ‘identifier’ as array of functions使 用 函 数 数 组 是 非 法 的 。declaration of ‘identifier’ as array of voids将 数 组 定 义 为 void 数 组 是 非 法 的 。‘identifier’ declared as function returning a function函 数 不 能 返 回 函 数 。‘identifier’ declared as function returning an array函 数 不 能 返 回 数 组 。decrement of pointer to unknown structure不 能 将 指 针 递 减 到 一 个 未 知 结 构 。‘default’ label not within a switch statement“default” case 标 号 必 须 在 switch 语 句 内 部 。‘symbol’ defined both normally and as an alias已 定 义 的 “symbol” 不 能 用 作 另 一 个 符 号 的 别 名 。‘defined’ cannot be used as a macro name“defined” 不 能 用 作 宏 名 。dereferencing pointer to incomplete type被 解 引 用 的 指 针 必 须 是 指 向 不 完 全 类 型 的 指 针 。division by zero in #if被 零 除 不 可 计 算 。© 2005 Microchip Technology Inc. DS51284C_CN 第 117 页


MPLAB ® <strong>C30</strong> 用 户 指 南duplicate case valuecase 值 必 须 是 唯 一 的 。duplicate label ‘identifier’标 号 在 其 作 用 域 内 必 须 是 唯 一 的 。duplicate macro parameter ‘symbol’“symbol” 在 参 数 列 表 中 使 用 多 次 。duplicate member ‘identifier’结 构 中 不 能 有 相 同 的 成 员 。duplicate (or overlapping) case valuecase 范 围 不 能 有 相 同 或 重 叠 的 值 。 错 误 消 息 “This is the first entry overlapping thatvalue” 将 提 供 相 同 或 重 叠 的 值 第 一 次 出 现 时 的 位 置 。 case 范 围 是 MPLAB <strong>C30</strong> 对ANSI 标 准 的 一 个 扩 展 。Eelements of array ‘identifier’ have incomplete type数 组 元 素 应 该 有 完 全 类 型 。empty character constant空 字 符 常 量 是 非 法 的 。empty file name in ‘#keyword’指 定 为 指 定 的 #keyword 的 一 个 参 数 的 文 件 名 是 空 的 。empty index range in initializer不 要 在 初 始 化 中 使 用 空 下 标 范 围 。empty scalar initializer标 量 初 始 化 不 能 为 空 。enumerator value for ‘identifier’ not integer constant枚 举 值 必 须 为 整 型 常 量 。error closing ‘file’系 统 不 能 关 闭 指 定 的 “file”。 可 能 的 原 因 包 括 没 有 足 够 的 磁 盘 空 间 来 写 文 件 或 文 件 太大 。error writing to ‘file’系 统 不 能 写 指 定 的 “file”。 可 能 的 原 因 包 括 没 有 足 够 的 磁 盘 空 间 来 写 文 件 或 文 件 太大 。excess elements in char array initializer数 组 初 始 化 中 初 值 个 数 大 于 数 组 元 素 个 数 。excess elements in struct initializer结 构 初 始 化 中 , 初 值 个 数 大 于 结 构 成 员 数 。expression statement has incomplete type表 达 式 类 型 不 完 全 。extra brace group at end of initializer在 初 始 化 末 尾 , 不 要 有 多 余 的 大 括 号 对 。extraneous argument to ‘option’ option指 定 的 命 令 行 选 项 有 过 多 参 数 。DS51284C_CN 第 118 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断F‘identifier’ fails to be a typedef or built in type数 据 类 型 必 须 为 typedef 或 内 建 (built-in) 类 型 。field ‘identifier’ declared as a function指 定 字 段 不 能 声 明 为 函 数 。field ‘identifier’ has incomplete type指 定 字 段 必 须 具 有 完 全 类 型 (complete type)。first argument to __builtin_choose_expr not a constant第 一 个 参 数 必 须 为 在 编 译 时 可 确 定 其 值 的 常 量 表 达 式 。flexible array member in otherwise empty struct灵 活 的 数 组 元 素 必 须 是 具 有 多 个 指 定 成 员 的 结 构 的 最 后 一 个 元 素 。flexible array member in union不 能 在 联 合 中 使 用 灵 活 的 数 组 元 素 。flexible array member not at end of struct灵 活 的 数 组 元 素 必 须 为 结 构 的 最 后 一 个 元 素 。‘for’ loop initial declaration used outside C99 mode非 C99 模 式 下 ,“for” 循 环 初 始 声 明 无 效 。format string arg follows the args to be formattedformat 属 性 的 参 数 不 一 致 。 format 字 符 串 参 数 索 引 必 须 小 于 要 检 查 的 第 一 个 参 数 的 索引 。format string arg not a string typeformat 属 性 的 format 字 符 串 索 引 参 数 要 指 定 一 个 字 符 串 类 型 的 参 数 。format string has invalid operand numberformat 属 性 的 操 作 数 编 号 参 数 编 译 时 必 须 是 一 个 常 量 。function definition declared ‘register’函 数 定 义 不 能 声 明 为 “register”。function definition declared ‘typedef’函 数 定 义 不 能 声 明 为 “typedef”。function does not return string typeformat_arg 属 性 只 能 用 于 返 回 值 为 字 符 串 类 型 的 函 数 。function ‘identifier’ is initialized like a variable像 变 量 一 样 初 始 化 函 数 是 非 法 的 。function return type cannot be function函 数 的 返 回 值 类 型 不 能 为 函 数 。© 2005 Microchip Technology Inc. DS51284C_CN 第 119 页


MPLAB ® <strong>C30</strong> 用 户 指 南Gglobal register variable follows a function definition全 局 寄 存 器 变 量 定 义 应 该 在 函 数 定 义 之 前 。global register variable has initial value不 要 为 全 局 寄 存 器 变 量 赋 初 值 。global register variable ‘identifier’ used in nested function不 要 在 被 嵌 套 的 函 数 中 使 用 全 局 寄 存 器 变 量 。H‘identifier’ has an incomplete type指 定 的 “ 标 识 符 ” 有 不 完 全 类 型 是 非 法 的 。‘identifier’ has both ‘extern’ and initializer声 明 为 “extern” 的 变 量 不 能 被 初 始 化 。hexadecimal floating constants require an exponent十 六 进 制 浮 点 型 常 量 必 须 有 指 数 。Iimplicit declaration of function ‘identifier’使 用 函 数 标 识 符 前 没 有 原 型 声 明 或 函 数 定 义 。impossible register constraint in ‘asm’asm 语 句 无 效 。incompatible type for argument n of ‘identifier’在 C 中 调 用 函 数 时 , 要 确 保 实 参 类 型 与 形 参 类 型 相 匹 配 。incompatible type for argument n of indirect function call在 C 中 调 用 函 数 时 , 要 确 保 实 参 类 型 与 形 参 类 型 相 匹 配 。incompatible types in operation运 算 ( 操 作 ) 中 必 须 使 用 匹 配 的 数 据 类 型 。incomplete ‘name’ option命 令 行 参 数 name 的 选 项 不 完 整 。inconsistent operand constraints in an ‘asm’asm 语 句 无 效 。increment of pointer to unknown structure不 要 将 指 针 递 增 到 一 个 未 知 结 构 体 。initializer element is not computable at load time初 值 元 素 在 装 载 时 必 须 是 可 计 算 的 。initializer element is not constant初 值 元 素 必 须 为 常 量 。initializer fails to determine size of ‘identifier’数 组 初 始 化 不 能 确 定 数 组 的 大 小 。DS51284C_CN 第 120 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断initializer for static variable is not constant要 用 常 数 初 始 化 静 态 变 量 。initializer for static variable uses complicated arithmetic不 要 使 用 复 杂 的 算 术 来 初 始 化 静 态 变 量 。input operand constraint contains ‘constraint’输 入 操 作 数 的 指 定 约 束 无 效 。int-array initialized from non-wide string不 应 该 用 非 宽 字 符 串 初 始 化 整 型 数 组 。interrupt functions must not take parameters中 断 函 数 不 能 接 收 参 数 。 必 须 使 用 void 来 显 式 声 明 参 数 列 表 为 空 。interrupt functions must return void中 断 函 数 的 返 回 值 类 型 必 须 为 void。 不 允 许 任 何 其 他 返 回 值 类 型 。interrupt modifier ‘name’ unknown编 译 器 要 求 以 “irq’”、“ altirq” 或 “save” 作 为 中 断 属 性 修 饰 符 。interrupt modifier syntax error中 断 属 性 修 饰 符 有 语 法 错 误 。interrupt pragma must have file scope#pragma 中 断 必 须 具 有 文 件 作 用 域 。interrupt save modifier syntax error中 断 属 性 的 “save” 修 饰 符 有 语 法 错 误 。interrupt vector is not a constant中 断 向 量 号 必 须 为 整 型 常 量 。interrupt vector number n is not valid需 要 一 个 有 效 的 中 断 向 量 号 。invalid #ident directive#ident 应 该 后 跟 一 个 引 号 括 起 来 的 字 符 串 常 量 。invalid arg to ‘__builtin_frame_address’参 数 应 该 是 函 数 的 调 用 函 数 的 级 别 ( 其 中 0 产 生 当 前 函 数 的 帧 地 址 , 1 产 生 当 前 函 数的 调 用 函 数 的 帧 地 址 , 等 等 ), 为 整 型 立 即 数 。invalid arg to ‘__builtin_return_address’级 别 (level) 参 数 必 须 为 整 型 立 即 数 。invalid argument for ‘name’编 译 器 要 求 以 “data” 或 “prog” 作 为 space 属 性 的 参 数 。invalid character ‘character’ in #if当 一 个 不 可 打 印 字 符 ( 如 控 制 字 符 ) 出 现 在 #if 后 时 , 出 现 这 条 消 息 。invalid initial value for member ‘name’只 能 用 整 数 来 初 始 化 位 域 “name”。invalid initializer不 要 使 用 无 效 的 初 始 化 。© 2005 Microchip Technology Inc. DS51284C_CN 第 121 页


MPLAB ® <strong>C30</strong> 用 户 指 南Invalid location qualifier: ‘symbol’要 求 以 “sfr” 或 “gpr” 作 为 位 置 限 定 符 , dsPIC 忽 略 这 些 限 定 符 。invalid operands to binary ‘operator’指 定 二 进 制 操 作 符 的 操 作 数 无 效 。Invalid option ‘option’指 定 的 命 令 行 选 项 无 效 。Invalid option ‘symbol’ to interrupt pragma需 要 以 shadow 和 / 或 save 作 为 interrupt pragma 的 选 项 。Invalid option to interrupt pragmapragma 末 尾 有 无 效 选 项 。Invalid or missing function name from interrupt pragmainterrupt pragma 要 求 被 调 用 的 函 数 名 。Invalid or missing section name段 名 必 须 以 字 母 或 下 划 线 (“_”) 开 头 , 后 跟 一 系 列 字 母 、 下 划 线 和 / 或 数 字 。“access”、“ shared” 和 “overlay” 有 特 殊 含 义 。invalid preprocessing directive #‘directive’不 是 一 个 有 效 的 预 处 理 伪 指 令 。 请 检 查 拼 写 。invalid preprologue argumentpre prologue 选 项 需 要 以 汇 编 语 句 作 为 其 参 数 , 参 数 两 侧 要 加 双 引 号 。invalid register name for ‘name’用 无 效 的 寄 存 器 名 将 文 件 作 用 域 变 量 “name” 声 明 为 一 个 寄 存 器 变 量 。invalid register name ‘name’ for register variable指 定 的 name 不 是 一 个 寄 存 器 名 。invalid save variable in interrupt pragma要 求 指 定 要 保 存 的 有 效 符 号 。invalid storage class for function ‘identifier’函 数 不 能 有 “register” 存 储 类 别 。invalid suffix ‘suffix’ on integer constant整 型 常 量 只 能 以 字 母 “u”、“ U”、“ l” 和 “L” 为 后 缀 。invalid suffix on floating constant浮 点 型 常 量 只 能 以 “f”、“ F”、“ l” 或 “L” 为 后 缀 。 如 果 有 两 个 “L”, 则 它 们 必须 相 邻 并 且 大 小 写 相 同 。invalid type argument of ‘operator’operator 的 参 数 类 型 无 效 。invalid type modifier within pointer declarator在 指 针 声 明 中 , 仅 可 使 用 const 或 volatile 作 为 类 型 修 饰 符 。invalid use of array with unspecified bounds必 须 以 有 效 方 式 使 用 未 指 定 上 下 限 的 数 组 。invalid use of incomplete typedef ‘typedef’以 无 效 的 方 式 使 用 指 定 的 typedef ; 这 是 不 允 许 的 。DS51284C_CN 第 122 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断invalid use of undefined type ‘type identifier’以 无 效 的 方 式 使 用 类 型 ; 这 是 不 允 许 的 。invalid use of void expression不 要 使 用 void 表 达 式 。“name” is not a valid filename#line 需 要 有 效 的 文 件 名 。‘filename’ is too large指 定 的 文 件 太 大 不 能 处 理 。 文 件 可 能 大 于 4 GB, 处 理 器 拒 绝 处 理 这 么 大 的 文 件 。 要 求文 件 大 小 要 小 于 4GB。ISO C forbids data definition with no type or storage classISO C 要 求 数 据 定 义 要 有 类 型 说 明 符 或 存 储 类 别 说 明 符 。ISO C requires a named argument before ‘...’ISO C 要 求 在 “...” 前 要 指 定 参 数 。Llabel label referenced outside of any function只 能 在 函 数 内 部 引 用 标 号 。label ‘label’ used but not defined使 用 了 指 定 的 标 号 , 但 未 定 义 。language ‘name’ not recognized允 许 的 语 言 包 括 :C 和 汇 编 。filename: linker input file unused because linking not done命 令 行 中 指 定 的 文 件 名 , 被 视 为 链 接 输 入 文 件 ( 因 为 它 没 有 被 识 别 为 其 他 文 件 )。 但链 接 不 运 行 。 因 此 , 该 文 件 被 忽 略 。long long long is too long for GCCMPLAB <strong>C30</strong> 支 持 长 度 不 超 过 long long 的 整 型 。long or short specified with char for ‘identifier’不 能 对 字 符 型 使 用 long 和 short 限 定 符 。long or short specified with floating type for ‘identifier’不 能 对 浮 点 型 使 用 long 和 short 限 定 符 。long, short, signed or unsigned invalid for ‘identifier’long、 short 和 signed 限 定 符 只 能 用 于 整 型 。Mmacro names must be identifiers宏 名 必 须 以 字 母 或 下 划 线 开 头 , 后 跟 更 多 字 母 、 数 字 或 下 划 线 。macro parameters must be comma-separated参 数 列 表 中 的 参 数 之 间 要 有 逗 号 。macro ‘name’ passed n arguments, but takes just n传 递 给 宏 “name” 的 参 数 太 多 。© 2005 Microchip Technology Inc. DS51284C_CN 第 123 页


MPLAB ® <strong>C30</strong> 用 户 指 南macro ‘name’ requires n arguments, but only n given传 递 给 宏 “name” 的 参 数 不 够 。matching constraint not valid in output operandasm 语 句 无 效 。‘symbol’ may not appear in macro parameter list不 允 许 将 “symbol” 作 为 参 数 。Missing ‘=’ for ‘save’ in interrupt pragmasave 参 数 需 要 在 列 出 的 变 量 前 有 等 号 。 例 如 , #pragma interrupt isr0save=var1,var2missing ‘(’ after predicate#assert 或 #unassert 需 要 在 answer 前 后 有 括 号 。 例 如 :#assert PREDICATE(ANSWER)missing ‘(’ in expression括 号 不 配 对 , 缺 少 右 括 号 。missing ‘)’ after “defined”缺 少 右 括 号 。missing ‘)’ in expression括 号 不 配 对 , 缺 少 右 括 号 。missing ‘)’ in macro parameter list宏 要 求 将 参 数 括 在 括 号 中 , 参 数 之 间 用 逗 号 分 隔 开 。missing ‘)’ to complete answer#assert 或 #unassert 需 要 在 answer 前 后 有 括 号 。missing argument to ‘option’ option指 定 的 命 令 行 选 项 需 要 一 个 参 数 。missing binary operator before token ‘token’记 号 “token” 前 需 要 一 个 二 进 制 操 作 符 。missing terminating ‘character’ character缺 少 终 止 符 , 如 单 引 号 ’、 双 引 号 ” 或 右 尖 括 号 >。missing terminating > character#include 伪 指 令 中 缺 少 终 止 >。more than n operands in ‘asm’asm 语 句 无 效 。multiple default labels in one switch对 于 每 个 switch, 只 能 指 定 一 个 default 标 号 。multiple parameters named ‘identifier’参 数 名 必 须 是 唯 一 的 。multiple storage classes in declaration of ‘identifier’每 个 声 明 中 只 能 有 一 个 存 储 类 别 。DS51284C_CN 第 124 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断Nnegative width in bit-field ‘identifier’位 域 宽 度 不 能 为 负 数 。nested function ‘name’ declared ‘extern’被 嵌 套 的 函 数 不 能 声 明 为 “extern”。nested redefinition of ‘identifier’嵌 套 的 重 新 定 义 是 非 法 的 。no data type for mode ‘mode’为 mode 属 性 指 定 的 参 数 mode 是 可 识 别 的 GCC 机 器 模 式 , 但 不 是 MPLAB <strong>C30</strong> 中 实现 的 模 式 。no include path in which to find ‘name’找 不 到 包 含 文 件 “name”。no macro name given in #‘directive’ directive#define、 #undef、 #ifdef 或 #ifndef 伪 指 令 必 须 后 跟 宏 名 。nonconstant array index in initializer初 始 化 中 只 能 使 用 常 量 数 组 下 标 。non-prototype definition here如 果 在 一 个 没 有 函 数 原 型 的 函 数 定 义 后 , 有 一 个 函 数 原 型 , 且 二 者 的 参 数 个 数 不 一 致 ,这 条 消 息 标 识 出 非 原 型 定 义 的 行 号 。number of arguments doesn’t match prototype函 数 的 参 数 个 数 必 须 与 函 数 原 型 相 符 。Ooperand constraint contains incorrectly positioned ‘+’ or ‘=’.asm 语 句 无 效 。operand constraints for ‘asm’ differ in number of alternativesasm 语 句 无 效 。operator “defined” requires an identifier“defined” 需 要 一 个 标 识 符 。operator ‘symbol’ has no right operand预 处 理 操 作 符 “symbol” 的 右 侧 需 要 一 个 操 作 数 。output number n not directly addressableasm 语 句 无 效 。output operand constraint lacks ‘=’asm 语 句 无 效 。output operand is constant in ‘asm’asm 语 句 无 效 。overflow in enumeration values枚 举 值 必 须 在 “int” 范 围 内 。© 2005 Microchip Technology Inc. DS51284C_CN 第 125 页


MPLAB ® <strong>C30</strong> 用 户 指 南Pparameter ‘identifier’ declared void参 数 不 能 声 明 为 void。parameter ‘identifier’ has incomplete type参 数 必 须 具 有 完 全 类 型 。parameter ‘identifier’ has just a forward declaration参 数 必 须 具 有 完 全 类 型 ; 仅 有 forward 声 明 是 不 够 的 。parameter ‘identifier’ is initialized初 始 化 参 数 是 非 法 的 。parameter name missing宏 需 要 一 个 参 数 名 。 检 查 中 间 没 有 名 字 的 两 个 逗 号 。parameter name missing from parameter list参 数 名 必 须 包 含 在 参 数 列 表 中 。parameter name omitted参 数 名 不 能 省 略 。param types given both in param list and separately参 数 类 型 要 么 在 参 数 列 表 中 给 出 , 要 么 单 独 给 出 , 但 不 能 同 时 用 这 两 种 方 式 给 出 。parse error不 能 解 析 源 代 码 行 , 它 包 含 错 误 。pointer value used where a complex value was expected不 要 将 指 针 值 用 于 在 需 要 复 数 值 的 地 方 。pointer value used where a floating point value was expected不 要 将 指 针 值 用 于 需 要 浮 点 值 的 地 方 。pointers are not permitted as case valuescase 值 必 须 为 整 型 值 常 量 或 常 量 表 达 式 。predicate must be an identifier#assert 或 #unassert 需 要 一 个 标 识 符 作 为 谓 词 。predicate’s answer is empty#assert 或 #unassert 有 谓 词 和 括 号 , 但 在 括 号 内 没 有 需 要 的 答 案 。previous declaration of ‘identifier’这 条 消 息 标 识 与 标 识 符 当 前 声 明 冲 突 的 先 前 声 明 的 位 置 。identifier previously declared here这 条 消 息 标 识 与 标 识 符 当 前 声 明 冲 突 的 先 前 声 明 的 位 置 。identifier previously defined here这 条 消 息 标 识 与 标 识 符 当 前 定 义 冲 突 的 先 前 定 义 的 位 置 。prototype declaration标 识 声 明 函 数 原 型 的 行 号 。 与 其 他 错 误 消 息 一 起 使 用 。DS51284C_CN 第 126 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断Rredeclaration of ‘identifier’标 识 符 identifier 被 声 明 了 多 次 。redeclaration of ‘enum identifier’枚 举 不 能 被 重 新 声 明 。‘identifier’ redeclared as different kind of symbol标 识 符 identifier 存 在 多 次 不 一 致 的 声 明 。redefinition of ‘identifier’标 识 符 identifier 被 多 次 定 义 。redefinition of ‘struct identifier’结 构 不 能 被 重 新 定 义 。redefinition of ‘union identifier’联 合 不 能 被 重 新 定 义 。register name given for non-register variable ‘name’试 图 将 一 个 寄 存 器 映 射 到 一 个 未 标 记 为 寄 存 器 的 变 量 。register name not specified for ‘name’文 件 作 用 域 变 量 “name” 被 声 明 为 寄 存 器 变 量 , 但 未 指 定 寄 存 器 。register specified for ‘name’ isn’t suitable for data type对 齐 或 其 他 限 制 禁 止 使 用 请 求 的 寄 存 器 。request for member ‘identifier’ in something not a structure or union只 有 结 构 和 联 合 有 成 员 。 引 用 其 他 数 据 类 型 的 成 员 是 非 法 的 , 因 为 其 他 数 据 类 型 都 没有 成 员 。requested alignment is not a constantaligned 属 性 的 参 数 在 编 译 时 必 须 是 常 量 。requested alignment is not a power of 2aligned 属 性 的 参 数 必 须 是 2 的 次 幂 。requested alignment is too large请 求 的 对 齐 长 度 大 于 链 接 器 的 允 许 长 度 。 长 度 必 须 是 4096 或 更 小 , 且 是 2 的 次 幂 。return type is an incomplete type返 回 值 类 型 必 须 是 完 全 的 。Ssave variable ‘name’ index not constant数 组 “name” 的 下 标 不 是 整 型 常 量 。save variable ‘name’ is not word aligned保 存 的 对 象 必 须 是 字 对 齐 的 。save variable ‘name’ size is not even保 存 的 对 象 必 须 是 偶 数 长 度 的 。save variable ‘name’ size is not known保 存 的 对 象 必 须 长 度 已 知 。© 2005 Microchip Technology Inc. DS51284C_CN 第 127 页


MPLAB ® <strong>C30</strong> 用 户 指 南section attribute cannot be specified for local variables局 部 变 量 总 是 分 配 在 寄 存 器 或 堆 栈 中 。 因 此 试 图 将 局 部 变 量 存 放 在 指 定 的 段 中 是 非 法的 。section attribute not allowed for identifier段 属 性 只 能 用 于 函 数 或 变 量 。section of identifier conflicts with previous declaration如 果 同 一 个 标 识 符 identifier 有 多 个 声 明 指 定 段 属 性 , 那 么 属 性 的 值 必 须 一 致 。sfr address ‘address’ is not valid地 址 必 须 小 于 0x2000 才 有 效 。sfr address is not a constantsfr 地 址 必 须 为 常 量 。‘size of’ applied to a bit-field“sizeof” 不 能 用 于 位 域 。size of array ‘identifier’ has non-integer type数 组 长 度 说 明 符 必 须 为 整 型 。size of array ‘identifier’ is negative数 组 长 度 不 能 为 负 数 。size of array ‘identifier’ is too large指 定 的 数 组 长 度 太 大 。size of variable ‘variable’ is too large变 量 的 最 大 长 度 为 32768 字 节 。storage class specified for parameter ‘identifier’不 能 对 参 数 指 定 存 储 类 别 。storage size of ‘identifier’ isn’t constant标 识 符 的 存 储 长 度 在 编 译 时 必 须 为 常 量 。storage size of ‘identifier’ isn’t known标 识 符 identifier 的 长 度 没 有 完 全 指 定 。stray ‘character’ in program源 程 序 中 不 要 有 不 需 要 的 字 符 。strftime formats cannot format arguments使 用 format 属 性 时 , 当 archetype 参 数 为 strftime 时 , 属 性 的 第 三 个 参 数 , 即 指 定 要与 格 式 字 符 串 匹 配 的 第 一 个 参 数 的 参 数 , 应 该 为 0。 strftime 型 函 数 没 有 与 格 式 字 符 串匹 配 的 输 入 值 。structure has no member named ‘identifier’引 用 了 名 为 “identifier” 的 一 个 结 构 成 员 , 但 引 用 的 结 构 不 包 含 这 种 成 员 。 这 是 不 允许 的 。subscripted value is neither array nor pointer只 有 数 组 和 指 针 可 以 有 下 标 。switch quantity not an integerswitch 后 表 达 式 的 值 必 须 为 整 型 。DS51284C_CN 第 128 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断symbol ‘symbol’ not defined在 pragma 中 使 用 符 号 “symbol” 前 , 要 先 对 它 进 行 声 明 。syntax error指 定 的 行 中 存 在 语 法 错 误 。syntax error ‘:’ without preceding ‘?’在 “?:” 操 作 符 中 ,“:” 前 必 须 要 有 “?”。Tthe only valid combination is ‘long double’double 类 型 前 只 能 使 用 long 限 定 符 , 不 能 使 用 其 他 限 定 符 。this built-in requires a frame pointer__builtin_return_address 需 要 一 个 帧 指 针 。 不 要 使 用 -fomit-frame-pointer 选项 。this is a previous declaration如 果 标 号 重 复 , 这 条 消 息 标 识 出 前 一 个 声 明 的 行 号 。too few arguments to function在 C 中 调 用 函 数 时 , 指 定 的 参 数 个 数 不 要 少 于 函 数 需 要 的 参 数 个 数 。 也 不 能 指 定 太 多的 参 数 。too few arguments to function ‘identifier’在 C 中 调 用 函 数 时 , 指 定 的 参 数 个 数 不 要 少 于 函 数 需 要 的 参 数 个 数 。 也 不 能 指 定 太 多的 参 数 。too many alternatives in ‘asm’asm 语 句 无 效 。too many arguments to function在 C 中 调 用 函 数 时 , 指 定 的 参 数 个 数 不 要 多 于 函 数 需 要 的 参 数 个 数 , 也 不 要 指 定 太 少的 参 数 。too many arguments to function ‘identifier’在 C 中 调 用 函 数 时 , 指 定 的 参 数 个 数 不 要 多 于 函 数 需 要 的 参 数 个 数 , 也 不 要 指 定 太 少的 参 数 。too many decimal points in number只 需 要 一 个 小 数 点 。top-level declaration of ‘identifier’ specifies ‘auto’只 能 在 函 数 内 部 声 明 自 动 变 量 。two or more data types in declaration of ‘identifier’每 个 标 识 符 只 能 有 一 个 数 据 类 型 。two types specified in one empty declaration只 能 指 定 一 种 类 型 。type of formal parameter n is incomplete要 为 指 定 的 参 数 指 定 一 个 完 全 的 类 型 。type mismatch in conditional expression条 件 表 达 式 中 的 类 型 要 匹 配 。typedef ‘identifier’ is initialized初 始 化 typedef 标 识 符 是 非 法 的 。 要 使 用 __typeof__。© 2005 Microchip Technology Inc. DS51284C_CN 第 129 页


MPLAB ® <strong>C30</strong> 用 户 指 南U‘identifier’ undeclared (first use in this function)指 定 的 标 识 符 必 须 要 声 明 。‘identifier’ undeclared here (not in a function)指 定 的 标 识 符 必 须 要 声 明 。union has no member named ‘identifier’引 用 了 名 为 “identifier” 的 联 合 成 员 ; 但 被 引 用 的 联 合 不 包 含 这 个 成 员 。 这 是 不 允 许的 。unknown field ‘identifier’ specified in initializer不 要 在 初 始 化 中 使 用 未 知 字 段 。unknown machine mode ‘mode’为 mode 属 性 指 定 的 参 数 mode 不 是 可 识 别 的 机 器 模 式 。unknown register name ‘name’ in ‘asm’asm 语 句 无 效 。unrecognized format specifierformat 属 性 的 参 数 无 效 。unrecognized option ‘-option’指 定 命 令 行 选 项 无 法 识 别 。unrecognized option ‘option’“option” 是 一 个 未 知 选 项 。‘identifier’ used prior to declaration标 识 符 在 声 明 之 前 使 用 了 。unterminated #‘name’要 用 #endif 来 终 止 #if、 #ifdef 或 #ifndef 条 件 编 译 。unterminated argument list invoking macro ‘name’在 完 成 宏 扩 展 之 前 , 函 数 宏 的 求 值 遇 到 了 文 件 结 束 符 。unterminated comment查 找 注 释 终 止 符 时 遇 到 了 文 件 终 止 符 。V‘va_start’ used in function with fixed args“va_start” 只 能 在 有 可 变 参 数 列 表 的 函 数 中 使 用 。variable ‘identifier’ has initializer but incomplete type用 不 完 全 类 型 初 始 化 变 量 是 非 法 的 。variable or field ‘identifier’ declared void变 量 或 字 段 不 能 被 声 明 为 void。variable-sized object may not be initialized初 始 化 长 度 可 变 的 对 象 是 非 法 的 。virtual memory exhausted没 有 足 够 的 存 储 空 间 来 写 错 误 消 息 。DS51284C_CN 第 130 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断void expression between ‘(’ and ‘)’需 要 一 个 常 量 表 达 式 , 但 在 括 号 中 发 现 了 void 表 达 式 。‘void’ in parameter list must be the entire list如 果 “void” 作 为 一 个 参 数 出 现 在 参 数 列 表 中 , 那 么 必 须 没 有 其 他 参 数 。void value not ignored as it ought to be不 能 在 表 达 式 中 使 用 void 函 数 的 值 。Wwarning: -pipe ignored because -save-temps specified-pipe 选 项 不 能 和 -save-temps 选 项 一 起 使 用 。warning: -pipe ignored because -time specified-pipe 选 项 不 能 和 -time 选 项 一 起 使 用 。warning: ‘-x spec’ after last input file has no effect“-x” 命 令 行 选 项 仅 影 响 命 令 行 中 此 选 项 之 后 指 定 的 文 件 ; 如 果 此 选 项 前 没 有 这 种 指 定的 文 件 , 此 选 项 将 没 有 任 何 影 响 。weak declaration of ‘name’ must be publicweak 符 号 必 须 外 部 可 见 。weak declaration of ‘name’ must precede definition“name” 先 被 定 义 , 然 后 被 声 明 为 weak。wrong number of arguments specified for attribute attribute名 为 “attribute” 的 属 性 有 太 多 或 太 少 参 数 。wrong type argument to bit-complement不 要 对 这 个 运 算 符 使 用 错 误 类 型 的 参 数 。wrong type argument to decrement不 要 对 这 个 运 算 符 使 用 错 误 类 型 的 参 数 。wrong type argument to increment不 要 对 这 个 运 算 符 使 用 错 误 类 型 的 参 数 。wrong type argument to unary exclamation mark不 要 对 这 个 运 算 符 使 用 错 误 类 型 的 参 数 。wrong type argument to unary minus不 要 对 这 个 运 算 符 使 用 错 误 类 型 的 参 数 。wrong type argument to unary plus不 要 对 这 个 运 算 符 使 用 错 误 类 型 的 参 数 。Zzero width for bit-field ‘identifier’位 域 宽 度 不 能 为 零 。© 2005 Microchip Technology Inc. DS51284C_CN 第 131 页


MPLAB ® <strong>C30</strong> 用 户 指 南B.3 警 告符 号‘/*’ within comment在 注 释 内 发 现 了 注 释 标 记 。‘$’ character(s) in identifier or number标 识 符 名 中 使 用 美 元 符 号 是 对 标 准 的 扩 展 。#‘directive’ is a GCC extension#warning、#include_next、#ident、#import、#assert 和 #unassert 伪 指 令 是 GCC 的扩 展 , ISO C89 不 支 持 这 些 伪 指 令 。#import is obsolete, use an #ifndef wrapper in the header file#import 伪 指 令 已 废 弃 。#import 用 于 包 含 还 没 有 被 包 含 的 文 件 。 请 使 用 #ifndef 伪 指 令 。#include_next in primary source file#include_next 开 始 在 当 前 文 件 所 在 的 目 录 之 后 搜 索 头 文 件 目 录 列 表 。 在 这 个 例 子中 , 没 有 先 前 的 头 文 件 , 所 以 它 从 主 源 文 件 所 在 的 目 录 开 始 。#pragma pack (pop) encountered without matching #pragma pack (push, )pack (pop) pragma 必 须 与 pack (push) pragma 配 对 , 在 源 文 件 中 后 者 在 前 者 之前 。#pragma pack (pop, identifier) encountered without matching #pragma pack(push, identifier, )pack (pop) pragma 必 须 与 pack (push) pragma 配 对 , 在 源 文 件 中 后 者 在 前 者 之前 。#warning: message伪 指 令 #warning 使 预 处 理 器 发 出 一 个 警 告 并 继 续 进 行 预 处 理 。 #warning 后 的 记 号 用作 警 告 消 息 。Aabsolute address specification ignored忽 略 #pragma 语 句 中 代 码 段 的 绝 对 地 址 指 定 , 因 为 MPLAB <strong>C30</strong> 不 支 持 它 。 必 须 在 链接 描 述 文 件 中 指 定 地 址 , 可 使 用 关 键 字 __attribute__ 来 定 义 代 码 段 。address of register variable ‘name’ requested寄 存 器 说 明 符 禁 止 将 地 址 作 为 变 量 。alignment must be a small power of two, not npack pragma 的 alignment 参 数 必 须 为 2 的 最 小 次 幂 。anonymous enum declared inside parameter list在 函 数 参 数 列 表 内 部 声 明 了 匿 名 枚 举 。 良 好 的 编 程 习 惯 是 在 参 数 列 表 外 部 声 明 枚 举 ,因 为 当 在 参 数 列 表 内 部 定 义 枚 举 时 , 它 们 可 能 不 会 成 为 完 全 类 型 。anonymous struct declared inside parameter list在 函 数 参 数 列 表 内 部 声 明 了 匿 名 结 构 。 良 好 的 编 程 习 惯 是 在 参 数 列 表 外 部 声 明 结 构 ,因 为 在 参 数 列 表 内 部 定 义 结 构 时 , 它 们 可 能 不 会 成 为 完 全 类 型 。DS51284C_CN 第 132 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断anonymous union declared inside parameter list在 函 数 参 数 列 表 内 部 声 明 了 匿 名 联 合 。 良 好 的 编 程 习 惯 是 在 参 数 列 表 外 部 声 明 联 合 ,因 为 在 参 数 列 表 内 部 定 义 联 合 时 , 它 们 可 能 不 会 成 为 完 全 类 型 。anonymous variadic macros were introduced in C99接 受 可 变 参 数 数 的 宏 属 于 C99 的 一 个 特 性 。argument ‘identifier’ might be clobbered by ‘longjmp’ or ‘vfork’调 用 longjmp 可 能 会 改 变 一 个 参 数 。 仅 在 优 化 编 译 时 会 出 现 这 些 警 告 。array ‘identifier’ assumed to have one element指 定 数 组 的 长 度 没 有 显 式 指 定 。 没 有 这 一 信 息 时 , 编 译 器 假 定 数 组 有 一 个 元 素 。array subscript has type ‘char’数 组 下 标 为 “char” 类 型 。array type has incomplete element type数 组 类 型 不 能 具 有 不 完 全 元 素 类 型 。asm operand n probably doesn’t match constraints指 定 的 扩 展 asm 操 作 数 可 能 与 其 约 束 不 匹 配 。assignment of read-only member ‘name’元 素 “name” 声 明 为 常 量 , 但 不 能 被 赋 值 修 改 。assignment of read-only variable ‘name’“name” 声 明 为 常 量 , 但 不 能 被 赋 值 修 改 。‘identifier’ attribute directive ignored指 定 的 属 性 不 是 已 知 或 支 持 的 属 性 , 因 此 被 忽 略 。‘identifier’ attribute does not apply to types指 定 的 属 性 不 能 适 用 于 类 型 , 被 忽 略 。‘identifier’ attribute ignored指 定 的 属 性 在 给 定 上 下 文 中 是 没 有 意 义 的 , 因 此 被 忽 略 。‘attribute’ attribute only applies to function types指 定 的 属 性 仅 适 用 于 函 数 的 返 回 值 类 型 , 不 适 用 于 其 他 声 明 。Bbackslash and newline separated by space当 处 理 转 义 序 列 时 , 遇 到 了 反 斜 杠 和 换 行 符 , 二 者 之 间 以 空 格 分 隔 。backslash-newline at end of file当 处 理 转 义 序 列 时 , 在 文 件 结 束 遇 到 了 反 斜 杠 和 换 行 符 。bit-field ‘identifier’ type invalid in ISO C用 于 指 定 标 识 符 的 类 型 在 ISO C 中 无 效 。braces around scalar initializer在 初 始 化 前 后 有 多 余 的 大 括 号 对 。© 2005 Microchip Technology Inc. DS51284C_CN 第 133 页


MPLAB ® <strong>C30</strong> 用 户 指 南built-in function ‘identifier’ declared as non-function指 定 的 函 数 名 与 一 内 建 函 数 名 相 同 , 但 声 明 为 其 他 , 而 没 有 声 明 为 函 数 。CC++ style comments are not allowed in ISO C89使 用 C 形 式 的 注 释 符 “/*” 和 “*/”, 而 不 要 使 用 C++ 形 式 的 注 释 符 “//”。call-clobbered register used for global register variable选 择 一 个 通 常 由 函 数 调 用 保 护 和 恢 复 的 寄 存 器 (W8-W13), 使 库 函 数 不 会 破 坏 它 。cannot inline function ‘main’用 inline 属 性 声 明 了 函 数 “main”。 这 是 不 支 持 的 , 因 为 必 须 从 C 启 动 代 码 调 用 main函 数 , 它 是 单 独 编 译 的 。can’t inline call to ‘identifier’ called from here编 译 器 不 能 内 联 对 指 定 函 数 的 调 用 。case value ‘n’ not in enumerated typeswitch 语 句 的 控 制 表 达 式 是 一 个 枚 举 类 型 , 但 case 表 达 式 具 有 与 任 何 一 个 枚 举 值 都 不对 应 的 值 n。case value ‘value’ not in enumerated type ‘name’“value” 是 另 外 的 switch case, 不 是 枚 举 类 型 “name” 的 元 素 。cast does not match function type函 数 的 返 回 值 类 型 被 强 制 转 换 为 一 个 与 函 数 类 型 不 匹 配 的 类 型 。cast from pointer to integer of different size指 针 被 强 制 转 换 为 非 16 位 宽 的 整 型 。cast increases required alignment of target type当 使 用 -Wcast-align 命 令 行 选 项 编 译 时 , 编 译 器 确 认 强 制 类 型 转 换 不 会 增 加 目 标 类 型所 需 要 的 对 齐 。 例 如 , 如 果 将 指 向 char 的 指 针 强 制 转 换 为 指 向 int 的 指 针 , 会 发 出 这个 警 告 消 息 , 因 为 char 的 对 齐 ( 字 节 对 齐 ) 小 于 int 所 需 的 对 齐 ( 字 对 齐 )。character constant too long字 符 常 量 不 能 太 长 。comma at end of enumerator list枚 举 列 表 的 结 尾 有 多 余 的 逗 号 。comma operator in operand of #if在 #if 伪 指 令 中 , 不 应 有 逗 号 操 作 符 。comparing floating point with == or != is unsafe浮 点 值 可 近 似 为 无 限 精 度 的 实 数 。 不 检 测 其 相 等 性 , 而 使 用 关 系 操 作 符 来 看 两 个 值 的范 围 是 否 重 叠 。comparison between pointer and integer将 指 针 类 型 和 整 型 作 比 较 。DS51284C_CN 第 134 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断comparison between signed and unsigned比 较 的 一 个 操 作 数 是 有 符 号 的 , 另 外 一 个 操 作 数 是 无 符 号 的 。 有 符 号 操 作 数 可 视 为 无符 号 值 处 理 , 这 样 做 可 能 不 正 确 。comparison is always n比 较 仅 包 含 常 量 表 达 式 , 因 此 编 译 器 能 得 到 比 较 的 运 行 时 结 果 。 结 果 总 是 n。comparison is always n due to width of bit-field由 于 位 域 的 宽 度 , 包 含 位 域 的 比 较 的 结 果 总 是 n。comparison is always false due to limited range of data type运 行 时 比 较 得 结 果 总 为 false, 这 是 由 于 数 据 类 型 的 范 围 有 限 。comparison is always true due to limited range of data type运 行 时 比 较 的 结 果 总 是 为 true, 这 是 由 于 数 据 类 型 的 范 围 有 限 。comparison of promoted ~unsigned with constant比 较 的 一 个 操 作 数 为 提 升 的 ~unsigned, 而 另 一 个 操 作 数 为 常 数 。comparison of promoted ~unsigned with unsigned比 较 的 一 个 操 作 数 为 提 升 的 ~unsigned, 而 另 一 个 操 作 数 为 unsigned。comparison of unsigned expression >= 0 is always true比 较 表 达 式 将 无 符 号 值 和 零 做 比 较 。 由 于 无 符 号 值 不 可 能 小 于 零 , 因 此 运 行 时 比 较 的结 果 将 总 是 为 true。comparison of unsigned expression < 0 is always false比 较 表 达 式 将 无 符 号 值 和 零 做 比 较 。 由 于 无 符 号 值 不 可 能 小 于 零 , 因 此 运 行 时 比 较 的结 果 将 总 是 为 false。comparisons like X


MPLAB ® <strong>C30</strong> 用 户 指 南concatenation of string literals with __FUNCTION__ is deprecated对 __FUNCTION__ 的 处 理 方 式 将 与 __func__ ( 由 ISO 标 准 C99 定 义 ) 相 同 。__func__ 是 一 个 变 量 , 不 是 字 符 串 常 量 , 因 此 它 不 和 其 他 字 符 串 常 量 连 接 。conflicting types for ‘identifier’指 定 的 标 识 符 有 多 个 不 一 致 的 声 明 。Ddata definition has no type or storage class检 测 到 数 据 定 义 缺 少 类 型 和 存 储 类 别 。data qualifier ‘qualifier’ ignored在 MPLAB <strong>C30</strong> 中 不 使 用 数 据 限 定 符 , 包 括 “access”、“ shared” 和 “overlay”,之 所 以 保 留 它 们 是 为 了 与 MPLAB C17 和 C18 兼 容 。declaration of ‘identifier’ has ‘extern’ and is initialized外 部 标 识 符 不 能 被 初 始 化 。declaration of ‘identifier’ shadows a parameter指 定 的 标 识 符 声 明 屏 蔽 了 一 个 参 数 , 使 得 参 数 不 可 访 问 。declaration of ‘identifier’ shadows a symbol from the parameter list指 定 的 标 识 符 声 明 屏 蔽 了 参 数 列 表 中 的 一 个 符 号 , 使 得 该 符 号 不 可 访 问 。declaration of ‘identifier’ shadows global declaration指 定 的 标 识 符 声 明 屏 蔽 了 一 个 全 局 声 明 , 使 得 该 全 局 符 号 不 可 访 问 。‘identifier’ declared inline after being called指 定 的 函 数 在 被 调 用 之 后 声 明 为 inline。‘identifier’ declared inline after its definition指 定 的 函 数 在 被 定 义 之 后 声 明 为 inline。‘identifier’ declared ‘static’ but never defined指 定 的 函 数 声 明 为 static, 但 从 未 定 义 。decrement of read-only member ‘name’成 员 “name” 声 明 为 const, 不 能 被 递 减 修 改 。decrement of read-only variable ‘name’“name” 声 明 为 const, 不 能 被 递 减 修 改 。‘identifier’ defined but not used指 定 的 函 数 被 定 义 了 , 但 从 未 使 用 。deprecated use of label at end of compound statement标 号 不 能 位 于 语 句 的 结 尾 。 标 号 后 应 该 跟 随 一 条 语 句 。dereferencing ‘void *’ pointer解 引 用 “void *” 指 针 是 不 正 确 的 。 在 解 引 用 这 种 指 针 之 前 , 要 先 将 指 针 强 制 转 换 为 适当 类 型 的 指 针 。division by zero检 测 到 编 译 时 被 零 除 。DS51284C_CN 第 136 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断duplicate ‘const’“const” 限 定 符 只 能 用 于 声 明 一 次 。duplicate ‘restrict’“restrict” 限 定 符 只 能 用 于 声 明 一 次 。duplicate ‘volatile’“volatile” 限 定 符 只 能 用 于 声 明 一 次 。Eembedded ‘\0’ in format当 检 查 对 printf、 scanf 等 调 用 的 参 数 列 表 时 , 编 译 器 发 现 格 式 字 符 串 包 含 “\0”( 零 ), 这 可 能 导 致 格 式 字 符 串 处 理 过 早 终 止 。empty body in an else-statementelse 语 句 为 空 。empty body in an if-statementif 语 句 为 空 。empty declaration声 明 不 包 含 要 声 明 的 名 字 。empty range specifiedcase 范 围 中 的 值 范 围 为 空 , 即 低 表 达 式 的 值 比 高 表 达 式 的 值 大 。 case 范 围 的 语 法 为case low ... high:。‘enum identifier’ declared inside parameter list在 函 数 参 数 列 表 内 部 声 明 了 指 定 的 枚 举 。 良 好 的 编 程 习 惯 是 在 参 数 列 表 外 部 声 明 枚 举 ,因 为 在 参 数 列 表 内 部 定 义 枚 举 时 , 它 们 可 能 不 会 成 为 完 全 类 型 。enum defined inside parms在 函 数 参 数 列 表 内 部 定 义 了 枚 举 。enumeration value ‘identifier’ not handled in switchswitch 语 句 的 控 制 表 达 式 为 枚 举 类 型 , 但 并 非 所 有 的 枚 举 值 都 有 枚 举 值 都 有 case 表 达式 。enumeration values exceed range of largest integer枚 举 值 用 整 型 表 示 。 编 译 器 检 测 到 一 个 枚 举 范 围 用 任 何 MPLAB <strong>C30</strong> 整 型 格 式 , 包 括最 大 的 格 式 都 无 法 表 示 。excess elements in array initializer初 始 化 时 提 供 的 初 值 个 数 比 声 明 的 数 组 元 素 个 数 多 。excess elements in scalar initializer");只 能 对 标 量 变 量 初 始 化 一 次 。excess elements in struct initializer对 结 构 进 行 初 始 化 时 提 供 的 初 值 数 比 声 明 的 结 构 成 员 数 多 。excess elements in union initializer联 合 的 初 始 化 列 表 中 的 成 员 数 比 声 明 的 联 合 成 员 数 多 。© 2005 Microchip Technology Inc. DS51284C_CN 第 137 页


MPLAB ® <strong>C30</strong> 用 户 指 南extra semicolon in struct or union specified结 构 类 型 或 联 合 类 型 包 含 多 余 的 分 号 。extra tokens at end of #‘directive’ directive编 译 器 在 包 含 #‘directive’ 伪 指 令 的 源 代 码 行 中 检 测 到 多 余 的 文 本 。F-ffunction-sections may affect debugging on some targets如 果 同 时 指 定 -g 选 项 和 -ffunction-sections 选 项 , 调 试 时 可 能 会 遇 到 问 题 。first argument of ‘identifier’ should be ‘int’要 求 将 指 定 标 识 符 的 第 一 个 参 数 声 明 为 int 型 。floating constant exceeds range of ‘double’浮 点 型 常 量 长 度 太 大 或 太 小 , 不 能 表 示 为 “double”。floating constant exceeds range of ‘float’浮 点 型 常 量 长 度 太 大 或 太 小 , 不 能 表 示 为 “float”。floating constant exceeds range of ‘long double’浮 点 型 常 量 长 度 太 大 或 太 小 , 不 能 表 示 为 “long double”。floating point overflow in expression当 合 并 一 个 浮 点 型 常 量 表 达 式 时 , 编 译 器 发 现 表 达 式 溢 出 , 即 它 不 能 表 示 为 浮 点 型 。‘type1’ format, ‘type2’ arg (arg ‘num’)格 式 的 类 型 为 “type1”, 但 传 递 的 参 数 类 型 为 “type2”。有 问 题 的 参 数 为 “num” 参 数 。format argument is not a pointer (arg n)当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 指 定 的 参 数 编 号 n 不 是 指针 , 格 式 说 明 符 指 明 它 应 为 一 个 指 针 。format argument is not a pointer to a pointer (arg n)当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 指 定 的 参 数 编 号 n 不 是 指针 , 格 式 说 明 符 指 明 它 应 为 一 个 指 针 。fprefetch-loop-arrays not supported for this target目 标 器 件 不 支 持 生 成 预 取 存 储 器 指 令 的 选 项 。function call has aggregate value函 数 的 返 回 值 为 聚 集 。function declaration isn’t a prototype当 使 用 -Wstrict-prototypes 命 令 行 选 项 编 译 时 , 编 译 器 确 保 为 所 有 函 数 指 定 了函 数 原 型 。 在 本 例 中 , 遇 到 了 之 前 没 有 函 数 原 型 的 函 数 定 义 。function declared ‘noreturn’ has a ‘return’ statement用 noreturn 属 性 声 明 了 函 数 没 有 返 回 值 , 但 函 数 却 包 含 返 回 语 句 。 这 是 不 一 致 的 。DS51284C_CN 第 138 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断function might be possible candidate for attribute ‘noreturn’编 译 器 检 测 到 函 数 不 返 回 。 如 果 用 “noreturn” 属 性 声 明 了 函 数 , 那 么 编 译 器 就 能 生成 更 好 的 代 码 。function returns address of local variable函 数 不 应 返 回 局 部 变 量 的 地 址 , 因 为 当 函 数 返 回 时 , 局 部 变 量 占 用 的 存 储 空 间 被 释 放掉 了 。function returns an aggregate函 数 的 返 回 值 是 聚 集 类 型 。function ‘name’ redeclared as inlineprevious declaration of function ‘name’ with attribute noinline前 面 用 属 性 noinline 声 明 了 函 数 “name”, 现 在 又 用 关 键 字 “inline” 声 明 了 该 函 数来 允 许 函 数 内 联 。function ‘name’ redeclared with attribute noinlineprevious declaration of function ‘name’ was inline前 面 用 “inline” 声 明 了 函 数 “name”, 现 在 又 用 属 性 “noinline” 属 性 声 明 了 该 函 数使 函 数 不 能 被 内 联 。function ‘identifier’ was previously declared within a block前 面 在 一 个 块 中 显 式 声 明 了 指 定 的 函 数 , 而 在 当 前 的 代 码 行 中 又 有 对 该 函 数 的 隐 式 声明 。GGCC does not yet properly implement ‘[*]’ array declarators编 译 器 目 前 不 支 持 长 度 可 变 的 数 组 。Hhex escape sequence out of range十 六 进 制 序 列 必 须 小 于 十 六 进 制 数 100 ( 即 十 进 制 的 256)。Iignoring asm-specifier for non-static local variable ‘identifier’当 对 普 通 的 非 寄 存 器 局 部 变 量 使 用 asm 说 明 符 时 , 这 一 说 明 符 被 忽 略 。ignoring invalid multibyte character当 分 析 一 个 多 字 节 字 符 时 , 编 译 器 确 定 这 一 字 符 是 无 效 的 。 无 效 字 符 被 忽 略 。ignoring option ‘option’ due to invalid debug level specification对 非 有 效 的 调 试 级 别 使 用 了 调 试 选 项 。ignoring #pragma identifierMPLAB <strong>C30</strong> 编 译 器 不 支 持 指 定 的 pragma, 因 此 被 忽 略 。imaginary constants are a GCC extentionISO C 不 允 许 虚 数 数 字 常 量 。implicit declaration of function ‘identifier’指 定 的 函 数 之 前 没 有 显 式 的 声 明 ( 函 数 定 义 或 函 数 原 型 ), 因 此 编 译 器 为 其 假 定 返 回值 类 型 和 参 数 。© 2005 Microchip Technology Inc. DS51284C_CN 第 139 页


MPLAB ® <strong>C30</strong> 用 户 指 南increment of read-only member ‘name’元 素 “name” 声 明 为 const, 不 能 被 递 增 修 改 。increment of read-only variable ‘name’“name” 声 明 为 const, 不 能 被 递 增 修 改 。initialization of a flexible array member灵 活 的 数 组 元 素 是 动 态 分 配 存 储 空 间 的 , 而 不 是 静 态 分 配 的 。‘identifier’ initialized and declared ‘extern’外 部 符 号 不 应 被 初 始 化 。initializer element is not constant初 值 元 素 应 为 常 量 。inline function ‘name’ given attribute noinline函 数 “name” 声 明 为 inline, 但 noinline 属 性 使 该 函 数 不 能 被 内 联 。inlining failed in call to ‘identifier’ called from here编 译 器 不 能 内 联 对 指 定 函 数 的 调 用 。integer constant is so large that it is unsigned源 代 码 中 出 现 的 整 型 常 量 值 没 有 显 式 的 unsigned 修 饰 符 , 但 该 数 字 不 能 表 示 为 signedint ; 因 此 , 编 译 器 自 动 将 其 视 为 unsigned int。integer constant is too large for ‘type’ type对 于 unsigned long int 型 整 型 常 量 , 不 应 超 过 2^32 - 1 ; 对 于 long long int, 不 应 超 过2^63 - 1 ; 对 于 unsigned long long int, 不 应 超 过 2^64 - 1。integer overflow in expression当 合 并 一 个 整 型 常 量 表 达 式 时 , 编 译 器 发 现 表 达 式 溢 出 了 ; 即 它 不 能 表 示 为 int。invalid application of ‘sizeof’ to a function type建 议 不 要 对 函 数 类 型 使 用 sizeof 运 算 符 。invalid application of ‘sizeof’ to a void type不 应 对 void 类 型 使 用 sizeof 运 算 符 。invalid digit ‘digit’ in octal constant所 有 数 字 必 须 在 所 使 用 进 制 的 范 围 内 。 例 如 , 对 于 八 进 制 , 只 能 使 用 数 字 0 到 7。invalid second arg to __builtin_prefetch; using zero第 二 个 参 数 必 须 为 0 或 1。invalid storage class for function ‘name’不 应 对 在 顶 层 定 义 的 函 数 使 用 “auto” 存 储 类 别 。 如 果 函 数 不 是 在 顶 层 定 义 的 , 不 应对 函 数 使 用 “static” 存 储 类 别 。invalid third arg to __builtin_prefetch; using zero第 三 个 参 数 必 须 为 0、 1、 2 或 3。‘identifier’ is an unrecognized format function typeformat 属 性 中 的 指 定 标 识 符 不 是 可 识 别 的 格 式 函 数 类 型 (printf、 scanf 或strftime) 之 一 。DS51284C_CN 第 140 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断‘identifier’ is narrower than values of its type结 构 的 一 个 位 域 成 员 具 有 枚 举 类 型 , 但 位 域 的 宽 度 不 够 , 不 足 以 表 示 所 有 枚 举 值 。‘storage class’ is not at beginning of declaration指 定 的 存 储 类 别 不 在 声 明 的 开 头 。 要 求 在 声 明 中 将 存 储 类 别 放 在 最 前 面 。ISO C does not allow extra ‘;’ outside of a function在 函 数 外 部 发 现 了 多 余 的 “;”。 这 是 ISO C 不 允 许 的 。ISO C does not support ‘++’ and ‘--’ on complex typesISO C 不 支 持 对 复 数 类 型 使 用 递 增 运 算 符 和 递 减 运 算 符 。ISO C does not support ‘~’ for complex conjugation在 ISO C 中 , 不 能 对 共 扼 复 数 使 用 按 位 取 反 运 算 符 。ISO C does not support complex integer typesISO C 不 支 持 复 数 整 型 , 如 __complex__ short int。ISO C does not support plain ‘complex’ meaning ‘double complex’使 用 不 加 其 他 修 饰 符 的 __complex__ 与 ISO C 中 不 支 持 的 “complex double” 等价 。ISO C does not support the ‘char’ ‘kind of format’ formatISO C 不 支 持 对 指 定 的 “ 格 式 类 型 ” 使 用 说 明 字 符 “char”。ISO C doesn’t support unnamed structs/unionsISO C 要 求 所 有 的 结 构 和 / 或 联 合 都 有 名 字 。ISO C forbids an empty source file文 件 不 包 含 函 数 或 数 据 。 这 是 ISO C 不 允 许 的 。ISO C forbids empty initializer bracesISO C 要 求 将 初 值 括 在 大 括 号 内 。ISO C forbids nested functions在 一 个 函 数 内 定 义 了 另 外 一 个 函 数 。ISO C forbids omitting the middle term of a ?: expression要 求 在 条 件 表 达 式 的 “?” 和 “:” 之 间 要 有 中 间 项 或 表 达 式 。ISO C forbids qualified void function return type不 能 对 void 函 数 返 回 值 类 型 使 用 限 定 符 。ISO C forbids range expressions in switch statementsISO C 不 允 许 在 单 个 case 标 号 中 指 定 连 续 值 的 范 围 。ISO C forbids subscripting ‘register’ arrayISO C 不 允 许 对 “ 寄 存 器 ” 数 组 加 下 标 。ISO C forbids taking the address of a labelISO C 不 允 许 取 标 号 的 地 址 。ISO C forbids zero-size array ‘name’“name” 数 组 的 长 度 必 须 大 于 零 。© 2005 Microchip Technology Inc. DS51284C_CN 第 141 页


MPLAB ® <strong>C30</strong> 用 户 指 南ISO C restricts enumerator values to range of ‘int’枚 举 值 的 范 围 不 能 超 过 int 类 型 的 范 围 。ISO C89 forbids compound literals复 合 立 即 数 在 ISO C89 中 无 效 。ISO C89 forbids mixed declarations and code应 在 写 任 何 代 码 之 前 先 进 行 声 明 。 不 要 将 声 明 和 代 码 混 合 在 一 起 。ISO C90 does not support ‘[*]’ array declaratorsISO C90 不 支 持 可 变 长 度 的 数 组 。ISO C90 does not support complex typesISO C90 不 支 持 复 数 类 型 , 如 __complex__ float x。ISO C90 does not support flexible array members灵 活 的 数 组 元 素 是 C99 的 一 个 新 特 性 。 ISO C90 不 支 持 灵 活 的 数 组 元 素 。ISO C90 does not support ‘long long’ISO C90 不 支 持 long long 类 型 。ISO C90 does not support ‘static’ or type qualifiers in parameter arraydeclarators当 使 用 一 个 数 组 作 为 函 数 的 参 数 时 , ISO C90 不 允 许 数 组 声 明 使 用 “static” 或 类 型限 定 符 。ISO C90 does not support the ‘char’ ‘function’ formatISO C 不 支 持 对 指 定 的 函 数 格 式 使 用 说 明 字 符 “char”。ISO C90 does not support the ‘modifier’ ‘function’ length modifier不 支 持 将 指 定 修 饰 符 作 用 作 给 定 函 数 的 长 度 修 饰 符 。ISO C90 forbids variable-size array ‘name’在 ISO C90 中 , 必 须 通 过 整 型 常 量 表 达 式 来 指 定 数 组 中 的 元 素 个 数 。Llabel ‘identifier’ defined but not used定 义 了 指 定 的 标 号 , 但 未 引 用 。large integer implicitly truncated to unsigned type源 代 码 中 的 某 个 整 型 常 量 值 没 有 显 式 的 unsigned 修 饰 符 , 但 该 数 值 不 能 表 示 为 signedint ; 因 此 , 编 译 器 自 动 将 这 个 整 型 常 量 值 视 为 unsigned int。left-hand operand of comma expression has no effect比 较 的 一 个 操 作 数 为 提 升 的 ~unsigned, 但 另 一 个 操 作 数 为 unsigned。left shift count >= width of type移 位 位 数 不 应 小 于 被 移 位 的 类 型 中 的 位 数 。 否 则 , 移 位 没 有 意 义 , 且 结 果 不 确 定 。left shift count is negative移 位 位 数 应 该 为 正 数 。 负 的 左 移 位 数 并 不 意 味 着 右 移 ; 这 是 没 有 意 义 的 。DS51284C_CN 第 142 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断library function ‘identifier’ declared as non-function指 定 的 符 号 与 某 个 库 函 数 具 有 相 同 的 名 字 , 但 被 声 明 为 其 他 , 而 没 有 被 声 明 为 函 数 。line number out of rangeC89 中 #line 伪 指 令 的 行 号 限 制 为 32767, C99 中 这 个 值 为 2147483647。‘identifier’ locally external but globally static指 定 的 标 识 符 是 局 部 外 部 , 但 全 局 静 态 的 。 这 样 会 出 现 问 题 。location qualifier ‘qualifier’ ignoredMPLAB <strong>C30</strong> 中 不 使 用 位 置 限 定 符 , 包 括 “gpr” 和 “sfr”, 之 所 以 保 留 是 为 了 与MPLAB C17 和 C18 兼 容 。‘long’ switch expression not converted to ‘int’ in ISO CISO C 不 将 “long” switch 表 达 式 转 换 为 “int”。M‘main’ is usually a function标 识 符 main 通 常 用 作 应 用 程 序 的 主 入 口 点 的 名 字 。 编 译 器 检 测 到 以 其 他 方 式 使 用 了main, 如 将 其 作 为 变 量 的 名 字 。‘operation’ makes integer from pointer without a cast指 针 被 隐 式 地 转 换 为 整 型 。‘operation’ makes pointer from integer without a cast整 型 被 隐 式 地 转 化 为 指 针 。malformed ‘#pragma pack-ignored’pack pragma 的 语 法 不 正 确 。malformed ‘#pragma pack(pop[,id])-ignored’pack pragma 的 语 法 不 正 确 。malformed ‘#pragma pack(push[,id],)-ignored’pack pragma 的 语 法 不 正 确 。malformed ‘#pragma weak-ignored’weak pragma 的 语 法 不 正 确 。‘identifier’ might be used uninitialized in this function编 译 器 检 测 到 一 个 函 数 中 可 能 使 用 了 未 初 始 化 的 指 定 标 识 符 。missing braces around initializer初 始 化 两 边 缺 少 大 括 号 。missing initializer缺 少 初 始 化 。modification by ‘asm’ of read-only variable ‘identifier’const 变 量 在 “asm “ 语 句 中 赋 值 的 左 侧 。multi-character character constant字 符 常 量 包 含 多 个 字 符 。© 2005 Microchip Technology Inc. DS51284C_CN 第 143 页


MPLAB ® <strong>C30</strong> 用 户 指 南Nnegative integer implicitly converted to unsigned type源 代 码 中 的 负 整 型 常 量 值 不 能 表 示 为 signed int ; 因 此 编 译 器 将 其 自 动 视 为 unsignedint。nested extern declaration of ‘identifier’指 定 的 标 识 符 有 嵌 套 的 extern 定 义 。no newline at end of file源 文 件 的 最 后 一 行 没 有 以 换 行 符 结 束 。no previous declaration for ‘identifier’当 采 用 -Wmissing-declarations 命 令 行 选 项 编 译 时 , 编 译 器 确 保 函 数 在 定 义 之 前声 明 。 在 本 例 中 , 遇 到 了 之 前 没 有 函 数 声 明 的 函 数 定 义 。no previous prototype for ‘identifier’当 使 用 -Wmissing-prototypes 命 令 行 选 项 编 译 时 , 编 译 器 确 保 为 所 有 函 数 指 定 函数 原 型 。 在 本 例 中 , 遇 到 了 之 前 没 有 函 数 原 型 的 函 数 定 义 。no semicolon at end of struct or union在 结 构 或 联 合 声 明 的 结 尾 缺 少 分 号 。non-ISO-standard escape sequence, ‘seq’“seq” 为 “\e” 或 “\E”, 这 是 对 ISO 标 准 的 扩 展 。 这 个 序 列 可 用 在 字 符 串 或 字 符 常量 中 , 代 表 ASCII 字 符 。non-static declaration for ‘identifier’ follows static指 定 的 标 识 符 先 前 被 声 明 为 static, 又 声 明 为 非 static。‘noreturn’ function does return用 noreturn 属 性 声 明 的 函 数 返 回 了 。 这 是 不 一 致 的 。‘noreturn’ function returns non-void value用 noreturn 属 性 声 明 的 函 数 返 回 了 非 void 值 。 这 是 不 一 致 的 。null format string当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 缺 少 格 式 字 符 串 。Ooctal escape sequence out of range八 进 制 序 列 必 须 小 于 八 进 制 表 示 的 400 ( 即 十 进 制 的 256)。output constraint ‘constraint’ for operand n is not at the beginning扩 展 asm 中 的 输 出 约 束 应 该 在 开 头 。overflow in constant expression常 量 表 达 式 超 出 了 其 类 型 可 表 示 的 值 的 范 围 。overflow in implicit constant conversion隐 式 常 量 转 换 得 到 了 不 能 表 示 为 signed int 的 数 值 ; 因 此 编 译 器 自 动 将 其 按 unsignedint 处 理 。DS51284C_CN 第 144 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断Pparameter has incomplete type函 数 参 数 为 不 完 全 类 型 。parameter names (without types) in function declaration函 数 声 明 列 出 了 参 数 的 名 字 , 但 没 有 指 定 参 数 的 类 型 。parameter points to incomplete type函 数 参 数 指 向 不 完 全 类 型 。parameter ‘identifier’ points to incomplete type指 定 的 函 数 参 数 指 向 不 完 全 类 型 。passing arg ‘number’ of ‘name’ as complex rather than floating due to prototype原 型 将 参 数 “number” 声 明 为 复 数 , 但 使 用 了 float, 因 此 编 译 器 将 其 转 换 为 复 数 以 符合 原 型 。passing arg ‘number’ of ‘name’ as complex rather than integer due to prototype原 型 将 参 数 “number” 声 明 为 复 数 , 但 使 用 了 整 型 值 , 因 此 编 译 器 将 其 转 换 为 复 数 以符 合 原 型 。passing arg ‘number’ of ‘name’ as floating rather than complex due to prototype原 型 将 参 数 “number” 声 明 为 float, 但 使 用 了 复 数 值 , 因 此 编 译 器 将 其 转 换 为 float型 以 符 合 原 型 。passing arg ‘number’ of ‘name’ as ‘float’ rather than ‘double’ due to prototype原 型 将 参 数 “number” 声 明 为 float, 但 使 用 了 double 值 , 因 此 编 译 器 将 其 转 换 为float 以 符 合 原 型 。passing arg ‘number’ of ‘name’ as floating rather than integer due to prototype原 型 将 参 数 “number” 声 明 为 float, 但 使 用 了 整 型 值 , 因 此 编 译 器 将 其 转 换 为 float以 符 合 原 型 。passing arg ‘number’ of ‘name’ as integer rather than complex due to prototype原 型 将 参 数 “number” 声 明 为 整 型 , 但 使 用 了 复 数 型 值 , 因 此 编 译 器 将 其 转 换 为 整 型以 符 合 原 型 。passing arg ‘number’ of ‘name’ as integer rather than floating due to prototype原 型 将 参 数 “number” 声 明 为 整 型 , 但 使 用 了 double 值 , 因 此 编 译 器 将 其 转 换 为 整型 以 符 合 原 型 。pointer of type ‘void *’ used in arithmetic“void” 类 型 的 指 针 长 度 未 知 , 不 能 在 算 术 中 使 用 。pointer to a function used in arithmetic不 能 在 算 术 中 使 用 指 向 函 数 的 指 针 。previous declaration of ‘identifier’这 条 警 告 消 息 与 另 一 条 警 告 消 息 一 起 出 现 。 前 一 条 消 息 标 识 有 问 题 代 码 的 位 置 。 这 条消 息 标 识 标 识 符 的 第 一 次 声 明 或 定 义 。previous implicit declaration of ‘identifier’这 条 警 告 消 息 与 警 告 消 息 “type mismatch with previous implicit declaration” 一 起 出现 。 它 指 出 与 标 识 符 的 显 式 声 明 冲 突 的 隐 式 声 明 的 位 置 。© 2005 Microchip Technology Inc. DS51284C_CN 第 145 页


MPLAB ® <strong>C30</strong> 用 户 指 南R“name” re-asserted“name” 的 应 答 发 生 重 复 。“name” redefined“name” 先 前 已 定 义 , 现 在 又 被 再 次 定 义 。redefinition of ‘identifier’指 定 的 标 识 符 有 多 个 不 一 致 的 定 义 。redundant redeclaration of ‘identifier’ in same scope指 定 的 标 识 符 在 同 一 作 用 域 中 再 次 声 明 。 这 是 多 余 的 。register used for two global register variables两 个 全 局 寄 存 器 变 量 定 义 为 使 用 同 一 个 寄 存 器 。repeated ‘flag’ flag in format当 检 查 对 strftime 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 格 式 字 符 串 中 有 一 个 重 复 的 标 志 。当 检 查 对 printf、scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 格 式 字 符 串 中 标 志{ ,+,#,0,-} 之 一 重 复 。return-type defaults to ‘int’在 没 有 显 式 的 函 数 返 回 值 类 型 声 明 的 情 况 下 , 编 译 器 假 定 函 数 返 回 int。return type of ‘name’ is not ‘int’编 译 器 要 求 “name” 的 返 回 值 类 型 为 “int”。‘return’ with a value, in function returning void函 数 声 明 为 void, 但 返 回 了 值 。‘return’ with no value, in function returning non-void声 明 为 返 回 非 void 值 的 函 数 包 含 了 没 有 值 的 返 回 语 句 。 这 是 不 一 致 的right shift count >= width of type移 位 位 数 应 该 小 于 被 移 位 的 类 型 的 位 数 。 否 则 移 位 没 有 意 义 , 结 果 不 确 定 。right shift count is negative移 位 位 数 应 该 为 正 值 。 负 的 右 移 位 数 并 不 意 味 着 左 移 ; 这 是 没 有 意 义 的 。Ssecond argument of ‘identifier’ should be ‘char **’要 求 指 定 标 识 符 的 第 二 个 参 数 为 “char **” 型 。second parameter of ‘va_start’ not last named argument“va_start” 的 第 二 个 参 数 必 须 为 最 后 指 定 的 参 数 。shadowing built-in function ‘identifier’指 定 的 函 数 与 某 内 建 函 数 名 字 相 同 , 因 此 屏 蔽 了 该 内 建 函 数 。shadowing library function ‘identifier’指 定 的 函 数 与 某 个 库 函 数 名 字 相 同 , 因 此 屏 蔽 了 该 库 函 数 。DS51284C_CN 第 146 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断shift count >= width of type移 位 位 数 应 该 小 于 被 移 位 的 类 型 中 的 位 数 。 否 则 移 位 没 有 意 义 , 结 果 不 确 定 。shift count is negative移 位 位 数 应 该 为 正 。 负 的 左 移 位 数 并 不 意 味 着 右 移 , 负 的 右 移 位 数 也 并 不 意 味 着 左 移; 这 是 没 有 意 义 的 。size of ‘name’ is larger than n bytes当 “name” 的 长 度 大 于 定 义 的 len 字 节 时 , 使 用 -Wlarger-than-len 将 发 出 上 述警 告 。size of ‘identifier’ is n bytes指 定 标 识 符 的 长 度 (n 字 节 ) 大 于 使 用 -Wlarger-than-len 命 令 行 选 项 指 定 的 长度 。size of return value of ‘name’ is larger than n bytes当 “name” 的 返 回 值 的 长 度 大 于 定 义 的 len 字 节 时 , 使 用 -Wlarger-than-len 将发 出 上 述 警 告 。size of return value of ‘identifier’ is n bytes指 定 函 数 的 返 回 值 的 长 度 为 n 字 节 , 大 于 使 用 -Wlarger-than-len 命 令 行 选 项 指 定的 长 度 。spurious trailing ‘%’ in format当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 格 式 字 符 串 中 有 一 个 伪 拖尾 “%” 字 符 。statement with no effect语 句 没 有 作 用 。static declaration for ‘identifier’ follows non-static指 定 的 标 识 符 在 先 前 声 明 为 非 static 后 , 又 声 明 为 static。string length ‘n’ is greater than the length ‘n’ ISO Cn compilers are required tosupportISO C89 支 持 的 最 大 字 符 串 长 度 为 509。 ISO C99 支 持 的 最 大 字 符 串 长 度 为 4095。‘struct identifier’ declared inside parameter list在 函 数 参 数 列 表 内 部 声 明 了 指 定 的 函 数 。 良 好 的 编 程 习 惯 是 在 参 数 列 表 外 部 声 明 结 构 ,因 为 当 在 参 数 列 表 内 部 定 义 结 构 时 , 结 构 不 能 成 为 完 全 类 型 。struct has no members结 构 为 空 的 , 不 包 含 成 员 。structure defined inside parms在 函 数 参 数 列 表 内 部 定 义 了 联 合 。style of line directive is a GCC extension对 于 传 统 C, 要 使 用 格 式 “#line linenum”。subscript has type ‘char’数 组 下 标 为 类 型 “char”。suggest explicit braces to avoid ambiguous ‘else’嵌 套 的 if 语 句 具 有 不 明 确 的 else 子 句 。 建 议 使 用 大 括 号 来 去 除 这 种 不 明 确 。© 2005 Microchip Technology Inc. DS51284C_CN 第 147 页


MPLAB ® <strong>C30</strong> 用 户 指 南suggest hiding #directive from traditional C with an indented #传 统 C 不 支 持 指 定 的 伪 指 令 , 可 通 过 缩 进 # 来 “ 隐 藏 ”。除 非 伪 指 令 的 # 在 弟 1 列 , 否 则 伪 指 令 被 忽 略 。suggest not using #elif in traditional C不 应 在 传 统 的 K&R C 中 使 用 #elif。suggest parentheses around assignment used as truth value当 将 赋 值 用 作 真 值 表 时 , 赋 值 的 两 边 要 有 圆 括 号 , 以 使 读 者 清 楚 源 程 序 的 意 图 。suggest parentheses around + or - inside shiftsuggest parentheses around && within ||suggest parentheses around arithmetic in operand of |suggest parentheses around comparison in operand of |suggest parentheses around arithmetic in operand of ^suggest parentheses around comparison in operand of ^suggest parentheses around + or - in operand of &suggest parentheses around comparison in operand of &当 在 C 中 定 义 好 了 运 算 符 优 先 顺 序 时 , 如 果 表 达 式 的 读 者 仅 依 靠 优 先 规 则 而 不 看 显 式的 括 号 的 话 , 有 时 读 者 可 能 需 要 花 一 点 时 间 来 理 解 表 达 式 中 运 算 符 的 求 值 顺 序 。 一 个例 子 是 移 位 中 “+” 或 “-” 运 算 符 的 使 用 。 即 使 意 图 对 于 编 程 人 员 和 编 译 器 都 很 明 确的 情 况 下 , 如 果 使 用 括 号 来 明 确 表 明 编 程 人 员 的 意 图 的 话 , 许 多 读 者 就 不 用 费 力 来 理解 表 达 式 了 。T‘identifier’ takes only zero or two arguments仅 需 要 零 或 两 个 参 数 。the meaning of ‘\a’ is different in traditional C当 使 用 -wtraditional 选 项 时 , 转 义 序 列 “\a” 没 有 被 识 别 为 meta 序 列 : 其 值 就是 “a”。 在 非 传 统 编 译 中 ,“\a” 表 示 ASCII BEL 字 符 。the meaning of ‘\x’ is different in traditional C当 使 用 -wtraditional 选 项 时 , 转 义 序 列 “\x” 没 有 被 识 别 为 meta 序 列 : 其 值 就是 “x”。 在 非 传 统 编 译 中 ,“\x” 引 入 一 个 十 六 进 制 转 义 序 列 。third argument of ‘identifier’ should probably be ‘char **’要 求 指 定 标 识 符 的 第 三 个 参 数 为 类 型 “char **”。this function may return with or without a value非 void 函 数 的 所 有 出 口 都 应 返 回 一 个 适 当 的 值 。 编 译 器 检 测 到 一 个 非 void 函 数 有 时 有显 式 的 返 回 值 , 有 时 没 有 。 因 此 返 回 值 可 能 是 不 可 预 估 的 。this target machine does not have delayed branches不 支 持 -fdelayed-branch 选 项 。too few arguments for format当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 实 际 参 数 的 个 数 比 格 式 字符 串 要 求 的 少 。DS51284C_CN 第 148 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断too many arguments for format当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 实 际 参 数 的 个 数 比 格 式 字符 串 要 求 的 多 。traditional C ignores #‘directive’ with the # indented如 果 伪 指 令 的 # 不 在 第 1 列 , 传 统 C 忽 略 伪 指 令 。traditional C rejects initialization of unions在 传 统 C 中 , 联 合 不 能 被 初 始 化traditional C rejects the ‘ul’ suffix传 统 C 中 , 后 缀 “u” 无 效 。traditional C rejects the unary plus operator传 统 C 中 , 单 目 加 运 算 符 无 效 。trigraph ??char converted to char三 字 母 组 合 , 为 三 字 符 序 列 , 可 用 于 表 示 键 盘 中 可 能 没 有 的 符 号 。 三 字 母 组 合 序 列 按照 如 下 进 行 转 换 :??( = [ ??) = ] ??< = { ??> = } ??= = # ??/ = \ ??’ = ^ ??! = | ??- = ~trigraph ??char ignored三 字 母 组 合 序 列 被 忽 略 。 char 可 能 为 (, )、 、 =、 /、 '、 ! 或 -。type defaults to ‘int’ in declaration of ‘identifier’在 指 定 的 标 识 符 没 有 显 式 的 类 型 声 明 的 情 况 下 , 编 译 器 假 定 其 类 型 为 int。type mismatch with previous external declprevious external decl of ‘identifier’指 定 标 识 符 的 类 型 与 先 前 的 声 明 不 匹 配 。type mismatch with previous implicit declaration显 式 声 明 与 先 前 的 隐 式 声 明 冲 突 。type of ‘identifier’ defaults to ‘int’当 标 识 符 没 有 显 式 的 类 型 声 明 时 , 编 译 器 假 定 标 识 符 的 类 型 为 int。type qualifiers ignored on function return type对 函 数 返 回 值 类 型 使 用 的 类 型 限 定 符 被 忽 略 了 。Uundefining ‘defined’“defined” 不 能 用 作 宏 名 , 不 能 被 undefine。undefining ‘name’对 先 前 定 义 的 宏 名 “name” 使 用 了 #undef 伪 指 令 。union cannot be made transparent对 联 合 使 用 了 transparent_union 属 性 , 但 指 定 的 变 量 不 满 足 该 属 性 的 要 求 。‘union identifier’ declared inside parameter list在 函 数 参 数 列 表 内 部 声 明 了 指 定 的 联 合 。 良 好 的 编 程 习 惯 是 在 参 数 列 表 外 部 声 明 联 合 ,因 为 当 在 参 数 列 表 内 部 定 义 联 合 时 , 联 合 不 能 成 为 完 全 类 型 。© 2005 Microchip Technology Inc. DS51284C_CN 第 149 页


MPLAB ® <strong>C30</strong> 用 户 指 南union defined inside parms在 函 数 参 数 列 表 内 部 定 义 了 联 合 。union has no members联 合 是 空 的 , 不 包 含 成 员 。unknown conversion type character ‘character’ in format当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 格 式 字 符 串 中 的 一 个 转 换字 符 是 无 效 的 ( 不 可 识 别 )。unknown conversion type character 0xnumber in format当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 格 式 字 符 串 中 的 一 个 转 换字 符 是 无 效 的 ( 不 可 识 别 )。unknown escape sequence ‘sequence’“sequence” 不 是 一 个 有 效 的 转 义 代 码 。 转 义 代 码 必 须 以 “\” 开 头 , 并 使 用 下 列 字 符之 一 :n, t, b, r, f, b, \, ', ", a 或 ?, 或 者 它 必 须 为 八 进 制 或 十 六 进 制 数 字 。 如 果 为 八 进 制数 字 , 数 字 序 列 必 须 小 于 八 进 制 的 400。 如 果 是 十 六 进 制 数 字 , 数 字 序 列 必 须 以 “x”开 头 , 必 须 小 于 十 六 进 制 的 100。unnamed struct/union that defines no instances结 构 / 联 合 是 空 的 , 且 没 有 名 字 。unreachable code at beginning of identifier在 指 定 函 数 的 开 头 有 不 可 到 达 的 代 码 。unrecognized gcc debugging option: char“char” 对 于 -dletters 调 试 选 项 不 是 有 效 的 字 母 。unused parameter ‘identifier’指 定 的 函 数 参 数 在 该 函 数 中 未 使 用 。unused variable ‘name’声 明 了 指 定 的 变 量 , 但 未 使 用 。use of ‘*’ and ‘flag’ together in format当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 格 式 字 符 串 中 出 现 了 标 志“*” 和 “flag”。use of C99 long long integer constantsISO C89 中 不 允 许 将 整 型 常 量 声 明 为 long long。use of ‘length’ length modifier with ‘type’ type character当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 对 指 定 的 类 型 错 误 地 使 用了 指 定 的 长 度 。‘name’ used but never defined使 用 了 指 定 的 函 数 , 但 从 未 定 义 。‘name’ used with ‘spec’ ‘function’ format“name” 对 于 指 定 函 数 的 格 式 中 的 转 换 说 明 无 效 。useless keyword or type name in empty declaration空 声 明 包 含 无 用 的 关 键 字 或 类 型 名 。DS51284C_CN 第 150 页© 2005 Microchip Technology Inc.


MPLAB <strong>C30</strong> C 编 译 器 诊 断V__VA_ARGS__ can only appear in the expansion of a C99 variadic macro应 将 预 定 义 的 宏 __VA_ARGS 用 于 使 用 省 略 号 的 宏 定 义 的 替 换 部 分 中 。value computed is not used一 个 计 算 的 值 未 使 用 。variable ‘name’ declared ‘inline’只 能 对 函 数 使 用 关 键 字 “inline”。variable ‘%s’ might be clobbered by ‘longjmp’ or ‘vfork’非 volatile 的 自 动 变 量 可 能 被 longjmp 调 用 更 改 。 仅 在 优 化 编 译 时 才 可 能 出 现 这 些 警告 。volatile register variables don’t work as you might wish将 一 个 变 量 作 为 参 数 传 递 可 能 将 变 量 传 递 到 另 外 的 寄 存 器 (W0-W7) 中 , 而 不 是 为 参数 传 递 指 定 的 寄 存 器 ( 如 果 不 是 W0-W7) 中 。 或 者 编 译 器 可 能 发 出 一 条 不 适 合 于 指定 寄 存 器 的 指 令 , 并 可 能 需 要 暂 时 将 值 移 动 到 其 他 地 方 仅 当 指 定 的 寄 存 器 被 异 步 修 改( 即 通 过 中 断 服 务 程 序 ) 时 才 会 有 问 题 。W-Wformat-extra-args ignored without -Wformat为 使 用 -Wformat-extra-args, 必 须 指 定 -Wformat。-Wformat-nonliteral ignored without -Wformat为 使 用 -Wformat-nonliteral, 必 须 指 定 -Wformat。-Wformat-security ignored without -Wformat为 使 用 -Wformat-security,, 必 须 指 定 -Wformat。-Wformat-y2k ignored without -Wformat为 使 用 -Wformat-y2k, 必 须 指 定 -Wformat。-Wid-clash-LEN is no longer supported不 再 支 持 -Wid-clash-LEN。-Wmissing-format-attribute ignored without -Wformat为 使 用 -Wmissing-format-attribute, 必 须 指 定 -Wformat。-Wuninitialized is not supported without -O为 使 用 -Wuninitialized, 必 须 启 用 优 化 。‘identifier’ was declared ‘extern’ and later ‘static’指 定 的 标 识 符 先 前 被 声 明 为 “extern”, 现 在 又 被 声 明 为 static。‘identifier’ was declared implicitly ‘extern’ and later ‘static’指 定 的 标 识 符 先 前 被 隐 式 声 明 为 “extern”, 现 在 又 被 声 明 为 static。‘identifier’ was previously implicitly declared to return ‘int’存 在 一 个 与 先 前 的 隐 式 声 明 的 不 匹 配 。© 2005 Microchip Technology Inc. DS51284C_CN 第 151 页


MPLAB ® <strong>C30</strong> 用 户 指 南‘identifier’ was used with no declaration before its definition当 使 用 -Wmissing-declarations 命 令 行 选 项 编 译 时 , 编 译 器 确 保 在 定 义 函 数 前 声明 函 数 。 在 本 例 中 , 遇 到 了 事 先 没 有 函 数 声 明 的 函 数 定 义 。‘identifier’ was used with no prototype before its definition当 使 用 -Wmissing-prototypes 命 令 行 选 项 编 译 时 , 编 译 器 确 保 为 所 有 函 数 指 定 函数 原 型 。 在 这 种 情 况 下 , 遇 到 了 被 调 用 函 数 事 先 没 有 函 数 原 型 的 函 数 调 用 。writing into constant object (arg n)当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 指 定 参 数 编 号 n 是 一 个 常量 对 象 , 格 式 说 明 符 指 明 要 写 这 个 常 量 对 象 。Zzero-length identifier format string当 检 查 对 printf、 scanf 等 的 调 用 的 参 数 列 表 时 , 编 译 器 发 现 格 式 字 符 串 是 空 的 (“”)。DS51284C_CN 第 152 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南附 录 C MPLAB C18 与 MPLAB <strong>C30</strong> C 编 译 器 比 较C.1 简 介本 章 的 目 的 是 着 重 介 绍 MPLAB C18 和 MPLAB <strong>C30</strong> C 编 译 器 的 区 别 。 关 于 MPLABC18 编 译 器 的 更 多 细 节 , 请 参 阅 《MPLAB C18 C 编 译 器 用 户 指 南 》(DS51288C_CN)。本 章 讨 论 两 种 编 译 器 在 以 下 方 面 的 区 别 :• 数 据 格 式• 指 针• 存 储 类 别 和 函 数 参 数• 存 储 限 定 符• 预 定 义 宏 名• 整 型 的 提 升• 数 字 常 量• 字 符 串 常 量• 匿 名 结 构• 快 速 存 取 存 储 区• 行 内 汇 编• Pragma 伪 指 令• 存 储 模 型• 调 用 约 定• 启 动 代 码• 编 译 器 管 理 的 资 源• 优 化• 目 标 模 块 格 式• 实 现 定 义 的 操 作• 位 域© 2005 Microchip Technology Inc. DS51284C_CN 第 153 页


MPLAB ® <strong>C30</strong> 用 户 指 南C.2 数 据 格 式C.3 指 针C.4 存 储 类 别C.5 堆 栈 使 用表 C-1:表 C-2:表 C-3:数 据 格 式 中 的 位 数MPLAB C18 浮 点 型 与 MPLAB <strong>C30</strong> IEEE-754 格 式指 针 的 位 数MPLAB C18 允 许 对 变 量 使 用 非 ANSI 的 存 储 类 别 修 饰 符 overlay, 对 函 数 参 数 使 用非 ANSI 的 存 储 类 别 修 饰 符 auto 或 static。MPLAB <strong>C30</strong> 不 允 许 这 些 修 饰 符 。表 C-4:数 据 格 式 MPLAB C18 (1) MPLAB <strong>C30</strong> (2)char 8 8int 16 16short long 24 -long 32 32long long - 64float 32 32double 32 32 或 64 (3)注 1: MPLAB C18 使 用 自 己 的 数 据 格 式 , 类 似 于 IEEE-754 格 式 , 但 最 高 九 位 有 所 不 同( 参 见 表 C-2)。2: MPLAB <strong>C30</strong> 使 用 IEEE-754 格 式 。3: 参 见 第 5.5 节 “ 浮 点 型 ”。标 准 字 节 3 字 节 2 字 节 1 字 节 0MPLAB <strong>C30</strong> seeeeeee1 e 0 ddd dddd16 dddd dddd8 dddd dddd0MPLAB C18 eeeeeeee0 sddd dddd16 dddd dddd8 dddd dddd0其 中 :s = 符 号 位 , d = 尾 数 , e = 指 数存 储 器 类 型 MPLAB C18 MPLAB <strong>C30</strong>程 序 存 储 器 - Near 16 16程 序 存 储 器 - Far 24 16数 据 存 储 器 16 16使 用 的 堆 栈 类 型堆 栈 中 的 项 MPLAB C18 MPLAB <strong>C30</strong>返 回 地 址 硬 件 软 件局 部 变 量 软 件 软 件DS51284C_CN 第 154 页© 2005 Microchip Technology Inc.


MPLAB C18 与 MPLAB <strong>C30</strong> C 编 译 器 比 较C.6 存 储 限 定 符MPLAB C18 使 用 非 ANSI 的 far、 near、 rom 和 ram 类 型 限 定 符 。MPLAB <strong>C30</strong> 使 用 非 ANSI 的 far、 near 和 space 属 性 。例 C-1:定 义 NEAR 变 量C18: near int gVariable;<strong>C30</strong>: __attribute__((near)) int gVariable;例 C-2:定 义 FAR 变 量C18: far int gVariable;<strong>C30</strong>: __attribute__((far)) int gVariable;例 C-3:生 成 在 程 序 存 储 器 中 的 变 量C18: rom int gArray[6] = {0,1,2,3,4,5};<strong>C30</strong>: __attribute__((section(".romdata"), space(prog) ))int gArray[6] = {0,1,2,3,4,5};C.7 预 定 义 宏 名MPLAB C18 定 义 了 __18CXX, __18F242,…… ( 所 有 其 他 以 __ 为 前 缀 的 处 理器 ), 以 及 __SMALL__ 或 __LARGE__, 这 取 决 于 所 选 择 的 存 储 模 型 。MPLAB <strong>C30</strong> 定 义 了 __dsPI<strong>C30</strong>。C.8 整 型 的 提 升MPLAB C18 按 照 最 大 操 作 数 的 大 小 执 行 整 型 的 提 升 , 即 使 两 个 操 作 数 长 度 都 小 于int。 MPLAB C18 提 供 了 -Oi+ 选 项 来 与 标 准 符 合 。MPLAB <strong>C30</strong> 按 照 ISO 的 要 求 , 以 int 精 度 或 更 高 精 度 执 行 整 型 的 提 升 。C.9 字 符 串 常 量MPLAB C18 将 字 符 串 常 量 保 存 在 程 序 存 储 器 中 的 .stringtable 段 中 。MPLAB C18支 持 字 符 串 函 数 的 几 种 形 式 。 例 如 , strcpy 函 数 有 四 种 形 式 , 允 许 将 字 符 串 从 数 据存 储 器 和 程 序 存 储 器 拷 贝 到 数 据 存 储 器 和 程 序 存 储 器 。MPLAB <strong>C30</strong> 通 过 PSV 窗 口 来 访 问 数 据 存 储 器 或 程 序 存 储 器 中 的 字 符 串 常 量 , 允 许 像 访问 任 何 其 他 数 据 一 样 访 问 常 量 。© 2005 Microchip Technology Inc. DS51284C_CN 第 155 页


MPLAB ® <strong>C30</strong> 用 户 指 南C.10 匿 名 结 构MPLAB C18 支 持 非 ANSI 的 联 合 内 匿 名 结 构 。MPLAB <strong>C30</strong> 不 支 持 匿 名 结 构 。C.11 快 速 存 取 存 储 区dsPI<strong>C30</strong>F 器 件 没 有 快 速 存 取 存 储 区 。C.12 行 内 汇 编MPLAB C18 使 用 非 ANSI 的 _asm 和 _endasm 来 标 识 行 内 汇 编 程 序 块 。MPLAB <strong>C30</strong> 使 用 非 ANSI 的 asm, 它 看 起 来 很 像 函 数 调 用 。MPLAB <strong>C30</strong> 中 asm 语 句 的使 用 在 第 8.4 节 “ 使 用 行 内 汇 编 ” 中 详 述 。C.13 PRAGMA 伪 指 令MPLAB C18 使 用 pragma 伪 指 令 来 声 明 段 (code、 romdata、 udata 和 idata)、中 断 ( 高 优 先 级 和 低 优 先 级 ) 和 变 量 分 配 ( 存 储 区 、 段 )。MPLAB <strong>C30</strong> 使 用 非 ANSI 的 属 性 , 不 使 用 pragma 伪 指 令 。表 C-5:例 C-4:MPLAB C18 PRAGMA 伪 指 令 和 MPLAB <strong>C30</strong> 属 性Pragma (MPLAB C18) 属 性 (MPLAB <strong>C30</strong>)#pragma udata [name] __attribute__ ((section ("name")))#pragma idata [name] __attribute__ ((section ("name")))#pragma romdata [name] __attribute__ ((space (prog)))#pragma code [name]__attribute__ ((section ("name"))),__attribute__ ((space (prog)))#pragma interruptlow __attribute__ ((interrupt))#pragma interrupt__attribute__ ((interrupt, shadow))#pragma varlocate bank NA*#pragma varlocate name NA**dsPIC 器 件 存 储 器 不 分 区 。指 定 未 初 始 化 变 量 位 于 数 据 存 储 器 中 的 用 户 段C18: #pragma udata mybssint gi;<strong>C30</strong>: int __attribute__((__section__(".mybss"))) gi;例 C-5:将 变 量 MABONGA 分 配 到 数 据 存 储 器 中 的 地 址 0X100C18: #pragma idata myDataSection=0x100;int Mabonga = 1;<strong>C30</strong>: int __attribute__((address(0x100))) Mabonga = 1;DS51284C_CN 第 156 页© 2005 Microchip Technology Inc.


MPLAB C18 与 MPLAB <strong>C30</strong> C 编 译 器 比 较例 C-6:指 定 将 一 个 变 量 存 放 到 程 序 存 储 器 中C18: #pragma romdata const_tableconst rom char my_const_array[10] ={0,1,2,3,4,5,6,7,8,9};<strong>C30</strong>: const __attribute__((space(const)))char my_const_array[10] = {0,1,2,3,4,5,6,7,8,9};注 :MPLAB <strong>C30</strong> 不 直 接 支 持 对 程 序 空 间 中 变 量 的 访 问 。 这 样 分 配 的 变 量 必 须 由编 程 人 员 显 式 访 问 , 通 常 通 过 使 用 表 访 问 行 内 汇 编 指 令 , 或 使 用 程 序 空 间可 见 性 窗 口 来 访 问 。 关 于 PSV 窗 口 的 更 多 信 息 , 参 见 第 4.15 节 “ 程 序 空间 可 视 性 (PSV) 的 使 用 ”。例 C-7:将 函 数 PRINTSTRING 分 配 到 程 序 存 储 器 中 的 地 址 0X8000C18: #pragma code myTextSection=0x8000;int PrintString(const char *s){...};<strong>C30</strong>: int __attribute__((address(0x8000))) PrintString(const char *s) {...};例 C-8:编 译 器 自 动 保 护 和 恢 复 变 量 VAR1 和 VAR2C18: #pragma interrupt isr0 save=var1, var2void isr0(void){/* perform interrupt function here */}<strong>C30</strong>: void __attribute__((__interrupt__(__save__(var1,var2))))isr0(void){/* perform interrupt function here */}C.14 存 储 模 型MPLAB C18 使 用 非 ANSI 的 小 存 储 模 型 和 大 存 储 模 型 。 小 存 储 模 型 使 用 16 位 指 针 并 将程 序 存 储 器 限 制 为 小 于 64 KB (32K 字 )。MPLAB <strong>C30</strong> 使 用 非 ANSI 的 小 代 码 模 型 和 大 代 码 模 型 。 小 代 码 模 型 将 程 序 存 储 器 限 制 为小 于 96 KB (32K 字 )。 在 大 代 码 模 型 中 , 指 针 可 能 使 用 跳 转 表 。C.15 调 用 约 定MPLAB C18 和 MPLAB <strong>C30</strong> 的 调 用 约 定 有 许 多 差 别 。 关 于 MPLAB <strong>C30</strong> 调 用 约 定 的 论述 , 请 参 阅 第 4.12 节 “ 函 数 调 用 约 定 ” 。© 2005 Microchip Technology Inc. DS51284C_CN 第 157 页


MPLAB ® <strong>C30</strong> 用 户 指 南C.16 启 动 代 码C.17 编 译 器 管 理 的 资 源MPLAB C18 提 供 了 三 个 启 动 子 程 序 —— 一 个 启 动 子 程 序 不 对 用 户 数 据 进 行 初 始 化 , 一个 启 动 子 程 序 仅 初 始 化 有 显 式 初 始 化 的 变 量 , 另 外 一 个 启 动 子 程 序 初 始 化 所 有 变 量( 按 照 ANSI 标 准 的 要 求 , 将 无 显 式 初 始 化 的 变 量 初 始 化 为 零 )。MPLAB <strong>C30</strong> 提 供 两 个 启 动 子 程 序 —— 一 个 启 动 子 程 序 不 对 用 户 数 据 进 行 初 始 化 , 另 外一 个 启 动 子 程 序 初 始 化 除 持 久 数 据 段 中 的 变 量 之 外 的 所 有 变 量 ( 按 照 ANSI 标 准 的 要求 , 将 无 显 式 初 始 化 的 变 量 初 始 化 为 零 )。MPLAB C18 有 如 下 编 译 器 管 理 的 资 源 : PC、 WREG、 STATUS、 PROD、 段.tmpdata、 段 MATH_DATA、 FSR0、 FSR1、 FSR2、 TBLPTR 和 TABLAT。MPLAB <strong>C30</strong> 有 如 下 编 译 器 管 理 的 资 源 :W0-W15、 RCOUNT 和 SR。C.18 优 化下 面 列 出 了 每 个 编 译 器 进 行 的 优 化 。MPLAB C18MPLAB <strong>C30</strong>转 移 优 化 (-Ob+)优 化 设 置 (-On, 其 中 n 为 1, 2, 3 或 s) (1)代 码 排 序 (-Os+)尾 部 合 并 (-Ot+)删 除 执 行 不 到 的 代 码 (-Ou+)复 制 传 递 (-Op+)冗 余 存 储 删 除 (-Or+)死 代 码 删 除 (-Od+)合 并 相 同 的 字 符 串 (-Om+)-fwritable-strings存 储 区 选 择 优 化 (-On+)无 — 不 使 用 存 储 区W 寄 存 器 内 容 跟 踪 (-Ow+) 自 动 跟 踪 所 有 寄 存 器过 程 抽 象 (-Opa+)过 程 抽 象 (-mpa)注 1: 在 MPLAB <strong>C30</strong> 中 , 这 些 优 化 设 置 可 满 足 大 部 分 需 要 。 可 使 用 其 他 选 项 来 进 行 “ 微调 ”。 更 多 信 息 参 见 第 3.5.6 节 “ 控 制 优 化 的 选 项 ”。C.19 目 标 模 块 格 式C.20 实 现 定 义 的 操 作MPLAB C18 和 MPLAB <strong>C30</strong> 使 用 不 同 的 COFF 文 件 格 式 , 文 件 格 式 不 可 互 换 。对 于 负 的 整 型 值 的 右 移 :• MPLAB C18 不 保 留 符 号 位• MPLAB <strong>C30</strong> 保 留 符 号 位DS51284C_CN 第 158 页© 2005 Microchip Technology Inc.


MPLAB C18 与 MPLAB <strong>C30</strong> C 编 译 器 比 较C.21 位 域MPLAB C18 中 的 位 域 不 能 跨 越 字 节 存 储 边 界 , 因 此 长 度 不 能 大 于 8 位 。MPLAB <strong>C30</strong> 支 持 任 意 位 数 的 位 域 , 位 域 长 度 最 大 为 基 础 类 型 的 长 度 。 任 何 整 型 都 可 以作 为 一 个 位 域 。 分 配 不 能 跨 越 基 础 类 型 的 位 边 界 。例 如 :struct foo {long long i:40;int j:16;char k:8;} x;struct bar {long long I:40;char J:8;int K:16;} y;使 用 MPLAB <strong>C30</strong>, 结 构 foo 的 大 小 将 为 10 个 字 节 。 i 将 被 分 配 到 位 偏 移 0 处 ( 直到 位 偏 移 39)。 在 j 之 前 会 填 充 8 位 , 分 配 在 位 偏 移 48 处 。 如 果 将 j 分 配 到 下 一 个可 用 的 位 偏 移 40 处 , 那 么 对 于 一 个 16 位 的 整 型 , 将 跨 越 一 个 存 储 边 界 。 将 在 j 之 后分 配 k, 分 配 到 位 偏 移 64 处 。 结 构 的 最 后 包 含 8 位 的 填 充 , 是 为 了 保 持 为 数 组 时 需 要的 对 齐 。 对 齐 为 2 字 节 , 因 为 结 构 中 的 最 大 对 齐 为 2 字 节 。使 用 MPLAB <strong>C30</strong>, 结 构 bar 的 大 小 将 为 8 个 字 节 。 i 将 被 分 配 到 位 偏 移 0 处 ( 直 到位 偏 移 39)。 j 之 前 不 需 要 填 充 , 因 为 对 于 一 个 char, 不 会 跨 越 存 储 边 界 。 J 被 分配 到 位 偏 移 40。 K 可 从 位 偏 移 48 开 始 分 配 , 这 样 就 完 成 了 整 个 结 构 的 分 配 , 没 有 浪费 任 何 存 储 空 间 。© 2005 Microchip Technology Inc. DS51284C_CN 第 159 页


MPLAB ® <strong>C30</strong> 用 户 指 南注 :DS51284C_CN 第 160 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南附 录 D ASCII 字 符 集表 D-1:ASCII 字 符 集最 高 有 效 字 符Hex 0 1 2 3 4 5 6 70 NUL DLE Space 0 @ P ‘ p1 SOH DC1 ! 1 A Q a q2 STX DC2 " 2 B R b r3 ETX DC3 # 3 C S c s4 EOT DC4 $ 4 D T d t5 ENQ NAK % 5 E U e u最 低 有 效 字 符6 ACK SYN & 6 F V f v7 Bell ETB ’ 7 G W g w8 BS CAN ( 8 H X h x9 HT EM ) 9 I Y i yA LF SUB * : J Z j zB VT ESC + ; K [ k {C FF FS , < L \ l |D CR GS - = M ] m }E SO RS . > N ^ n ~F SI US / ? O _ o DEL© 2005 Microchip Technology Inc. DS51284C_CN 第 161 页


MPLAB ® <strong>C30</strong> 用 户 指 南注 :DS51284C_CN 第 162 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南附 录 E GNU 免 费 文 档 许 可 证GNU 免 费 文 档 许 可 证版 本 1.2, 2002 年 11 月(C) 2000, 2001, 2002 Free Software Foundation, Inc. 版 权 所 有59 Temple Place, Suite 330, Boston, MA 02111-1307 USA允 许 复 制 和 分 发 本 许 可 证 文 档 的 原 始 拷 贝 , 但 不 允 许 进 行 修 改 。0. 导 言本 许 可 证 的 目 的 是 允 许 “ 免 费 ” 自 由 使 用 手 册 、 教 材 或 其 他 功 能 性 的 有 用 文 档 : 保 证任 何 人 都 能 在 改 动 或 不 改 动 文 档 的 情 况 下 , 自 由 复 制 和 分 发 文 档 , 无 论 是 否 用 于 商 业目 的 。 其 次 , 本 许 可 证 使 作 者 和 出 版 商 的 工 作 得 到 认 可 , 而 不 需 要 对 其 他 人 的 改 动 负责 。本 许 可 证 是 一 种 “ 复 制 保 留 ”, 意 思 是 文 档 的 派 生 作 品 本 身 也 必 须 具 有 同 样 的 自 由 。本 许 可 证 是 为 免 费 软 件 设 计 的 复 制 保 留 许 可 证 GNU General Public License (GNU 公众 许 可 证 ) 的 补 充 。本 许 可 证 是 为 免 费 软 件 的 手 册 设 计 的 , 因 为 免 费 软 件 需 要 免 费 的 文 档 资 料 : 应 该 随 手册 提 供 与 免 费 软 件 同 等 自 由 的 免 费 程 序 。 但 本 许 可 证 不 仅 仅 限 于 软 件 的 手 册 , 还 可 用于 所 有 文 本 作 品 , 无 论 它 是 什 么 主 题 或 是 否 作 为 印 刷 的 书 籍 发 行 。 建 议 将 这 个 许 可 证主 要 用 于 说 明 或 参 考 性 的 文 献 作 品 。1. 适 用 性 和 定 义本 许 可 证 适 用 于 包 含 一 个 版 权 所 有 者 声 明 允 许 在 许 可 证 条 款 下 分 发 的 任 何 介 质 上 的 任何 手 册 或 其 他 作 品 。 这 个 声 明 授 权 在 此 处 声 明 的 条 件 下 , 无 限 期 、 无 版 税 地 在 全 球 使用 作 品 。 下 述 的 “ 文 档 ” 都 是 指 这 样 的 手 册 或 作 品 。 任 何 公 众 中 的 一 员 都 是 被 授 予 许可 的 人 , 这 里 称 为 “ 您 ”。 如 果 您 在 版 权 法 的 许 可 下 复 制 、 修 改 或 分 发 作 品 , 就 认 为您 接 受 了 本 许 可 证 。文 档 的 “ 修 改 版 本 ” 意 味 着 作 品 中 包 含 文 档 或 它 的 一 部 分 , 或 是 逐 字 复 制 , 或 是 修 改和 / 或 翻 译 成 其 他 语 言 。“ 次 要 章 节 ” 是 文 档 中 的 指 定 附 录 或 前 言 章 节 , 专 门 用 来 处 理 文 档 出 版 者 或 作 者 与 文 档总 主 题 ( 或 相 关 主 题 ) 的 关 系 , 不 包 含 如 任 何 直 接 在 总 主 题 中 的 内 容 。( 因 此 , 如 果文 档 是 数 学 教 材 的 一 部 分 , 那 么 次 要 章 节 可 能 不 包 含 任 何 数 学 内 容 。) 这 个 关 系 可 能 是与 主 题 或 相 关 主 题 的 历 史 联 系 , 或 关 于 主 题 的 法 律 、 商 业 、 哲 学 、 伦 理 问 题 或 政 治 立场 。© 2005 Microchip Technology Inc. DS51284C_CN 第 163 页


MPLAB ® <strong>C30</strong> 用 户 指 南“ 不 可 变 章 节 ” 是 某 些 次 要 章 节 , 其 标 题 在 文 档 发 布 许 可 证 声 明 中 指 定 为 不 可 变 章 节 的标 题 。 如 果 不 符 合 上 面 的 定 义 就 不 能 作 为 不 可 变 章 节 。 文 档 可 以 没 有 不 可 变 章 节 。 如果 文 档 识 别 不 到 不 可 变 章 节 就 认 为 没 有 不 可 变 章 节 。“ 封 皮 文 本 ” 是 在 文 挡 按 照 本 许 可 证 发 布 的 声 明 中 被 列 为 封 面 文 本 或 封 底 文 本 的 某 些 短段 落 。 封 面 文 本 最 多 5 个 单 词 , 封 底 文 本 最 多 25 个 单 词 。文 档 的 “ 透 明 ” 拷 贝 是 指 机 器 可 读 的 拷 贝 , 使 用 公 众 可 以 得 到 其 规 范 的 格 式 表 达 , 适用 于 使 用 通 用 文 本 编 辑 器 或 通 用 绘 图 程 序 ( 对 于 由 像 素 构 成 的 图 像 ) 或 容 易 获 得 的 图片 编 辑 器 ( 对 于 图 片 ) 直 接 修 订 文 档 , 适 用 于 文 本 输 入 格 式 或 自 动 翻 译 成 各 种 适 用 于文 本 输 入 的 格 式 。 用 其 他 透 明 文 档 格 式 表 示 的 拷 贝 , 如 果 这 些 格 式 的 标 记 ( 或 没 有 标记 ) 会 阻 碍 读 者 后 续 对 文 档 的 修 改 , 那 么 就 不 是 透 明 的 。 如 果 用 一 个 图 像 格 式 表 示 确实 有 效 的 文 本 , 不 论 数 量 多 少 , 都 不 是 透 明 格 式 的 。 不 “ 透 明 ” 的 拷 贝 称 为 “ 不 透 明(Opaque)”。透 明 拷 贝 的 适 用 格 式 的 例 子 包 括 不 带 标 记 的 ASCII、 Texinfo 输 入 格 式 、 LaTeX 输 入 格式 、 使 用 公 众 可 用 的 DTD 的 SGML 和 XML、 符 合 标 准 的 简 单 HTML, 以 及 可 手 工 修改 的 Postscript 语 言 或 PDF 格 式 。 透 明 图 像 格 式 包 括 PNG、 XCF 和 JPG。 不 透 明 格式 包 括 可 读 但 只 能 用 私 有 版 权 的 文 字 处 理 程 序 编 辑 的 私 有 版 权 格 式 , 所 用 的 DTD 和 /或 处 理 工 具 不 是 广 泛 可 用 的 SGML 或 XML, 以 及 机 器 生 成 的 HTML, 某 些 文 字 处 理 程序 生 成 的 之 用 于 输 出 目 的 的 Postscript 或 PDF。“ 扉 页 ”, 对 于 印 刷 书 籍 来 说 , 指 扉 页 本 身 以 及 随 后 的 一 些 用 于 补 充 的 页 , 以 及 本 许 可证 要 求 出 现 在 扉 页 中 的 内 容 。 对 于 哪 些 没 有 扉 页 的 作 品 形 式 ,“ 扉 页 ” 代 表 接 近 作 品 最突 出 的 标 题 的 , 在 文 本 正 文 之 前 的 文 本 。“ 名 为 XYZ” 的 章 节 代 表 文 档 的 一 个 特 定 的 子 单 元 , 其 标 题 就 是 XYZ 或 是 将 XYZ 翻译 成 其 他 语 言 的 文 本 之 后 的 括 号 中 含 有 XYZ。( 这 里 的 XYZ 是 指 下 面 提 到 的 一 个 特 定的 章 节 名 , 如 “Acknowledgements”、“ Dedications”、“ Endorsements” 或“History”。) 在 修 改 文 档 时 对 这 些 章 节 “ 保 留 标 题 ” 的 意 思 是 按 照 这 个 定 义 保 留 一 个“ 名 为 XYZ” 的 章 节 。文 档 可 能 在 文 档 遵 照 本 许 可 证 的 声 明 后 面 包 含 免 责 声 明 (Warranty Disclaimer)。 这些 免 责 声 明 被 认 为 是 包 含 在 本 许 可 证 中 的 , 但 这 仅 被 视 为 拒 绝 担 保 : 免 责 声 明 中 任 何其 他 的 暗 示 都 是 无 用 的 并 对 本 许 可 证 的 含 义 没 有 影 响 。2. 逐 字 复 制您 可 以 以 任 何 介 质 拷 贝 并 分 发 文 档 , 无 论 是 否 出 于 商 业 目 的 , 只 要 保 证 本 许 可 证 、 版权 声 明 和 宣 称 本 许 可 证 应 用 于 文 档 的 声 明 都 在 所 有 拷 贝 中 被 完 整 地 、 无 任 何 附 加 条 件地 给 出 即 可 。 您 不 能 使 用 任 何 技 术 手 段 阻 碍 或 控 制 您 制 作 或 发 布 的 拷 贝 的 阅 读 或 再 次复 制 。 不 过 您 可 以 在 复 制 品 的 交 易 中 得 到 报 酬 。 如 果 您 发 布 足 够 多 的 拷 贝 , 您 必 须 遵循 下 面 第 三 节 中 的 条 件 。DS51284C_CN 第 164 页© 2005 Microchip Technology Inc.


GNU 免 费 文 档 许 可 证您 也 可 以 在 和 上 面 相 同 的 条 件 下 出 借 拷 贝 和 公 开 拷 贝 。3. 大 量 复 制如 果 您 发 行 文 档 的 印 刷 版 的 拷 贝 ( 或 是 有 印 制 封 皮 的 其 他 介 质 的 拷 贝 ) 多 于 100 份 ,而 文 档 的 许 可 证 声 明 中 要 求 封 皮 文 本 , 您 必 须 将 它 清 晰 明 显 地 置 于 封 皮 之 上 , 封 面 文本 在 封 面 上 , 封 底 文 本 在 封 底 上 。 封 面 和 封 底 上 还 必 须 标 明 您 是 这 些 拷 贝 的 发 行 者 。封 面 必 须 以 同 等 显 著 、 可 见 地 完 整 展 现 标 题 的 所 有 文 字 。 您 可 以 在 标 题 上 加 入 其 他 的材 料 。 复 制 仅 改 动 封 皮 , 只 要 保 持 文 档 的 标 题 不 变 并 满 足 这 些 条 件 , 可 以 在 其 他 方 面被 视 为 是 逐 字 复 制 。如 果 需 要 加 上 的 文 本 对 于 封 面 或 封 底 过 多 , 无 法 明 显 地 表 示 , 您 应 该 在 封 皮 上 列 出 前面 的 ( 在 合 理 的 前 提 下 尽 量 多 ), 把 其 他 的 放 在 邻 近 的 页 面 上 。如 果 您 出 版 或 分 发 了 超 过 100 份 文 档 的 不 透 明 拷 贝 , 您 必 须 在 每 个 不 透 明 拷 贝 中 包 含一 份 机 器 可 读 的 透 明 拷 贝 , 或 是 在 每 个 不 透 明 拷 贝 中 给 出 一 个 计 算 机 网 络 地 址 , 通 过这 个 地 址 , 使 用 计 算 机 网 络 的 公 众 可 以 使 用 标 准 的 网 络 协 议 没 有 任 何 附 加 条 件 地 下 载一 个 文 档 的 完 整 的 透 明 拷 贝 。 如 果 您 选 择 后 者 , 您 必 须 在 开 始 大 量 分 发 非 透 明 拷 贝 的时 候 采 用 相 当 谨 慎 的 步 骤 , 保 证 透 明 拷 贝 在 其 所 给 出 的 位 置 在 ( 直 接 或 通 过 代 理 和 零售 商 ) 分 发 最 后 一 次 该 版 本 的 非 透 明 拷 贝 的 时 间 之 后 一 年 之 内 始 终 是 有 效 的 。在 重 新 大 量 发 布 拷 贝 之 前 , 请 您 ( 但 不 是 必 须 ) 与 文 档 的 作 者 联 系 , 以 便 可 以 得 到 文档 的 升 级 版 本 。4. 修 改在 上 述 第 2、 3 节 的 条 件 下 , 您 可 以 复 制 和 分 发 文 档 的 修 改 后 的 版 本 , 只 要 严 格 按 照 本许 可 证 发 布 修 改 后 的 文 档 , 用 修 改 后 的 版 本 代 替 原 文 档 , 也 就 是 许 可 任 何 得 到 这 个 修改 版 的 拷 贝 的 人 分 发 或 修 改 这 个 修 改 后 的 版 本 。 另 外 , 在 修 改 版 中 , 您 必 须 做 到 如 下几 点 :a) 使 用 和 被 修 改 文 档 与 以 前 的 各 个 版 本 ( 如 果 有 的 话 , 应 该 被 列 在 文 档 的 版 本 历史 章 节 中 ) 有 显 著 不 同 的 扉 页 ( 和 封 面 , 如 果 有 的 话 )。 如 果 那 个 版 本 的 原 始 发行 者 允 许 的 话 , 您 可 以 使 用 和 以 前 版 本 相 同 的 标 题 。b) 与 作 者 一 样 , 在 扉 页 上 列 出 承 担 修 改 版 本 中 的 修 改 的 作 者 责 任 的 一 个 或 多 个 人 或实 体 和 至 少 五 个 文 档 的 主 要 作 者 ( 如 果 原 作 者 不 足 五 个 就 全 部 列 出 ), 除 非 他 们免 除 了 您 的 这 个 责 任 。c) 与 原 来 的 发 行 者 一 样 , 在 扉 页 上 列 出 修 改 版 的 发 行 者 的 名 字 。d) 保 持 文 档 的 全 部 版 权 声 明 不 变 。e) 在 与 其 他 版 权 声 明 邻 近 的 位 置 加 入 恰 当 的 针 对 您 的 修 改 的 版 权 声 明 。© 2005 Microchip Technology Inc. DS51284C_CN 第 165 页


MPLAB ® <strong>C30</strong> 用 户 指 南f) 在 紧 接 着 版 权 声 明 的 位 置 加 入 许 可 声 明 , 按 照 下 面 附 录 中 给 出 的 形 式 , 按 照 本 许可 证 地 条 款 授 予 公 众 使 用 修 订 版 本 的 权 利 。g) 保 持 原 文 档 的 许 可 声 明 中 的 全 部 不 可 变 章 节 、 封 面 文 本 和 封 底 文 本 的 声 明 不 变 。h) 包 含 一 份 未 作 任 何 修 改 的 本 协 议 的 拷 贝 。i) 保 持 名 为 “History” 的 章 节 不 变 , 保 持 它 的 标 题 不 变 , 并 在 其 中 加 入 一 项 , 该 项至 少 声 明 扉 页 上 的 修 改 版 本 的 标 题 、 年 、 新 作 者 和 新 发 行 者 。 如 果 文 档 中 没 有 名为 “History” 的 章 节 , 就 新 建 这 一 章 节 , 并 加 入 声 明 原 文 档 扉 页 上 所 列 的 标 题 、年 、 作 者 与 发 行 者 的 项 , 之 后 在 后 面 加 入 如 上 句 所 说 的 描 述 修 改 版 本 的 项 。j) 如 果 文 档 中 有 用 于 公 众 访 问 的 文 档 透 明 拷 贝 的 网 址 的 话 , 保 持 网 址 不 变 , 并 同 样把 它 所 基 于 的 以 前 版 本 的 网 址 给 出 。 这 些 网 址 可 以 放 在 “History” 章 节 中 。 您 可以 不 给 出 那 些 在 原 文 档 发 行 之 前 已 经 发 行 至 少 四 年 的 版 本 给 出 的 网 址 , 或 者 该 版本 的 发 行 者 授 权 不 列 出 网 址 。k) 对 于 任 何 名 为 “Acknowledgements” 或 “Dedications” 的 章 节 , 保 持 章 节 的标 题 不 变 , 并 保 持 其 全 部 内 容 , 保 持 对 每 个 贡 献 者 的 感 谢 与 给 出 的 贡 献 的 语 气 不变 。l) 保 持 文 档 的 所 有 不 可 变 章 节 不 变 , 不 改 变 它 们 的 标 题 和 内 容 。 章 节 的 编 号 不 视 为是 章 节 标 题 的 一 部 分 。m) 删 除 名 为 “Endorsements” 的 章 节 。 这 样 的 章 节 不 可 以 包 含 在 修 改 版 本 中 。n) 不 要 把 一 个 已 经 存 在 的 章 节 重 命 名 为 “Endorsements” 或 和 任 何 不 可 变 章 节 的名 字 相 冲 突 的 名 字 。o) 保 持 任 何 免 责 声 明 不 变 。如 果 修 改 版 本 包 含 新 的 符 合 次 要 章 节 定 义 的 前 言 或 附 录 章 节 , 并 且 不 含 有 从 原 文 档 中复 制 的 内 容 , 您 可 以 按 照 自 己 的 意 愿 将 某 些 或 全 部 这 样 的 章 节 指 定 为 不 可 变 。 如 果 需要 这 样 做 , 就 把 它 们 的 标 题 加 入 修 改 版 本 的 许 可 声 明 的 不 可 变 章 节 列 表 之 中 。 这 些 标题 必 须 和 其 他 章 节 的 标 题 相 区 分 。您 可 以 加 入 一 个 名 为 “Endorsements” 的 章 节 , 只 要 它 只 包 含 对 您 的 修 改 版 本 由 不 同的 各 方 给 出 的 签 名 — 例 如 书 评 或 是 文 本 已 经 被 一 个 组 织 认 定 为 一 个 标 准 的 权 威 定 义 。您 可 以 加 入 一 个 最 多 五 个 单 词 的 段 落 作 为 封 面 文 本 和 一 个 最 多 25 个 单 词 的 段 落 作 为 封底 文 本 , 把 它 们 加 入 到 修 改 版 本 的 封 皮 文 本 列 表 的 末 端 。 一 个 实 体 只 可 以 加 入 ( 或 通过 排 列 制 作 ) 一 段 封 面 或 封 底 文 本 。 如 果 原 文 档 已 经 为 该 封 皮 ( 封 面 或 封 底 ) 包 含 了封 皮 文 本 , 由 您 或 您 所 代 表 的 实 体 先 前 加 入 或 排 列 的 文 本 , 您 不 能 再 新 加 入 一 个 , 但您 可 以 在 原 来 的 发 行 者 的 显 式 的 许 可 下 替 换 掉 原 来 的 那 个 。文 档 的 作 者 和 发 行 者 不 能 通 过 本 许 可 证 授 权 公 众 使 用 他 们 的 名 字 推 荐 或 暗 式 认 可 任 何一 个 修 改 版 本 。DS51284C_CN 第 166 页© 2005 Microchip Technology Inc.


GNU 免 费 文 档 许 可 证5. 合 并 文 档遵 照 第 4 节 所 说 的 修 改 版 本 的 规 定 , 您 可 以 将 文 档 和 按 照 本 许 可 证 发 布 的 其 他 文 档 合并 , 只 要 您 在 合 并 结 果 中 包 含 原 文 档 的 所 有 不 可 变 章 节 , 对 它 们 不 加 以 任 何 改 动 , 并在 合 并 结 果 的 许 可 声 明 中 将 它 们 全 部 列 为 不 可 变 章 节 , 而 且 维 持 原 作 者 的 免 责 声 明 不变 。合 并 的 作 品 仅 需 要 包 含 一 份 本 许 可 证 , 多 个 相 同 的 不 可 变 章 节 可 以 由 一 个 来 取 代 。 如果 有 多 个 名 称 相 同 、 内 容 不 同 的 不 可 变 章 节 , 通 过 在 章 节 的 名 字 后 面 用 包 含 在 括 号 中的 文 本 加 以 原 作 者 、 发 行 者 的 名 字 ( 如 果 有 的 话 ) 来 加 以 区 别 , 或 通 过 唯 一 的 编 号 加以 区 别 。 并 对 合 并 作 品 的 许 可 声 明 中 的 不 可 变 章 节 列 表 中 的 章 节 标 题 做 相 同 的 修 改 。在 合 并 过 程 中 , 您 必 须 合 并 不 同 原 始 文 档 中 任 何 名 为 “History” 的 章 节 , 从 而 形 成 新的 名 为 “History” 的 章 节 ; 类 似 地 , 还 要 合 并 名 为 “Acknowledgements” 和 任 何 名为 “Dedications” 的 章 节 。 您 必 须 删 除 所 有 名 为 “ Endorsements ” 的 章 节 。6. 文 档 的 合 集您 可 以 制 作 文 档 和 按 照 本 许 可 证 发 布 的 其 他 文 档 的 合 集 , 并 在 合 集 中 将 不 同 文 档 中 的多 个 本 许 可 证 的 拷 贝 以 一 个 单 独 的 拷 贝 来 代 替 , 只 要 您 其 他 方 面 对 每 个 文 档 遵 循 本 许可 证 的 逐 字 拷 贝 条 款 即 可 。您 可 以 从 一 个 这 样 的 合 集 中 提 取 一 个 文 档 , 并 将 它 按 照 本 许 可 证 单 独 分 发 , 只 要 您 想再 这 个 提 取 出 的 文 档 中 加 入 一 份 本 许 可 证 的 拷 贝 , 并 在 其 他 方 面 对 该 文 档 遵 循 本 许 可证 的 逐 字 拷 贝 原 则 。7. 独 立 作 品 的 聚 合 体文 档 或 文 档 的 派 生 品 和 其 他 的 与 之 相 分 离 的 独 立 文 档 或 作 品 汇 编 到 一 个 存 储 或 分 发 介质 上 , 如 果 汇 编 后 的 版 权 对 汇 编 作 品 的 使 用 者 的 权 利 的 限 制 没 有 超 出 原 来 的 独 立 作 品的 许 可 范 围 , 称 为 文 档 的 “ 聚 合 体 ”。 当 以 本 许 可 证 发 布 的 文 档 被 包 含 在 一 个 聚 合 体中 的 时 候 , 本 许 可 证 不 使 用 于 聚 合 体 中 本 来 不 是 该 文 档 的 派 生 作 品 的 其 他 作 品 。如 果 第 3 节 中 的 封 皮 文 本 要 求 适 用 于 文 档 的 这 些 拷 贝 , 那 么 如 果 文 档 在 聚 合 体 中 所 占的 比 重 小 于 整 个 聚 合 体 的 一 半 , 文 档 的 封 皮 文 本 可 以 被 放 置 在 聚 合 体 内 包 含 文 档 的 部分 的 封 皮 上 , 或 是 电 子 文 档 中 的 等 效 部 分 。 否 则 , 它 必 须 位 于 整 个 聚 合 体 的 印 刷 的 封皮 上 。8. 翻 译翻 译 被 认 为 是 一 种 修 改 , 所 以 您 可 以 按 照 第 4 节 的 规 定 分 发 文 档 的 翻 译 版 本 。 如 果 要将 文 档 的 不 可 变 章 节 用 翻 译 版 取 代 , 需 要 得 到 版 权 所 有 人 的 授 权 , 但 您 可 以 将 部 分 或全 部 不 可 变 章 节 的 翻 译 版 附 加 在 原 始 版 本 的 后 面 。 您 可 以 包 含 一 个 本 许 可 证 和 所 有 许可 证 声 明 、 免 责 声 明 的 翻 译 版 本 , 只 要 您 同 时 包 含 他 们 的 原 始 英 文 版 本 即 可 。 当 翻 译版 本 和 英 文 版 发 生 冲 突 的 时 候 , 原 始 版 本 有 效 。© 2005 Microchip Technology Inc. DS51284C_CN 第 167 页


MPLAB ® <strong>C30</strong> 用 户 指 南在 文 档 的 “Acknowledgements”、“ Dedications” 或 “History” 章 节 中 , 第 4 节 的保 持 标 题 ( 第 1 节 ) 的 要 求 恰 恰 是 要 更 换 实 际 的 标 题 的 。9. 终 止除 非 确 实 遵 从 本 许 可 证 , 您 不 可 以 对 遵 从 本 许 可 证 发 布 的 文 挡 进 行 复 制 、 修 改 、 附 加许 可 证 或 分 发 。 任 何 其 他 的 试 图 复 制 、 修 改 、 附 加 许 可 和 分 发 本 文 挡 的 行 为 都 是 无 效的 , 并 自 动 终 止 本 许 可 证 所 授 予 您 的 权 利 。 然 而 其 他 从 您 这 里 依 照 本 许 可 证 得 到 的 拷贝 或 权 利 的 人 ( 或 组 织 ) 得 到 的 许 可 证 都 不 会 终 止 , 只 要 他 们 仍 然 完 全 遵 照 本 许 可证 。10. 本 许 可 证 的 未 来 修 订 版 本Free Software Foundation 可 能 会 发 布 GNU Free Documentation License ( GNU 免费 文 档 许 可 证 ) 的 新 修 订 版 本 。 这 些 版 本 将 会 和 现 在 的 版 本 体 现 类 似 的 精 神 , 但 可 能在 解 决 某 些 问 题 和 利 害 关 系 的 细 节 上 有 所 不 同 。 参 见 http://www.gnu.org/copyleft/ 。本 许 可 证 的 每 个 版 本 都 有 一 个 唯 一 的 版 本 号 。 如 果 文 档 指 定 服 从 一 个 特 定 的 本 协 议 版本 “ 或 任 何 之 后 的 版 本 ”, 您 可 以 选 择 遵 循 指 定 版 本 或 Free Software Foundation 的任 何 更 新 的 已 经 发 布 的 版 本 ( 不 是 草 案 ) 的 条 款 和 条 件 来 遵 循 。 如 果 文 档 没 有 指 定 本许 可 证 的 版 本 , 那 么 您 可 以 选 择 遵 循 任 何 Free Software Foundation 曾 经 发 布 的 版 本( 不 是 草 案 )。DS51284C_CN 第 168 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南术 语 表ANSI美 国 国 家 标 准 委 员 会 是 美 国 负 责 指 定 和 批 准 标 准 的 组 织 。ASCII美 国 信 息 交 换 标 准 码 是 使 用 7 个 二 进 制 数 字 来 表 示 每 个 字 符 的 字 符 集 编 码 。 它 包 括 大 写和 小 写 字 母 、 数 字 、 符 号 以 及 控 制 字 符 。Build编 译 并 链 接 一 个 应 用 的 所 有 源 文 件 。编 译 器 (Compiler)将 用 高 级 语 言 编 写 的 程 序 翻 译 为 机 器 代 码 的 程 序 。C具 有 表 达 式 简 练 、 现 代 控 制 流 程 和 数 据 结 构 , 以 及 运 算 符 丰 富 特 点 的 通 用 编 程 语 言 。COFF公 共 目 标 文 件 格 式 。 这 种 格 式 的 目 标 文 件 包 含 机 器 代 码 、 调 试 和 其 他 信 息 。操 作 码 (Opcode)操 作 码 。 参 见 助 记 符 。程 序 存 储 器 (Program Memory)器 件 中 存 储 指 令 的 存 储 器 。 亦 指 仿 真 器 或 软 件 模 拟 器 中 包 含 下 载 的 目 标 应 用 软 件 的 存储 器 。程 序 计 数 器 (Program Counter)包 含 正 在 执 行 的 指 令 的 地 址 的 存 储 单 元 。触 发 输 出 (Trigger Output)指 可 在 任 意 地 址 或 地 址 范 围 产 生 的 仿 真 器 输 出 信 号 , 与 跟 踪 和 断 点 的 设 置 无 关 。 可 设置 任 意 个 触 发 输 出 点 。次 数 计 数 器 (Pass Counter)每 次 一 个 事 件 ( 如 执 行 特 定 地 址 处 的 一 条 指 令 ) 发 生 时 都 会 递 减 1 的 计 数 器 。 当 次 数计 数 器 的 值 为 零 时 , 事 件 满 足 。 可 将 次 数 计 数 器 分 配 给 断 点 和 跟 踪 逻 辑 , 以 及 在complex trigger ( 复 杂 触 发 ) 对 话 框 中 的 任 何 顺 序 事 件 。单 片 机 (Microcontroller)包 含 CPU、 RAM、 程 序 存 储 器 、 I/O 口 和 定 时 器 的 高 度 集 成 芯 片 。单 片 机 模 式 (Microcontroller Mode)PIC17CXXX 和 PIC18CXXX 系 列 单 片 机 的 一 种 程 序 存 储 器 配 置 。 在 单 片 机 模 式 下 , 仅允 许 内 部 执 行 。 因 此 , 在 这 种 模 式 下 仅 可 使 用 片 内 程 序 存 储 器 。© 2005 Microchip Technology Inc. DS51284C_CN 第 169 页


MPLAB ® <strong>C30</strong> 用 户 指 南导 出 (Export)以 标 准 的 格 式 将 数 据 发 送 出 MPLAB IDE。导 入 (Import)从 外 面 的 源 ( 如 从 hex 文 件 ) 将 数 据 送 入 MPLAB IDE。地 址 (Address)标 识 存 储 器 中 一 个 单 元 的 值 。递 归 (Recursion)已 定 义 的 函 数 或 宏 可 调 用 自 身 的 概 念 。 编 写 递 归 宏 时 要 特 别 小 心 : 因 为 很 容 易 陷 入 无限 循 环 , 导 致 无 法 退 出 递 归 。断 点 , 软 件 (Breakpoint, Software)一 个 地 址 , 程 序 会 在 这 个 地 址 处 暂 停 执 行 。 通 常 由 特 殊 的 break 指 令 获 得 。断 点 , 硬 件 (Breakpoint, Hardware)执 行 这 种 事 件 会 导 致 暂 停 。堆 栈 , 软 件 (Stack, Software)用 来 存 储 返 回 地 址 、 函 数 参 数 和 局 部 变 量 的 存 储 区 。 当 用 高 级 语 言 开 发 代 码 时 , 该 存储 区 一 般 由 编 译 器 管 理 。堆 栈 , 硬 件 (Stack, Hardware)PICmicro 单 片 机 中 调 用 函 数 时 存 储 返 回 地 址 的 存 储 区 。EEPROM电 可 擦 除 的 可 编 程 只 读 存 储 器 。 一 种 可 电 擦 除 的 特 殊 PROM。 一 次 写 或 擦 除 一 个 字 节 。EEPROM 即 使 电 源 关 闭 时 也 能 保 留 内 容 。EPROM可 擦 除 的 可 编 程 只 读 存 储 器 。 通 常 通 过 紫 外 线 照 射 来 擦 除 的 可 编 程 只 读 存 储 器 。FNOP强 制 空 操 作 。 强 制 NOP 周 期 是 双 周 期 指 令 的 第 二 个 周 期 。 由 于 PICmicro 单 片 机 的 架 构是 流 水 线 型 , 在 执 行 当 前 指 令 的 同 时 预 取 物 理 地 址 空 间 中 的 下 一 条 指 令 , 如 果 当 前 指令 改 变 了 程 序 计 数 器 , 那 么 这 条 预 取 的 指 令 就 被 忽 略 了 , 导 致 一 个 强 制 NOP 周 期 。仿 真 (Emulation)像 执 行 存 储 在 单 片 机 中 的 软 件 一 样 执 行 装 入 仿 真 存 储 区 中 的 软 件 的 过 程 。仿 真 存 储 器 (Emulation Memory)仿 真 器 内 部 的 程 序 存 储 器 。仿 真 器 (Emulator)执 行 仿 真 的 硬 件 。仿 真 器 系 统 (Emulator System)MPLAB ICE 2000 和 4000 仿 真 器 系 统 包 括 仿 真 器 主 机 / 处 理 器 模 块 / 器 件 适 配 器 / 电 缆 和MPLAB IDE 软 件 。仿 真 器 主 机 (Pod, Emulator)包 含 仿 真 存 储 区 、 跟 踪 存 储 区 、 事 件 和 周 期 定 时 器 , 以 及 跟 踪 / 断 点 逻 辑 的 外 部 仿 真 器盒 子 。DS51284C_CN 第 170 页© 2005 Microchip Technology Inc.


术 语 表非 实 时 (Non Real-Time)指 处 理 器 执 行 到 断 点 或 单 步 执 行 指 令 , 或 MPLAB IDE 运 行 在 软 件 模 拟 器 模 式 。非 易 失 性 存 储 器 (Non-Volatile Storage)电 源 关 闭 时 保 留 其 内 容 的 存 储 器 件 。符 号 (Symbol)描 述 组 成 程 序 的 不 同 部 分 的 一 种 通 用 机 制 。 这 些 部 分 包 括 函 数 名 、 变 量 名 、 段 名 、 文件 名 和 结 构 / 枚 举 / 联 合 标 记 名 等 。 MPLAB IDE 中 的 符 号 主 要 指 变 量 名 、 函 数 名 和 汇编 标 号 。 链 接 后 符 号 的 值 就 是 其 在 存 储 器 中 的 值 。GPR通 用 寄 存 器 。 器 件 数 据 存 储 器 的 一 部 分 。高 级 语 言 (High Level Language)用 于 编 写 比 汇 编 更 脱 离 处 理 器 机 器 代 码 的 程 序 的 语 言 。跟 踪 (Trace)记 录 程 序 执 行 的 仿 真 器 或 软 件 模 拟 器 功 能 。 仿 真 器 将 程 序 执 行 记 录 到 其 跟 踪 缓 冲 区 内 ,并 可 上 载 到 MPLAB IDE 的 跟 踪 窗 口 中 。跟 踪 存 储 区 (Trace Memory)跟 踪 存 储 区 包 含 在 仿 真 器 内 部 。 跟 踪 存 储 区 有 时 称 为 跟 踪 缓 冲 区 。工 具 栏 (Tool Bar)可 在 上 面 点 击 来 执 行 MPLAB IDE 功 能 的 一 行 或 一 列 图 标 。观 察 变 量调 试 时 可 在 watch 窗 口 中 监 视 的 变 量 。归 档 (Archive)可 重 定 位 目 标 模 块 的 集 合 。 由 将 多 个 源 文 件 汇 编 为 目 标 文 件 , 然 后 使 用 归 档 器 将 目 标文 件 组 合 为 一 个 库 文 件 生 成 。 可 将 库 与 目 标 模 块 和 其 他 库 链 接 , 生 成 可 执 行 代 码 。归 档 器 (Archiver)生 成 和 操 作 库 的 工 具 。国 际 标 准 化 组 织 (International Organization for Standardization)指 定 许 多 行 业 和 技 术 ( 包 括 计 算 和 通 讯 ) 方 面 的 标 准 的 一 个 组 织 。Hex 代 码 (Hex Code)存 储 在 十 六 进 制 格 式 代 码 中 的 可 执 行 指 令 。 hex 代 码 包 含 在 hex 文 件 中 。Hex 文 件 (Hex File)包 含 可 对 器 件 编 程 的 十 六 进 制 地 址 和 值 (hex 代 码 ) 的 ASCII 文 件 。宏 (Macro)宏 指 令 。 以 缩 写 形 式 表 示 一 系 列 指 令 的 指 令 。宏 伪 指 令 (Macro Directive)控 制 宏 定 义 体 中 执 行 和 数 据 分 配 的 伪 指 令 。© 2005 Microchip Technology Inc. DS51284C_CN 第 171 页


MPLAB ® <strong>C30</strong> 用 户 指 南汇 编 器 (Assembler)将 汇 编 语 言 源 代 码 翻 译 为 机 器 代 码 的 语 言 工 具 。汇 编 语 言 (Assembly Language)以 符 号 形 式 描 述 二 进 制 机 器 代 码 的 编 程 语 言 。ICD在 线 调 试 器 。MPLAB ICD 和 MPLAB ICD 2 分 别 是 Microchip PIC16F87X 和 PIC18FXXX器 件 的 在 线 调 试 器 。 这 些 ICD 与 MPLAB IDE 配 合 工 作 。ICE在 线 仿 真 器 。MPLAB ICE 2000 和 4000 是 Microchip 的 在 线 仿 真 器 , 和 MPLAB IDE 配 合工 作 。IDE集 成 开 发 环 境 。 MPLAB IDE 是 Microchip 的 集 成 开 发 环 境 。IRQ参 见 中 断 请 求 。ISO参 见 国 际 标 准 化 组 织 。ISR参 见 中 断 服 务 程 序 。基 数 (Radix)数 字 基 , 十 六 进 制 或 十 进 制 , 用 于 指 定 一 个 地 址 。机 器 代 码 (Machine Code)处 理 器 实 际 读 和 解 释 的 计 算 机 程 序 的 表 示 。 二 进 制 机 器 代 码 的 程 序 由 一 系 列 机 器 指 令( 可 能 还 包 含 数 据 ) 组 成 。 特 定 处 理 器 的 所 有 可 能 指 令 的 集 合 称 为 “ 指 令 集 ”。机 器 语 言 (Machine Language)特 定 中 央 处 理 单 元 的 指 令 集 , 不 需 翻 译 即 可 用 于 处 理 器 。激 励 (Stimulus)软 件 模 拟 器 的 输 入 , 即 为 模 拟 对 外 部 信 号 的 响 应 而 生 成 的 数 据 。 通 常 数 据 采 用 文 本 文件 中 一 系 列 动 作 的 形 式 。 激 励 可 以 是 异 步 的 , 同 步 的 ( 引 脚 ), 时 钟 和 寄 存 器 。交 叉 引 用 文 件 (Cross Reference File)引 用 符 号 表 的 一 个 文 件 及 引 用 符 号 的 文 件 列 表 。 如 果 定 义 了 符 号 , 列 出 的 第 一 个 文 件是 定 义 的 位 置 。 其 他 文 件 包 含 对 符 号 的 引 用 。校 准 存 储 区 (Calibration Memory)用 于 保 存 PICmicro 单 片 机 片 内 RC 振 荡 器 或 其 他 外 设 校 准 值 的 特 殊 功 能 寄 存 器 或 通 用 寄存 器 。节 点 (Node)MPLAB IDE 项 目 的 组 件 。DS51284C_CN 第 172 页© 2005 Microchip Technology Inc.


术 语 表警 告 (Warning)提 醒 出 现 了 可 能 导 致 器 件 、 软 件 文 件 或 设 备 物 理 性 损 坏 情 况 的 通 知 。静 态 RAM 或 SRAM (Static RAM or SRAM)静 态 随 机 访 问 存 储 器 。 目 标 板 上 可 读 / 写 且 不 需 要 经 常 刷 新 的 程 序 存 储 器 。局 部 标 号 (Local Label)用 LOCAL 伪 指 令 在 一 个 宏 内 部 定 义 的 标 号 。 这 些 标 号 特 定 于 宏 实 例 化 的 一 个 给 定 示例 。 也 就 是 说 , 声 明 为 local 的 符 号 和 标 号 在 遇 到 ENDM 宏 后 不 可 访 问 。绝 对 段 (Absolute Section)具 有 链 接 器 不 能 改 变 的 固 定 ( 绝 对 ) 地 址 的 段 。看 门 狗 定 时 器 (Watchdog Timer)PICmicro 单 片 机 中 在 一 段 可 选 择 长 度 的 时 间 后 复 位 处 理 器 的 定 时 器 。 使 用 配 置 位 来 使能 、 禁 止 和 设 置 WDT。控 制 伪 指 令 (Control Directive)汇 编 代 码 中 根 据 汇 编 时 指 定 表 达 式 的 值 包 含 或 忽 略 代 码 的 伪 指 令 。库 (Library)参 见 归 档 。库 管 理 器 (Librarian)参 见 归 档 器 。快 速 访 问 存 储 区 (Access Memory)( 仅 PIC18)PIC18XXXXX 器 件 的 特 殊 寄 存 器 , 对 这 些 寄 存 器 的 访 问 与 存 储 区 选 择 寄 存 器 (BSR)的 设 置 无 关 。扩 展 单 片 机 模 式 (Extended Microcontroller Mode)在 扩 展 单 片 机 模 式 中 , 既 可 使 用 片 内 程 序 存 储 器 , 也 可 使 用 外 部 存 储 器 。 如 果 程 序 存储 器 地 址 大 于 PIC17CXXX 或 PIC18CXXX 器 件 的 内 部 存 储 空 间 , 执 行 自 动 切 换 到 外部 存 储 器 。链 接 描 述 文 件 (Linker Script File)链 接 器 的 命 令 文 件 。 定 义 链 接 选 项 并 描 述 目 标 平 台 上 的 可 用 存 储 器 。链 接 器 (Linker)组 合 目 标 文 件 和 库 生 成 可 执 行 代 码 , 并 解 析 从 一 个 模 块 到 另 一 个 模 块 的 引 用 的 语 言 工具 。列 表 伪 指 令 (Listing Directive)控 制 汇 编 器 列 表 文 件 格 式 的 伪 指 令 。 它 们 允 许 指 定 标 题 、 分 页 及 其 他 列 表 控 制 。列 表 文 件 (Listing File)列 出 为 每 条 C 源 语 句 生 成 的 机 器 代 码 , 源 文 件 中 遇 到 的 汇 编 指 令 、 汇 编 器 伪 指 令 或 宏 的ASCII 文 本 文 件 。逻 辑 探 头 (Logic Probe)Microchip 的 某 些 仿 真 器 最 多 可 连 接 14 个 逻 辑 探 头 。 逻 辑 探 头 提 供 外 部 跟 踪 输 入 、 触 发输 出 信 号 、 +5V 和 公 共 接 地 端 。© 2005 Microchip Technology Inc. DS51284C_CN 第 173 页


MPLAB ® <strong>C30</strong> 用 户 指 南Make 项 目 (Make Project)重 新 编 译 应 用 程 序 的 命 令 , 仅 编 译 自 上 次 完 整 编 译 后 更 改 了 的 源 文 件 。MCU单 片 机 。 microcontroller 的 缩 写 形 式 。 也 要 采 用 大 写 。MPASM 汇 编 器 (MPASM Assembler)Microchip PICmicro 单 片 机 、 KeeLoq 器 件 和 存 储 器 件 的 可 重 定 位 宏 汇 编 器 。MPLAB ASM30Microchip dsPI<strong>C30</strong>F 数 字 信 号 控 制 器 的 可 重 定 位 宏 汇 编 器 。MPLAB C1X指 Microchip 的 MPLAB C17 和 MPLAB C18 C 编 译 器 。MPLAB C17 是 PIC17CXXX 器 件的 C 编 译 器 , MPLAB C18 是 PIC18CXXX 和 PIC18FXXXX 器 件 的 C 编 译 器 。MPLAB <strong>C30</strong>Microchip dsPI<strong>C30</strong>F 数 字 信 号 控 制 器 的 C 编 译 器 。MPLAB ICD 2Microchip PIC16F87X、 PIC18FXXX 和 dsPI<strong>C30</strong>FXXXX 器 件 的 在 线 调 试 器 。 ICD 与MPLAB IDE 配 合 工 作 。 每 个 ICD 的 主 要 组 件 是 模 块 。 一 个 完 整 的 系 统 包 括 模 块 、 适 配头 、 演 示 板 、 电 缆 和 MPLAB IDE 软 件 。MPLAB ICE 2000Microchip PICmicro 单 片 机 的 在 线 仿 真 器 , 与 MPLAB IDE 配 合 工 作 。MPLAB ICE 4000Microchip dsPIC DSC 的 在 线 仿 真 器 , 与 MPLAB IDE 配 合 工 作 。MPLAB IDEMicrochip 的 集 成 开 发 环 境 。MPLAB LIB30MPLAB LIB30 归 档 器 / 库 管 理 器 是 目 标 库 管 理 器 , 用 于 使 用 MPLAB ASM30 或 MPLAB<strong>C30</strong> C 编 译 器 生 成 的 COFF 目 标 模 块 。MPLAB LINK30MPLAB LINK30 是 Microchip MPLAB ASM30 汇 编 器 和 Microchip MPLAB <strong>C30</strong> C 编 译 器的 目 标 链 接 器 。MPLAB SIMMicrochip 支 持 PICmicro MCU 器 件 的 软 件 模 拟 器 , 与 MPLAB IDE 配 合 工 作 。MPLAB SIM30Microchip 支 持 dsPIC DSC 器 件 的 软 件 模 拟 器 , 与 MPLAB IDE 配 合 工 作 。MPLIB 目 标 库 管 理 器 (MPLIB Object Librarian)MPLIB 库 管 理 器 是 目 标 库 管 理 器 , 用 于 使 用 MPLAB ASM 汇 编 器 (mpasm 或mpasmwin v2.0) 或 MPLAB C1X C 编 译 器 生 成 的 COFF 目 标 模 块 。DS51284C_CN 第 174 页© 2005 Microchip Technology Inc.


术 语 表MPLINK 目 标 链 接 器 (MPLINK Object Linker)MPLINK 链 接 器 是 Microchip MPASM 汇 编 器 和 MPLAB C17 或 C18 C 编 译 器 的 目 标 链 接器 。 MPLINK 链 接 器 也 可 与 Microchip MPLIB 库 管 理 器 配 合 使 用 。 MPLINK 链 接 器 设计 为 与 MPLAB IDE 配 合 使 用 , 尽 管 可 以 不 通 过 MPLAB IDE 使 用 它 。MRU最 近 使 用 的 。 指 可 从 MPLAB IDE 主 下 拉 菜 单 选 择 的 文 件 和 窗 口 。命 令 行 接 口 (Command Line Interface)仅 基 于 文 本 输 入 和 输 出 , 在 程 序 和 其 用 户 之 间 进 行 通 讯 的 一 种 方 式 。模 板 (Template)为 以 后 插 入 自 己 的 文 件 中 而 构 建 的 文 本 行 。 MPLAB 编 辑 器 在 模 板 文 件 中 存 储 模 板 。目 标 (Target)指 用 户 硬 件 。目 标 板 (Target Board)构 成 目 标 应 用 的 电 路 和 可 编 程 器 件 。目 标 处 理 器 (Target Processor)目 标 应 用 板 上 的 单 片 机 。目 标 代 码 (Object Code)汇 编 器 或 编 译 器 生 成 的 机 器 代 码 。目 标 文 件 (Object File)包 含 机 器 代 码 并 可 能 包 含 调 试 信 息 的 文 件 。 可 能 是 可 直 接 执 行 的 文 件 , 或 是 需 要 与 其他 目 标 文 件 ( 如 库 ) 链 接 生 成 完 整 的 可 执 行 程 序 的 可 重 定 位 文 件 。目 标 文 件 伪 指 令 (Object File Directives)仅 当 生 成 目 标 文 件 时 使 用 的 伪 指 令 。目 标 应 用 程 序 (Target Application)目 标 板 上 的 软 件 。NOP空 操 作 。 执 行 该 指 令 时 , 除 了 程 序 计 数 器 加 1 外 没 有 任 何 其 他 影 响 。内 部 链 接 (Internal Linkage)如 果 不 能 从 定 义 函 数 或 变 量 的 模 块 外 部 访 问 它 们 , 则 这 样 的 函 数 或 变 量 具 有 内 部 链 接 。OTP可 一 次 编 程 。 非 窗 口 封 装 的 EPROM 器 件 。 由 于 EPROM 需 要 紫 外 线 照 射 来 擦 除 其 存 储内 容 , 因 此 只 有 窗 口 器 件 是 可 擦 除 的 。PC个 人 计 算 机 或 程 序 计 数 器 。PC 主 机 (PC Host)运 行 有 一 个 支 持 的 Windows 操 作 系 统 的 任 何 IBM 或 兼 容 个 人 计 算 机 。© 2005 Microchip Technology Inc. DS51284C_CN 第 175 页


MPLAB ® <strong>C30</strong> 用 户 指 南PICmicro MCUPICmicro 单 片 机 (MCU) 指 Microchip 的 所 有 单 片 机 系 列 。PICSTART PlusMicrochip 器 件 的 开 发 编 程 器 。 可 烧 写 8、14、28 和 40 引 脚 的 PICmicro 单 片 机 。 必 须 与MPLAB IDE 软 件 配 合 使 用 。PRO MATE IIMicrochip 的 器 件 编 程 器 。 可 对 所 有 PICmicro 单 片 机 、 大 多 数 存 储 器 和 Keeloq 器 件 进 行编 程 。 可 与 MPLAB IDE 配 合 使 用 或 单 独 使 用 。PWM 信 号 (PWM Signal)脉 冲 宽 度 调 制 信 号 。 某 些 PICmicro MCU 包 含 PWM 外 设 。跑 表 (Stopwatch)测 量 执 行 周 期 的 计 数 器 。配 置 位 (Configuration Bit)可 编 程 来 设 置 PICmicro 单 片 机 工 作 模 式 的 专 用 位 。 配 置 位 可 或 不 可 再 编 程 。片 外 存 储 器 (Off-Chip Memory)指 PIC17CXXX 或 PIC18CXXX 器 件 的 一 个 存 储 器 选 择 , 这 种 情 况 下 存 储 器 可 位 于 目 标板 上 , 或 所 有 程 序 存 储 器 都 由 仿 真 器 提 供 。 通 过 Options > Development Mode 访 问 的Memory 选 项 卡 提 供 片 外 存 储 器 选 择 对 话 框 。器 件 编 程 器 (Device Programmer)用 于 对 电 可 编 程 半 导 体 器 件 ( 如 单 片 机 ) 进 行 编 程 的 工 具 。嵌 套 深 度 (Nesting Depth)宏 可 包 含 其 他 宏 的 最 大 深 度 。RAM随 机 访 问 存 储 器 ( 数 据 存 储 器 )。 这 种 存 储 器 中 的 信 息 可 以 按 任 意 顺 序 访 问 。ROM只 读 存 储 器 ( 程 序 存 储 器 )。 不 能 修 改 的 存 储 器 。Run将 仿 真 器 从 暂 停 状 态 释 放 , 允 许 仿 真 器 实 时 运 行 应 用 代 码 、 实 时 改 变 I/O 状 态 或 实 时 响应 I/O 的 命 令 。软 件 模 拟 器 (Simulator)模 拟 器 件 操 作 的 软 件 程 序 。SFR参 见 特 殊 功 能 寄 存 器 。ShellMPASM 汇 编 器 shell 是 宏 汇 编 器 的 一 个 提 示 符 输 入 接 口 。 有 两 种 MPASM 汇 编 器 shell:一 种 是 DOS 版 本 , 一 种 是 Windows 版 本 。DS51284C_CN 第 176 页© 2005 Microchip Technology Inc.


术 语 表Single Step这 一 命 令 单 步 执 行 代 码 , 一 次 执 行 一 条 指 令 。 执 行 每 条 指 令 后 , MPLAB IDE 更 新 寄 存器 窗 口 、 通 过 查 看 变 量 及 状 态 显 示 , 可 分 析 和 调 试 指 令 。 也 可 单 步 执 行 C 编 译 器 源 代码 , 但 不 是 执 行 一 条 指 令 , MPLAB IDE 将 执 行 一 行 高 级 C 语 句 生 成 的 所 有 汇 编 指 令 。Skew不 同 时 间 出 现 在 处 理 器 总 线 上 与 指 令 执 行 有 关 的 信 息 。 例 如 , 执 行 前 一 条 指 令 的 过 程中 取 指 时 , 被 执 行 的 操 作 码 出 现 在 总 线 上 ; 当 实 际 执 行 操 作 码 时 , 源 数 据 地 址 及 其 值以 及 目 标 数 据 地 址 出 现 在 总 线 上 。 当 执 行 下 一 条 指 令 时 , 目 标 数 据 值 出 现 在 总 线 上 。跟 踪 缓 冲 区 一 次 捕 捉 总 线 上 的 这 些 信 息 。 因 此 , 跟 踪 缓 冲 区 的 一 条 记 录 将 包 含 三 条 指令 的 执 行 信 息 。 执 行 一 条 指 令 时 , 从 一 条 信 息 到 另 一 条 信 息 的 捕 捉 周 期 数 称 为 skew。Skid当 使 用 硬 件 断 点 来 暂 停 处 理 器 时 , 在 处 理 器 暂 停 前 可 能 再 执 行 一 条 或 多 条 指 令 。 断 点后 执 行 的 指 令 条 数 称 为 skid。Step Into这 一 命 令 与 Single Step 相 同 。Step Into ( 与 Step Over 相 对 ) 在 CALL 指 令 后 , 单 步 执行 子 程 序 。Step OverStep Over 允 许 调 试 代 码 , 但 不 单 步 执 行 子 程 序 。 当 step over 一 条 CALL 指 令 时 , 下 一个 断 点 将 设 置 在 CALL 指 令 的 下 一 条 指 令 处 。 如 果 由 于 某 种 原 因 , 子 程 序 陷 入 无 限 循环 或 不 正 确 返 回 , 下 一 个 断 点 将 永 远 执 行 不 到 。 除 了 对 CALL 指 令 的 处 理 外 , StepOver 命 令 与 Single Step 相 同 。闪 存 (Flash)按 块 ( 而 不 是 按 字 节 ) 写 或 擦 除 数 据 的 EEPROM 类 型 。上 电 复 位 仿 真 (Power-on-Reset Emulation)在 开 始 为 应 用 上 电 时 , 将 随 机 值 写 到 数 据 RAM 区 中 来 模 拟 RAM 中 的 未 初 始 化 值 的 软 件随 机 过 程 。实 时 (Real-Time)当 从 仿 真 器 或 MPLAB ICD 模 式 的 暂 停 状 态 释 放 时 , 处 理 器 以 实 时 模 式 运 行 且 与 正 常 芯片 的 操 作 相 同 。 在 实 时 模 式 下 , 使 能 MPLAB ICE 的 实 时 跟 踪 缓 冲 区 , 并 持 续 捕 捉 所 有选 择 的 周 期 , 使 能 所 有 break 逻 辑 。 在 仿 真 器 或 MPLAB ICD 模 式 下 , 处 理 器 实 时 运行 , 直 到 有 效 断 点 导 致 暂 停 , 或 者 直 到 用 户 暂 停 仿 真 器 。 在 软 件 模 拟 器 模 式 下 , 实 时仅 意 味 着 单 片 机 指 令 的 执 行 速 度 与 主 机 CPU 可 模 拟 的 指 令 速 度 一 样 快 。事 件 (Event)对 可 能 包 含 地 址 、 数 据 、 次 数 计 数 、 外 部 输 入 、 周 期 类 型 ( 取 指 和 读 / 写 ) 及 时 间 标 记的 总 线 周 期 的 描 述 。 事 件 用 于 描 述 触 发 、 断 点 和 中 断 。© 2005 Microchip Technology Inc. DS51284C_CN 第 177 页


MPLAB ® <strong>C30</strong> 用 户 指 南数 据 存 储 器 (Data Memory)在 Microchip MCU 和 DSC 器 件 中 , 数 据 存 储 器 (RAM) 由 通 用 寄 存 器 (GPR) 和 特殊 功 能 寄 存 器 (SFR) 组 成 。 某 些 器 件 还 有 EEPROM 数 据 存 储 器 。数 据 伪 指 令 (Data Directive)指 控 制 汇 编 器 分 配 程 序 和 数 据 存 储 空 间 , 并 提 供 通 过 符 号 ( 即 有 意 义 的 名 字 ) 引 用 数据 项 的 方 法 的 伪 指 令 。特 殊 功 能 寄 存 器 (Special Function Registers)数 据 存 储 器 (RAM) 中 专 门 用 于 控 制 I/O 处 理 器 功 能 、 I/O 状 态 、 定 时 器 或 其 他 模 式 或外 设 的 部 分 。UploadUpload 函 数 将 数 据 从 一 个 工 具 , 如 仿 真 器 或 编 程 器 , 传 送 到 主 机 PC, 或 将 数 据 从 目 标板 传 送 到 仿 真 器 。Watch ( 观 察 ) 窗 口 (Watch Window)Watch 窗 口 包 含 一 系 列 观 察 变 量 , 这 些 变 量 在 每 次 执 行 到 断 点 时 更 新 。WDT参 见 看 门 狗 定 时 器 。外 部 RAM (External RAM)片 外 的 读 / 写 存 储 器 。外 部 标 号 (External Label)具 有 外 部 链 接 的 标 号 。外 部 符 号 (External Symbol)具 有 外 部 链 接 的 标 识 符 符 号 。 这 可 能 是 一 个 引 用 或 一 个 定 义 。外 部 符 号 解 析 (External Symbol Resolution)链 接 器 搜 集 所 有 输 入 模 块 的 外 部 符 号 定 义 来 解 析 所 有 外 部 符 号 引 用 的 过 程 。 没 有 相 应定 义 的 任 何 外 部 符 号 引 用 都 会 导 致 报 告 链 接 器 错 误 。外 部 链 接 (External Linkage)如 果 可 以 在 定 义 函 数 或 变 量 的 模 块 之 外 引 用 它 们 , 那 么 这 种 函 数 或 变 量 就 具 有 外 部 链接 。外 部 输 入 行 (External Input Line)用 于 根 据 外 部 信 号 设 置 事 件 的 外 部 输 入 信 号 逻 辑 探 针 行 (TRIGIN)。微 处 理 器 模 式 (Microprocessor Mode)PIC17CXXX 和 PIC18CXXX 系 列 单 片 机 的 一 种 程 序 存 储 器 配 置 。 在 微 处 理 器 模 式 下 ,不 使 用 片 内 的 程 序 存 储 器 。 整 个 程 序 存 储 器 映 射 到 外 部 。伪 指 令 (Directive)源 代 码 中 控 制 语 言 工 具 操 作 的 语 句 。DS51284C_CN 第 178 页© 2005 Microchip Technology Inc.


术 语 表未 初 始 化 数 据 (Uninitialized Data)定 义 时 未 提 供 初 值 的 数 据 。 在 C 中 ,int myVar;定 义 了 将 存 放 在 未 初 始 化 数 据 段 的 一 个 变 量 。文 件 寄 存 器 (File Register)片 内 数 据 存 储 器 , 包 括 通 用 寄 存 器 (GPR) 和 特 殊 功 能 寄 存 器 (SFR)。系 统 窗 口 控 制 (System Window Control)系 统 窗 口 控 制 位 于 窗 口 或 某 些 对 话 框 的 左 上 角 。 点 击 这 一 控 制 通 常 会 弹 出 包 含“Minimize”、“ Maximize” 和 “Close” 项 的 菜 单 。下 载 (Download)数 据 从 主 机 发 送 到 其 他 设 备 , 如 仿 真 器 、 编 程 器 或 目 标 板 的 过 程 。限 定 符 (Qualifier)次 数 计 数 器 使 用 的 地 址 或 地 址 范 围 , 或 用 作 复 杂 触 发 中 另 一 个 操 作 之 前 的 事 件 。项 目 (Project)为 应 用 构 建 目 标 代 码 和 可 执 行 代 码 的 一 组 源 文 件 及 指 令 。消 息 (Message)显 示 出 来 的 文 本 , 警 告 在 语 言 工 具 的 操 作 中 可 能 存 在 的 问 题 。 消 息 不 会 停 止 操 作 。异 步 激 励 (Asynchronous Stimulus)为 模 拟 模 拟 器 件 的 外 部 输 入 而 生 成 的 数 据 。应 用 (Application)可 由 PICmicro 单 片 机 控 制 的 一 组 软 件 和 硬 件 。原 始 数 据 (Raw Data)与 一 个 段 有 关 的 代 码 或 数 据 的 二 进 制 表 示 。原 型 系 统 (Prototype System)指 用 户 目 标 应 用 或 目 标 板 的 一 个 术 语 。源 代 码 (Source Code)编 程 人 员 编 写 计 算 机 程 序 的 形 式 。 采 用 某 种 正 式 的 编 程 语 言 编 写 源 代 码 , 可 翻 译 为 机器 代 码 或 被 解 释 程 序 执 行 。源 文 件 (Source File)包 含 源 代 码 的 ASCII 文 本 文 件 。运 算 符 (Operator)构 成 表 达 式 时 使 用 的 符 号 , 如 加 法 符 号 “+” 和 减 法 符 号 “-”。 每 个 运 算 符 都 有 用 于确 定 求 值 顺 序 的 指 定 优 先 顺 序 。暂 停 (Halt)停 止 程 序 执 行 。 执 行 Halt 与 在 断 点 处 停 止 相 同 。© 2005 Microchip Technology Inc. DS51284C_CN 第 179 页


MPLAB ® <strong>C30</strong> 用 户 指 南指 令 (Instruction)告 知 中 央 处 理 单 元 执 行 特 定 操 作 , 并 包 含 操 作 中 要 使 用 的 数 据 的 一 系 列 位 。指 令 集 (Instruction Set)特 定 处 理 器 理 解 的 机 器 语 言 指 令 的 集 合 。中 断 (Interrupt)发 送 到 CPU 的 信 号 , 暂 停 正 在 运 行 的 应 用 程 序 , 并 将 控 制 权 转 交 给 中 断 服 务 程 序 来 处理 事 件 。中 断 处 理 程 序 (Interrupt Handler)发 生 中 断 时 处 理 特 殊 代 码 的 子 程 序 。中 断 服 务 程 序 (Interrupt Service Routine)用 户 生 成 的 代 码 , 当 发 生 中 断 时 进 入 这 种 程 序 。 这 种 代 码 在 程 序 存 储 器 中 的 位 置 通 常取 决 于 所 发 生 中 断 的 类 型 。中 断 请 求 (Interrupt Request)处 理 器 暂 停 正 常 的 指 令 执 行 并 开 始 执 行 中 断 处 理 程 序 的 事 件 。 某 些 处 理 器 有 几 种 中 断请 求 事 件 , 允 许 具 有 不 同 的 中 断 优 先 级 。助 记 符 (Mnemonics)可 直 接 翻 译 为 机 器 代 码 的 文 本 指 令 。 也 称 为 操 作 码 。状 态 条 (Status Bar)状 态 条 位 于 MPLAB IDE 窗 口 的 底 部 , 表 明 光 标 位 置 、 开 发 模 式 和 器 件 , 以 及 有 效 工 具条 等 当 前 信 息 。字 母 数 字 (Alphanumeric)字 母 数 字 字 符 由 字 母 字 符 和 十 进 制 数 字 (0,1, …, 9) 组 成 。字 母 字 符 (Alphabetic Character)字 母 字 符 指 阿 拉 伯 字 母 (a, b, …, z, A, B, …, Z) 字 符 。DS51284C_CN 第 180 页© 2005 Microchip Technology Inc.


MPLAB ® <strong>C30</strong>用 户 指 南索 引符 号#define ..................................................................... 47#ident ....................................................................... 54#if ............................................................................. 40#include................................................... 48, 49, 79, 81#line.......................................................................... 50#pragma....................................................37, 107, 156.bss..............................................................15, 62, 107.const.............................................................61, 63, 75.data ............................................................15, 61, 107.dconst...................................................................... 62.dinit.....................................................................62, 63.nbss......................................................................... 62.ndata ....................................................................... 61.ndconst.................................................................... 62.pbss....................................................................62, 63.text ................................................. 22, 32, 61, 67, 107.tmpdata ................................................................. 158A-A.............................................................................. 47abort..................................................................21, 110address 属 性 .......................................................12, 19alias 属 性 .................................................................. 19aligned 属 性 ............................................................. 13-ansi ..............................................................23, 34, 50ANSI C, 严 格 ............................................................ 35ANSI C 标 准 ............................................................... 9ANSI C 与 MPLAB <strong>C30</strong> 的 差 别 ................................ 11ANSI 标 准 函 数 库 支 持 ................................................. 9ANSI-89 扩 展 ........................................................... 77ASCII 字 符 集 .......................................................... 161asm .............................................................13, 97, 156auto_psv 空 间 .......................................................... 31-aux-info ................................................................... 34B编 写 中 断 服 务 程 序 .................................................... 88编 写 ISR 的 要 领 ....................................................... 88编 写 ISR 的 语 法 ....................................................... 88编 译 单 个 文 件 ............................................................ 56编 译 多 个 文 件 ............................................................ 58编 译 器概 述 ..................................................................... 7命 令 行 ............................................................... 29驱 动 程 序 ............................................. 9, 29, 52, 56编 译 器 管 理 的 资 源 .................................................. 158标 量 .......................................................................... 65标 识 符 .................................................................... 103标 志 , 正 的 形 式 , 负 的 形 式 ..................................46, 53-B.........................................................................52, 55C参 数 , 函 数 ................................................................ 72常 量二 进 制 ............................................................... 28预 定 义 ............................................................... 56字 符 串 ............................................................. 155程 序 存 储 器 指 针 ........................................................ 65程 序 存 储 空 间 ............................................................ 60程 序 空 间 可 视 化 窗 口 。 参 见 PSV 窗 口 。持 久 数 据 ......................................................63, 83, 158处 理 器 头 文 件 .................................................56, 79, 81传 统 C....................................................................... 40存 储 类 别 ................................................................. 154存 储 器 .................................................................... 110存 储 区 , 快 速 访 问 ................................................... 156存 储 模 型 ........................................................... 65, 157-mconst-in-code ................................................ 65-mconst-in-data ................................................. 65-mlarge-code..................................................... 65-mlarge-data...................................................... 65-msmall-code .................................................... 65-msmall-data ..................................................... 65-msmall-scalar................................................... 65存 储 空 间 ................................................................... 64存 储 限 定 符 ............................................................. 155错 误 ........................................................................ 113错 误 控 制 选 项-pedantic-errors................................................. 35-Werror.............................................................. 39-Werror-implicit-function-declaration ................. 35-C ............................................................................. 47-c ........................................................................ 33, 51C, 与 汇 编 混 合 编 程 ................................................... 95C 堆 使 用 ................................................................... 71C 堆 栈 使 用 ............................................................... 69C 语 言 控 制 选 项 ........................................................ 34-ansi ............................................................ 23, 34-aux-info ............................................................ 34-ffreestanding .................................................... 34-fno-asm............................................................ 34-fno-builtin ......................................................... 34-fno-signed-bitfields........................................... 34-fno-unsigned-bitfields....................................... 34-fsigned-bitfields................................................ 34-funsigned-bitfields............................................ 34-fsigned-char ..................................................... 34-funsigned-char ................................................. 34-fwritable-strings........................................ 34, 158char ............................................. 14, 34, 35, 72, 74, 77COFF ............................................................7, 80, 158© 2005 Microchip Technology Inc. DS51284C_CN 第 181 页


MPLAB ® <strong>C30</strong> 用 户 指 南complex.................................................................... 25const 属 性 .........................................................................20CORCON ......................................................63, 79, 80D大 代 码 模 型 ......................................................... 31, 78大 数 据 模 型 ......................................................... 31, 61代 码 长 度 , 减 小 ................................................... 31, 42代 码 和 数 据 段 ............................................................ 61代 码 生 成 约 定 选 项 .................................................... 53-fargument-alias ................................................ 53-fargument-noalias ............................................ 53-fargument-noalias-global ................................. 53-fcall-saved........................................................ 53-fcall-used ......................................................... 53-ffixed ................................................................ 53-finstrument-functions ....................................... 53-fno-ident........................................................... 54-fno-short-double............................................... 54-fno-verbose-asm.............................................. 54-fpack-struct ...................................................... 54-fpcc-struct-return.............................................. 54-fshort-enums.................................................... 54-fverbose-asm ................................................... 54-fvolatile............................................................. 54-fvolatile-global.................................................. 54-fvolatile-static ................................................... 54低 优 先 级 中 断 ............................................................ 87地 址 空 间 ................................................................... 59调 度 .......................................................................... 44调 用 约 定 ................................................................. 157定 义 全 局 寄 存 器 变 量 ................................................. 24定 位 代 码 和 数 据 ........................................................ 67堆 ........................................................................................60堆 , C 使 用 ................................................................ 71读 物 , 推 荐 .................................................................. 4段 .................................................................43, 61, 158段 , 代 码 和 数 据 ......................................................... 61对 齐 .......................................................13, 15, 72, 106堆 栈 ...............................................................60, 92, 93软 件 ................................................................... 68使 用 ................................................................. 154指 针 (W15) ...................................... 53, 63, 68, 69指 针 限 制 寄 存 器 (SPLIM)............................. 63, 68C 使 用 ............................................................... 69堆 栈 软 件 ................................................................... 69-D ..................................................................47, 48, 50-dD ........................................................................... 47deprecated 属 性 ............................................13, 20, 40-dM ........................................................................... 47-dN ........................................................................... 47double ............................................. 54, 72, 74, 78, 154DWARF .................................................................... 31E二 进 制 ...................................................................... 28-E....................................................... 33, 47, 49, 50, 51EEDATA............................................................. 83, 84EEPROM, 数 据 ........................................................ 83ELF....................................................................... 7, 31endian ...................................................................... 77errno ....................................................................... 110exit.......................................................................... 110extern ........................................................... 40, 46, 54F翻 译 ........................................................................ 102返 回 值 ....................................................................... 74返 回 值 类 型 ............................................................... 36符 号 .......................................................................... 51浮 点 型 ............................................................... 78, 104浮 点 型 数 据 类 型 ........................................................ 78复 数浮 点 型 ............................................................... 25数 字 ................................................................... 25数 据 类 型 ............................................................ 25整 型 ................................................................... 25复 位 .................................................................... 90, 93复 位 向 量 ................................................................... 60-falign-functions ........................................................ 43-falign-labels ............................................................. 43-falign-loops.............................................................. 43far 数 据 空 间 .............................................................. 66far 属 性 ................................ 13, 20, 61, 62, 66, 98, 155-fargument-alias ....................................................... 53-fargument-noalias ................................................... 53-fargument-noalias-global......................................... 53-fcaller-saves ............................................................ 43-fcall-saved ............................................................... 53-fcall-used................................................................. 53-fcse-follow-jumps .................................................... 43-fcse-skip-blocks....................................................... 43-fdata-sections.......................................................... 43-fdefer-pop. 参 见 -fno-defer-fexpensive-optimizations......................................... 43-ffixed........................................................................ 53-fforce-mem ........................................................ 42, 46-ffreestanding ........................................................... 34-ffunction-sections .................................................... 43-fgcse........................................................................ 44-fgcse-lm................................................................... 44-fgcse-sm.................................................................. 44-finline-functions ......................................23, 39, 42, 46-finline-limit ............................................................... 46-finstrument-functions......................................... 21, 53-fkeep-inline-functions ........................................ 23, 46-fkeep-static-consts .................................................. 46float....................................................14, 54, 72, 74, 78-fmove-all-movables ................................................. 44-fno ..................................................................... 46, 53-fno-asm ................................................................... 34-fno-builtin................................................................. 34-fno-defer-pop........................................................... 44-fno-function-cse....................................................... 46-fno-ident .................................................................. 54-fno-inline.................................................................. 47-fno-keep-static-consts ............................................. 46-fno-peephole ........................................................... 44-fno-peephole2 ......................................................... 44-fno-short-double ...................................................... 54-fno-show-column..................................................... 47-fno-signed-bitfields .................................................. 34DS51284C_CN 第 182 页© 2005 Microchip Technology Inc.


索 引-fno-unsigned-bitfields.............................................. 34-fno-verbose-asm..................................................... 54-fomit-frame-pointer.............................................42, 47-foptimize-register-move .......................................... 44-foptimize-sibling-calls.............................................. 47format_arg 属 性 ........................................................ 21format 属 性 ............................................................... 20-fpack-struct ............................................................. 54-fpcc-struct-return..................................................... 54-freduce-all-givs ....................................................... 44-fregmove................................................................. 44-frename-registers.................................................... 44-frerun-cse-after-loop ..........................................44, 45-frerun-loop-opt ........................................................ 44-fschedule-insns....................................................... 44-fschedule-insns2..................................................... 44-fshort-enums........................................................... 54-fsigned-bitfields....................................................... 34-fsigned-char ............................................................ 34FSRn...................................................................... 158-fstrength-reduce.................................................44, 45-fstrict-aliasing...............................................42, 43, 45-fsyntax-only............................................................. 35-fthread-jumps.....................................................42, 45-funroll-all-loops ..................................................43, 45-funroll-loops .................................................42, 43, 45-funsigned-bitfields................................................... 34-funsigned-char ........................................................ 34-fverbose-asm .......................................................... 54-fvolatile.................................................................... 54-fvolatile-global......................................................... 54-fvolatile-static .......................................................... 54-fwritable-strings................................................34, 158G高 优 先 级 中 断 ........................................................... 87归 档 器 ........................................................................ 7功 能 ............................................................................ 9公 共 子 表 达 式 消 除 ...............................................43, 44关 键 字 差 别 ............................................................... 11过 程 抽 象 ............................................................31, 158-g.............................................................................. 41getenv .................................................................... 111H函 数参 数 ................................................................... 72调 用 约 定 ........................................................... 72指 针 ................................................................... 65函 数 调 用 , 保 存 寄 存 器 .............................................. 74函 数 调 用 时 保 存 寄 存 器 ............................................. 74函 数 指 针 ................................................................... 65行 内 ...................................................................97, 156行 内 汇 编 使 用 ....................................................................83环 境 ................................................................................. 102环 境 变 量 ................................................................... 55PI<strong>C30</strong>_C_INCLUDE_PATH.............................. 55PI<strong>C30</strong>_COMPILER_PATH ............................... 55PI<strong>C30</strong>_EXEC_PREFIX ..................................... 55PI<strong>C30</strong>_LIBRARY_ PATH.................................. 55PI<strong>C30</strong>_OMF...................................................... 55TMPDIR ............................................................ 55汇 编 , 行 内 ........................................................ 97, 156汇 编 选 项 ................................................................... 50-Wa ................................................................... 50汇 编 , 与 C 混 合 编 程 ................................................. 95汇 编 器 ........................................................................ 7宏 .............................................................47, 48, 50, 83配 置 位 设 置 ........................................................ 83行 内 汇 编 使 用 ...........................................................83宏 , 数 据 存 储 器 分 配 ........................................................83宏 名 , 预 定 义 ..................................................................155-H ............................................................................. 47--heap....................................................................... 71--help ........................................................................ 33hex 文 件 ............................................................................57I-I ....................................................................48, 50, 55-I-........................................................................ 48, 50-idirafter .................................................................... 48IEEE 754 ................................................................ 154-imacros ............................................................. 48, 50imag ......................................................................... 25-include............................................................... 48, 50Inline..............................................................39, 42, 46inline................................................................... 47, 54int ............................................................14, 72, 74, 77interrup 属 性 .....................................................................92interrupt 属 性 .....................................................22, 89, 156-iprefix ...................................................................... 48IRQ........................................................................... 90ISR编 写 ...........................................................................88编 写 的 要 领 ...............................................................88编 写 的 语 法 ...............................................................88ISR 声 明 ............................................................................84-isystem.............................................................. 48, 52-iwithprefix ................................................................ 48-iwithprefixbefore...................................................... 48J寄 存 器操 作 .........................................................................105定 义 文 件 ...................................................................80约 定 ...........................................................................74减 小 代 码 长 度 ............................................................ 31, 42将 标 号 作 为 值 ...................................................................27结 构 ........................................................................... 72, 106结 构 , 匿 名 ......................................................................156禁 止 警 告 ...........................................................................35警 告 ..................................................................................132警 告 , 禁 止 ........................................................................35警 告 与 错 误 控 制 选 项-fsyntax-only...................................................... 35-pedantic ........................................................... 35-pedantic-errors................................................. 35-W ..................................................................... 38-w ...................................................................... 35-Waggregate-return........................................... 39-Wall.................................................................. 35-Wbad-function-cast.......................................... 39© 2005 Microchip Technology Inc. DS51284C_CN 第 183 页


MPLAB ® <strong>C30</strong> 用 户 指 南-Wcast-align ...................................................... 39-Wcast-qual....................................................... 39-Wchar-subscripts ............................................. 35-Wcomment....................................................... 35-Wconversion .................................................... 39-Wdiv-by-zero.................................................... 35-Werror.............................................................. 39-Werror-implicit-function-declaration ................. 35-Wformat ........................................................... 35-Wimplicit .......................................................... 35-Wimplicit-function-declaration.......................... 35-Wimplicit-int...................................................... 35-Winline ............................................................. 39-Wlarger-than-................................................... 39-Wlong-long....................................................... 39-Wmain.............................................................. 35-Wmissing-braces ............................................. 35-Wmissing-declarations..................................... 39-Wmissing-format-attribute................................ 39-Wmissing-noreturn........................................... 40-Wmissing-prototypes ....................................... 40-Wmultichar....................................................... 36-Wnested-externs.............................................. 40-Wno-long-long ................................................. 39-Wno-multichar.................................................. 36-Wno-sign-compare........................................... 40-Wpadded ......................................................... 40-Wparentheses.................................................. 36-Wpointer-arith .................................................. 40-Wredundant-decls............................................ 40-Wreturn-type .................................................... 36-Wsequence-point............................................. 36-Wshadow ......................................................... 40-Wsign-compare................................................ 40-Wstrict-prototypes............................................ 40-Wswitch ........................................................... 37-Wsystem-headers............................................ 37-Wtraditional...................................................... 40-Wtrigraphs ....................................................... 37-Wundef ............................................................ 40-Wuninitialized................................................... 37-Wunknown-pragmas........................................ 37-Wunreachable-code......................................... 40-Wunused.......................................................... 37-Wunused-function............................................ 37-Wunused-label................................................. 37-Wunused-parameter ........................................ 38-Wunused-value................................................ 38-Wunused-variable............................................ 38-Wwrite-strings .................................................. 41局 部 寄 存 器 变 量 ................................................................24K开 发 工 具 ..............................................................................7可 执 行 文 件 ........................................................................56客 户 支 持 ..............................................................................6客 户 通 知 服 务 ......................................................................6库 ........................................................................ 51, 56函 数 ......................................................................... 108快 速 访 问 存 储 区 ............................................................. 156窥 孔 优 化 ............................................................................44扩 展 名 ................................................................................49L类 型 转 换 ............................................................................39联 合 ..................................................................................106链 接 选 项 ............................................................................51-L ................................................................. 51, 52-l ........................................................................ 51-nodefaultlibs..................................................... 51-nostdlib............................................................. 51-s ....................................................................... 51-u ....................................................................... 51-Wl..................................................................... 51-Xlinker .............................................................. 51链 接 描 述 文 件 ...........................................56, 68, 80, 81链 接 器 ................................................................................51流 ......................................................................................109-L ........................................................................ 51, 52-l ............................................................................... 51little endian ............................................................... 77long..........................................................14, 72, 74, 77long double........................................14, 54, 72, 74, 78long long..........................................14, 39, 74, 77, 154long long int .............................................................. 26M枚 举 ..................................................................................106命 令 行 选 项 ........................................................................30命 令 行 编 译 器 ...................................................................29目 标 模 块 格 式 .................................................................158目 标 文 件 ...............................................................43, 51, 56目 录 .......................................................................48, 50, 56目 录 搜 索 选 项 ...................................................................52-B ............................................................. 52, 55-specs=.......................................................... 52-M ............................................................................. 49Mabonga ................................................................ 156MATH_DATA.......................................................... 158-mconst-in-code.................................31, 61, 62, 63, 65-mconst-in-data .................................................. 31, 65-MD........................................................................... 49-merrata.................................................................... 31-MF ........................................................................... 49-MG .......................................................................... 49-mlarge-code ...................................................... 31, 65-mlarge-data ............................................31, 61, 62, 65-MM .......................................................................... 49-MMD........................................................................ 49-mno-pa .................................................................... 31mode 属 性 .........................................................................14-momf= ..................................................................... 31-MP........................................................................... 49-mpa ......................................................................... 31-mpa= ....................................................................... 31MPLAB C18 与 MPLAB <strong>C30</strong> 的 差 别 ....................... 153MPLAB <strong>C30</strong>............................................................ 7, 9命 令 行 ........................................................................29与 ANSI C 的 差 别 ....................................................11MPLAB <strong>C30</strong> 与 ANSI C 的 差 别 .....................................11MPLAB <strong>C30</strong> 与 MPLAB C18 的 差 别 ..........................153-MQ .......................................................................... 49DS51284C_CN 第 184 页© 2005 Microchip Technology Inc.


索 引-msmall-code ................................................31, 65, 66-msmall-data ..................................... 32, 61, 62, 65, 66-msmall-scalar.....................................................32, 65-msmart-io................................................................ 32-MT........................................................................... 49-mtext= ..................................................................... 32N内 联 函 数 ............................................................................22匿 名 结 构 ......................................................................... 156Near 代 码 和 Far 代 码 ......................................................66Near 数 据 段 ......................................................................65Near 数 据 和 Far 数 据 ......................................................65near 数 据 空 间 ...................................................................99near 属 性 ..............................14, 21, 61, 62, 66, 98, 155no_instrument_function 属 性 .................................. 21, 54-nodefaultlibs............................................................ 51noload 属 性 ................................................................ 14, 21noreturn 属 性 ............................................................. 21, 40-nostdinc .............................................................48, 50-nostdlib ................................................................... 51O-O ........................................................................41, 42-o.........................................................................33, 57-O0 ........................................................................... 42-O1 ........................................................................... 42-O2 ......................................................................42, 46-O3 ........................................................................... 42-Os ........................................................................... 42P配 置 位 设 置 ........................................................................83-P ............................................................................. 50packed 属 性 ............................................................... 15, 54PATH ....................................................................... 56PC .......................................................................... 158-pedantic .............................................................35, 39-pedantic-errors........................................................ 35persistent 属 性 .................................................................15PI<strong>C30</strong>_C_INCLUDE_PATH ................................55, 56PI<strong>C30</strong>_COMPILER_PATH....................................... 55PI<strong>C30</strong>_EXEC_PREFIX .......................................52, 55PI<strong>C30</strong>_LIBRARY_ PATH ......................................... 55PI<strong>C30</strong>_OMF ............................................................. 55pic30-gcc.................................................................. 29Pragma 伪 指 令 .............................................................. 156PROD..................................................................... 158PSV 窗 口 ...........................................................................60PSV 窗 口 .................................................61, 65, 75, 79, 84PSV 使 用 .............................................................75, 84Q器 件 支 持 文 件 ....................................................................79启 动代 码 ................................................................. 158和 初 始 化 ....................................................................63模 块 ............................................................................69模 块 , 主 .....................................................................63前 缀 .....................................................................48, 52驱 动 程 序 ............................................................................55强 制 类 型 转 换 ......................................................37, 38, 39全 局 寄 存 器 变 量 ...............................................................24-Q ............................................................................. 41R软 件 堆 栈 .................................................................... 68, 69RAW 相 关 性 .....................................................................44RCOUNT................................................................ 158real ........................................................................... 25register ............................................................... 24, 25reverse 属 性 .....................................................................15S三 字 母 字 符 ................................................................ 37, 50声 明 符 ..............................................................................106省 略 操 作 数 的 条 件 ...........................................................28实 现 定 义 的 操 作 ....................................................101, 158使 用 宏 ................................................................................83使 用 行 内 汇 编 ...................................................................97使 用 SFR.................................................................. 81使 能 / 禁 止 中 断 ................................................................93输 出 控 制 选 项 ...................................................................33-c ....................................................................... 33-E ...................................................................... 33--help................................................................. 33-o....................................................................... 33-S ...................................................................... 33-v ....................................................................... 33-x ....................................................................... 33数 组 和 指 针 .....................................................................105数 据 表 示 ...........................................................................77数 据 存 储 器 分 配 ...............................................................83数 据 存 储 空 间 .........................................16, 31, 32, 60, 71数 据 存 储 空 间 , Near................................................. 14数 据 格 式 .........................................................................154数 据 类 型 .................................................................... 14, 77浮 点 型 .......................................................................78整 型 ...........................................................................77指 针 ...........................................................................78属 性 ..................................................................................156属 性 , 变 量address ............................................................. 12aligned .............................................................. 13deprecated ........................................................ 13far.....................................................13, 61, 62, 66mode ................................................................. 14near..................................................14, 61, 62, 66noload ............................................................... 14packed .............................................................. 15persistent .......................................................... 15reverse .............................................................. 15section............................................................... 15sfr ...................................................................... 16space ................................................................ 16transparent_union ............................................. 17unordered.......................................................... 17unused .............................................................. 17weak.................................................................. 17属 性 , 函 数address ............................................................. 19alias................................................................... 19© 2005 Microchip Technology Inc. DS51284C_CN 第 185 页


MPLAB ® <strong>C30</strong> 用 户 指 南const ................................................................. 20deprecated ........................................................ 20far...................................................................... 20format................................................................ 20interrupt..................................................22, 89, 92near................................................................... 21no_instrument_function............................... 21, 54noload ............................................................... 21noreturn....................................................... 21, 40section......................................................... 22, 67shadow........................................................ 22, 89unused .............................................................. 22weak.................................................................. 22属 性 , 函 数 format_arg.............................................. 21双 字 整 型 ............................................................................26-S........................................................................ 33, 51-s .............................................................................. 51-save-temps ............................................................. 41section 属 性 .........................................................15, 22, 67SFR ................................................... 57, 60, 79, 80, 81sfr 属 性 ...............................................................................16shadow 属 性 ..................................................... 22, 89, 156short ..............................................................72, 74, 77short long ............................................................... 154signed char............................................................... 77signed int.................................................................. 77signed long............................................................... 77signed long long ....................................................... 77signed short.............................................................. 77Small Code Model.................................................... 78space 属 性 .................................................16, 155, 156-specs=..................................................................... 52SPLIM ...................................................................... 68SR .......................................................................... 158static......................................................................... 54STATUS ................................................................. 158strerror.................................................................... 111switch ....................................................................... 37T特 殊 功 能 寄 存 器 ...................................................57, 79, 92调 试 选 项 ............................................................................41-g....................................................................... 41-Q ...................................................................... 41-save-temps ...................................................... 41调 试 信 息 ............................................................................41头 文 件 .........................................30, 47, 48, 49, 50, 52, 55处 理 器 ...........................................................56, 79, 81-T.............................................................................. 80TABLAT.................................................................. 158TBLPTR ................................................................. 158TBLRD ..................................................................... 85TMPDIR ................................................................... 55tmpfile..................................................................... 110-traditional ................................................................ 34transparent_union 属 性 ..................................................17-trigraphs .................................................................. 50U-U ..................................................................47, 48, 50-u .............................................................................. 51-undef ....................................................................... 50unordered 属 性 ................................................................17unsigned char........................................................... 77unsigned int .............................................................. 77unsigned long ........................................................... 77unsigned long long ................................................... 77unsigned short.......................................................... 77unused 属 性 ........................................................17, 22, 37V-v .............................................................................. 33void........................................................................... 74volatile ...................................................................... 54W外 部 符 号 ............................................................................95为 中 断 服 务 程 序 编 写 代 码 ...............................................89为 局 部 变 量 指 定 寄 存 器 ...................................................25未 初 始 化 变 量 ...................................................................62未 使 用 变 量 ........................................................................37未 使 用 函 数 参 数 ...............................................................37位 反 转 寻 址 和 模 寻 址 .......................................................75位 域 .................................................................. 34, 106, 159文 档编 排 .............................................................................. 2约 定 .............................................................................. 3文 件 ..................................................................................109文 件 扩 展 名 ........................................................................30文 件 命 名 约 定 ...................................................................30-W....................................................35, 37, 38, 40, 113-w.............................................................................. 35W14 .................................................................. 69, 158W15 .................................................................. 69, 158-Wa........................................................................... 50-Waggregate-return .................................................. 39-Wall ........................................................35, 37, 38, 41-Wbad-function-cast ................................................. 39-Wcast-align ............................................................. 39-Wcast-qual .............................................................. 39-Wchar-subscripts .................................................... 35-Wcomment .............................................................. 35-Wconversion ........................................................... 39-Wdiv-by-zero ........................................................... 35weak 属 性 .................................................................. 17, 22-Werror ..................................................................... 39-Werror-implicit-function-declaration ........................ 35-Wformat............................................................. 35, 39-Wimplicit.................................................................. 35-Wimplicit-function-declaration ................................. 35-Wimplicit-int............................................................. 35-Winline .................................................................... 39-Wl ............................................................................ 51-Wlarger-than- .......................................................... 39-Wlong-long .............................................................. 39-Wmain ..................................................................... 35-Wmissing-braces..................................................... 35-Wmissing-declarations ............................................ 39-Wmissing-format-attribute ....................................... 39-Wmissing-noreturn .................................................. 40-Wmissing-prototypes............................................... 40-Wmultichar .............................................................. 36DS51284C_CN 第 186 页© 2005 Microchip Technology Inc.


索 引-Wnested-externs..................................................... 40-Wno- ....................................................................... 35-Wno-deprecated-declarations................................. 40-Wno-div-by-zero...................................................... 35-Wno-long-long ........................................................ 39-Wno-multichar......................................................... 36-Wno-sign-compare.............................................38, 40W 寄 存 器 .................................................................... 72, 95-Wpadded ................................................................ 40-Wparentheses......................................................... 36-Wpointer-arith ......................................................... 40-Wredundant-decls................................................... 40WREG.................................................................... 158-Wreturn-type ........................................................... 36-Wsequence-point.................................................... 36-Wshadow ................................................................ 40-Wsign-compare....................................................... 40-Wstrict-prototypes................................................... 40-Wswitch .................................................................. 37-Wsystem-headers................................................... 37-Wtraditional............................................................. 40-Wtrigraphs .............................................................. 37-Wundef ................................................................... 40-Wuninitialized.......................................................... 37-Wunknown-pragmas............................................... 37-Wunreachable-code................................................ 40-Wunused............................................................37, 38-Wunused-function................................................... 37-Wunused-label........................................................ 37-Wunused-parameter ............................................... 38-Wunused-value....................................................... 38-Wunused-variable................................................... 38-Wwrite-strings ......................................................... 41X系 统 ................................................................................. 111系 统 头 文 件 ................................................................. 37, 49下 划 线 ......................................................................... 88, 95限 定 符 ............................................................................. 106响 应 时 间 ............................................................................93向 量 , 复 位 和 异 常 ..................................................... 60小 代 码 模 型 .................................................................31, 78小 数 据 模 型 ...........................................................32, 61, 62写 中 断 向 量 ........................................................................90信 号 ................................................................................. 109选 项 ....................................................................................30代 码 生 成 约 定 ............................................................53调 试 ............................................................................41链 接 ............................................................................51输 出 控 制 ....................................................................33优 化 控 制 ....................................................................42预 处 理 器 控 制 .................................................... 47针 对 dsPIC ........................................................ 31汇 编 ............................................................................50警 告 与 错 误 控 制 ........................................................35C 语 言 控 制 ................................................................34目 录 搜 索 ........................................................... 52循 环 优 化 ............................................................................44循 环 展 开 ................................................................... 45-x .............................................................................. 33-Xlinker..................................................................... 51Y已 初 始 化 变 量 ............................................................ 61一 般 寄 存 器 ............................................................... 98异 常 向 量 ............................................................. 60, 90用 户 定 义 文 本 段 ........................................................ 67优 化 .................................................................... 9, 158优 化 , 窥 孔 ................................................................ 44优 化 , 循 环 ................................................................ 44优 化 控 制 选 项 ............................................................ 42-falign-functions................................................. 43-falign-labels...................................................... 43-falign-loops ...................................................... 43-fcaller-saves..................................................... 43-fcse-follow-jumps ............................................. 43-fcse-skip-blocks ............................................... 43-fdata-sections .................................................. 43-fexpensive-optimizations ................................. 43-fforce-mem....................................................... 46-ffunction-sections............................................. 43-fgcse ................................................................ 44-fgcse-lm ........................................................... 44-fgcse-sm .......................................................... 44-finline-functions................................................ 46-finline-limit........................................................ 46-fkeep-inline-functions....................................... 46-fkeep-static-consts........................................... 46-fmove-all-movables.......................................... 44-fno-defer-pop ................................................... 44-fno-function-cse ............................................... 46-fno-inline .......................................................... 47-fno-peephole.................................................... 44-fno-peephole2.................................................. 44-fomit-frame-pointer .......................................... 47-foptimize-register-move ................................... 44-foptimize-sibling-calls....................................... 47-freduce-all-givs ................................................ 44-fregmove.......................................................... 44-frename-registers............................................. 44-frerun-cse-after-loop ........................................ 44-frerun-loop-opt ................................................. 44-fschedule-insns................................................ 44-fschedule-insns2.............................................. 44-fstrength-reduce............................................... 44-fstrict-aliasing................................................... 45-fthread-jumps................................................... 45-funroll-all-loops ................................................ 45-funroll-loops ..................................................... 45-O ...................................................................... 42-O0 .................................................................... 42-O1 .................................................................... 42-O2 .................................................................... 42-O3 .................................................................... 42-Os .................................................................... 42语 句 ........................................................................ 106语 句 差 别 ................................................................... 27预 处 理 器 ................................................................... 52预 处 理 器 控 制 选 项 .................................................... 47-A ...................................................................... 47-C ...................................................................... 47-D ...................................................................... 47© 2005 Microchip Technology Inc. DS51284C_CN 第 187 页


MPLAB ® <strong>C30</strong> 用 户 指 南-dD .................................................................... 47-dM.................................................................... 47-dN .................................................................... 47-fno-show-column ............................................. 47-H ...................................................................... 47-I........................................................................ 48-I-....................................................................... 48-idirafter............................................................. 48-imacros ............................................................ 48-include ............................................................. 48-iprefix ............................................................... 48-isystem............................................................. 48-iwithprefix......................................................... 48-iwithprefixbefore............................................... 48-M...................................................................... 49-MD ................................................................... 49-MF.................................................................... 49-MG ................................................................... 49-MM................................................................... 49-MMD ................................................................ 49-MQ ................................................................... 49-MT.................................................................... 49-nostdinc ........................................................... 50-P ...................................................................... 50-trigraphs........................................................... 50-U ...................................................................... 50-undef................................................................ 50预 处 理 伪 指 令 .......................................................... 107预 定 义 常 量 ............................................................... 56预 定 义 宏 名 ............................................................. 155运 行 时 环 境 ............................................................... 59Z在 汇 编 语 言 中 使 用 C 变 量 和 C 函 数 .......................... 95展 开 循 环 ................................................................... 45针 对 器 件 的 头 文 件 .................................................... 56针 对 dsPIC 的 选 项 .................................................... 31-mconst-in-code ................................................ 31-mconst-in-data ................................................. 31-merrata ............................................................ 31-mlarge-code..................................................... 31-mlarge-data...................................................... 31-mno-pa............................................................. 31-momf=.............................................................. 31-mpa.................................................................. 31-mpa=................................................................ 31-msmall-code .................................................... 31-msmall-data ..................................................... 32-msmall-scalar................................................... 32-msmart-io......................................................... 32-mtext= .............................................................. 32帧 指 针 (W14)...................................................... 47, 53帧 指 针 (W14)............................................................ 69诊 断 ........................................................................ 113整 型 .................................................................... 77, 98操 作 ................................................................. 104双 字 ................................................................... 26提 升 ................................................................. 155指 定 寄 存 器 中 的 变 量 ................................................. 24指 针 ................................................. 40, 72, 74, 78, 154堆 栈 ................................................................... 53函 数 ................................................................... 65帧 ................................................................. 47, 53转 义 序 列 ................................................................. 103自 动 变 量 ....................................................... 37, 38, 69字 符 ........................................................................ 103字 符 串 ....................................................................... 34字 符 串 常 量 ............................................................. 155中 断处 理 ................................................................... 95低 优 先 级 ............................................................ 87服 务 程 序 现 场 保 护 ............................................. 92高 优 先 级 ............................................................ 87函 数 ................................................................... 95嵌 套 ................................................................... 93请 求 ................................................................... 90使 能 / 禁 止 ......................................................... 93响 应 时 间 ............................................................ 93向 量 ................................................................... 90向 量 , 写 ............................................................. 90优 先 级 ............................................................... 93中 断 服 务 程 序编 写 代 码 ............................................................ 89中 断 嵌 套 ................................................................... 93注 释 .................................................................... 35, 47DS51284C_CN 第 188 页© 2005 Microchip Technology Inc.


索 引注 :© 2005 Microchip Technology Inc. DS51284C_CN 第 189 页


全 球 销 售 及 服 务 网 点美 洲亚 太 地 区亚 太 地 区欧 洲公 司 总 部 Corporate Office2355 West Chandler Blvd.Chandler, AZ 85224-6199Tel: 1-480-792-7200Fax: 1-480-792-7277技 术 支 持 :http://support.microchip.com网 址 :www.microchip.com亚 特 兰 大 AtlantaAlpharetta, GATel: 1-770-640-0034Fax: 1-770-640-0307波 士 顿 BostonWestborough, MATel: 1-774-760-0087Fax: 1-774-760-0088芝 加 哥 ChicagoItasca, ILTel: 1-630-285-0071Fax: 1-630-285-0075达 拉 斯 DallasAddison, TXTel: 1-972-818-7423Fax: 1-972-818-2924底 特 律 DetroitFarmington Hills, MITel: 1-248-538-2250Fax: 1-248-538-2260科 科 莫 KokomoKokomo, INTel: 1-765-864-8360Fax: 1-765-864-8387洛 杉 矶 Los AngelesMission Viejo, CATel: 1-949-462-9523Fax: 1-949-462-9608圣 何 塞 San JoseMountain View, CATel: 1-650-215-1444Fax: 1-650-961-0286中 国 - 北 京Tel: 86-10-8528-2100Fax: 86-10-8528-2104中 国 - 成 都Tel: 86-28-8676-6200Fax: 86-28-8676-6599中 国 - 福 州Tel: 86-591-8750-3506Fax: 86-591-8750-3521中 国 - 香 港 特 别 行 政 区Tel: 852-2401-1200Fax: 852-2401-3431中 国 - 上 海Tel: 86-21-5407-5533Fax: 86-21-5407-5066中 国 - 沈 阳Tel: 86-24-2334-2829Fax: 86-24-2334-2393中 国 - 深 圳Tel: 86-755-8203-2660Fax: 86-755-8203-1760中 国 - 顺 德Tel: 86-757-2839-5507Fax: 86-757-2839-5571中 国 - 青 岛Tel: 86-532-502-7355Fax: 86-532-502-7205台 湾 地 区 - 高 雄Tel: 886-7-536-4818Fax: 886-7-536-4803台 湾 地 区 - 台 北Tel: 886-2-2500-6610Fax: 886-2-2508-0102台 湾 地 区 - 新 竹Tel: 886-3-572-9526Fax: 886-3-572-6459澳 大 利 亚 Australia - SydneyTel: 61-2-9868-6733Fax: 61-2-9868-6755印 度 India - BangaloreTel: 91-80-2229-0061Fax: 91-80-2229-0062印 度 India - New DelhiTel: 91-11-5160-8631Fax: 91-11-5160-8632日 本 Japan - KanagawaTel: 81-45-471- 6166Fax: 81-45-471-6122韩 国 Korea - SeoulTel: 82-2-554-7200Fax: 82-2-558-5932 或82-2-558-5934马 来 西 亚 Malaysia - PenangTel:011-604-646-8870Fax:011-604-646-5086菲 律 宾 Philippines - ManilaTel: 011-632-634-9065Fax: 011-632-634-9069新 加 坡 SingaporeTel: 65-6334-8870Fax: 65-6334-8850奥 地 利 Austria - WeisTel: 43-7242-2244-399Fax: 43-7242-2244-393丹 麦 Denmark - BallerupTel: 45-4450-2828Fax: 45-4485-2829法 国 France - MassyTel: 33-1-69-53-63-20Fax: 33-1-69-30-90-79德 国 Germany - IsmaningTel: 49-89-627-144-0Fax: 49-89-627-144-44意 大 利 Italy - MilanTel: 39-0331-742611Fax: 39-0331-466781荷 兰 Netherlands - DrunenTel: 31-416-690399Fax: 31-416-690340英 国 England - BerkshireTel: 44-118-921-5869Fax: 44-118-921-5820加 拿 大 多 伦 多 TorontoMississauga, Ontario,CanadaTel: 1-905-673-0699Fax: 1-905-673-650904/20/05DS51284C_CN 第 190 页© 2005 Microchip Technology Inc.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!