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 用 户 指 南可 通 过 行 内 汇 编 可 在 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 ® C30用 户 指 南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> 用 户 指 南可 通 过 行 内 汇 编 可 在 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.

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

Saved successfully!

Ooh no, something went wrong!