MPLAB® C30 C 编译器用户指南

MPLAB® C30 C 编译器用户指南 MPLAB® C30 C 编译器用户指南

ie.ksu.edu.tw
from ie.ksu.edu.tw More from this publisher
10.07.2015 Views

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

MPLAB C30 与 ANSI C 的 差 别一 个 函 数 若 可 能 改 变 一 个 全 局 寄 存 器 变 量 的 值 , 它 就 不 能 安 全 地 被 不 保 存 和 恢 复 该 变量 编 译 的 函 数 调 用 , 因 为 这 可 能 破 坏 调 用 函 数 返 回 时 期 望 找 到 的 值 。 因 此 , 若 一 个 程序 片 段 使 用 了 全 局 寄 存 器 变 量 , 作 为 该 程 序 片 段 入 口 的 函 数 必 须 显 式 地 保 存 和 恢 复 属于 其 调 用 函 数 的 值 。库 函 数 longjmp 将 恢 复 每 个 全 局 寄 存 器 变 量 在 setjmp 时 的 值 。所 有 全 局 寄 存 器 变 量 的 声 明 必 须 在 所 有 函 数 定 义 之 前 。 如 果 这 种 声 明 在 函 数 定 义 之 后 ,寄 存 器 可 能 被 声 明 之 前 的 函 数 用 于 其 他 用 途 。全 局 寄 存 器 变 量 不 能 有 初 值 , 因 为 可 执 行 文 件 不 能 为 一 个 寄 存 器 提 供 初 值 。2.3.4.2 为 局 部 变 量 指 定 寄 存 器可 以 通 过 以 下 语 句 用 一 个 指 定 的 寄 存 器 定 义 局 部 寄 存 器 变 量 :register int *foo asm ("w8");其 中 , w8 是 使 用 的 寄 存 器 名 。 应 该 注 意 这 与 定 义 全 局 寄 存 器 变 量 的 语 法 相 同 , 但 是 对于 局 部 变 量 , 这 种 定 义 应 该 出 现 在 一 个 函 数 中 。定 义 这 种 寄 存 器 不 保 留 寄 存 器 的 值 , 流 控 制 确 定 变 量 的 值 无 效 时 , 其 他 用 途 仍 可 使 用这 种 寄 存 器 。 使 用 这 一 功 能 , 可 能 使 编 译 某 些 函 数 时 可 用 寄 存 器 太 少 。该 选 项 并 不 能 保 证 MPLAB C30 生 成 的 代 码 始 终 将 这 一 变 量 存 放 在 指 定 的 寄 存 器 中 。不 可 以 在 asm 语 句 中 , 编 写 对 该 寄 存 器 的 显 式 引 用 , 并 假 定 它 总 是 引 用 这 个 变 量 。局 部 寄 存 器 变 量 不 使 用 时 其 分 配 可 被 删 除 。 对 局 部 寄 存 器 变 量 的 引 用 可 以 被 删 除 、 移动 或 简 化 。2.3.5 复 数MPLAB C30 支 持 复 数 数 据 类 型 。 我 们 可 以 用 关 键 字 __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> 用 户 指 南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.

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

Saved successfully!

Ooh no, something went wrong!