MPLAB® C30 C ç¼è¯å¨ç¨æ·æå
MPLAB® C30 C ç¼è¯å¨ç¨æ·æå MPLAB® C30 C ç¼è¯å¨ç¨æ·æå
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 页
- Page 49 and 50: 使 用 MPLAB C30 C 编 译 器下
- Page 51 and 52: 使 用 MPLAB C30 C 编 译 器表
- Page 53 and 54: 使 用 MPLAB C30 C 编 译 器表
- Page 55 and 56: 使 用 MPLAB C30 C 编 译 器表
- Page 57 and 58: 使 用 MPLAB C30 C 编 译 器3.5.
- Page 59 and 60: 使 用 MPLAB C30 C 编 译 器3.5.
- Page 61 and 62: 使 用 MPLAB C30 C 编 译 器3.6
- Page 63 and 64: 使 用 MPLAB C30 C 编 译 器下
- Page 65 and 66: 第 4 章 MPLAB C30 C 编 译 器
- Page 67 and 68: MPLAB C30 C 编 译 器 运 行 时
- Page 69 and 70: MPLAB C30 C 编 译 器 运 行 时
- Page 71 and 72: MPLAB C30 C 编 译 器 运 行 时
- Page 73 and 74: MPLAB C30 C 编 译 器 运 行 时
- Page 75 and 76: MPLAB C30 C 编 译 器 运 行 时
- Page 77 and 78: MPLAB C30 C 编 译 器 运 行 时
- Page 79 and 80: MPLAB C30 C 编 译 器 运 行 时
- Page 81 and 82: MPLAB C30 C 编 译 器 运 行 时
- Page 83 and 84: MPLAB ® C30用 户 指 南第 5
- Page 85 and 86: MPLAB ® C30用 户 指 南第 6
- Page 87 and 88: 器 件 支 持 文 件6.5 使 用
- Page 89 and 90: 器 件 支 持 文 件6.6 使 用
- Page 91 and 92: 器 件 支 持 文 件6.7.2 使
- Page 93 and 94: MPLAB ® C30用 户 指 南第 7
- Page 95 and 96: 中 断7.3.3 为 中 断 服 务
- Page 97 and 98: 中 断表 7-1: 中 断 向 量 (
- Page 99: 中 断7.6 中 断 响 应 时 间7
- Page 103 and 104: 汇 编 语 言 和 C 模 块 混
- Page 105 and 106: 汇 编 语 言 和 C 模 块 混
- Page 107 and 108: MPLAB ® C30用 户 指 南附 录
- Page 109 and 110: 实 现 定 义 的 操 作A.4 标
- Page 111 and 112: 实 现 定 义 的 操 作下 表
- Page 113 and 114: 实 现 定 义 的 操 作A.14 预
- Page 115 and 116: 实 现 定 义 的 操 作A.16 信
- Page 117 and 118: 实 现 定 义 的 操 作A.23 GET
- Page 119 and 120: 附 录 B MPLAB C30 C 编 译 器
- Page 121 and 122: MPLAB C30 C 编 译 器 诊 断ambi
- Page 123 and 124: MPLAB C30 C 编 译 器 诊 断cast
- Page 125 and 126: MPLAB C30 C 编 译 器 诊 断F‘
- Page 127 and 128: MPLAB C30 C 编 译 器 诊 断init
- Page 129 and 130: MPLAB C30 C 编 译 器 诊 断inva
- Page 131 and 132: MPLAB C30 C 编 译 器 诊 断Nneg
- Page 133 and 134: MPLAB C30 C 编 译 器 诊 断Rred
- Page 135 and 136: MPLAB C30 C 编 译 器 诊 断symb
- Page 137 and 138: MPLAB C30 C 编 译 器 诊 断void
- Page 139 and 140: MPLAB C30 C 编 译 器 诊 断anon
- Page 141 and 142: MPLAB C30 C 编 译 器 诊 断comp
- Page 143 and 144: MPLAB C30 C 编 译 器 诊 断dupl
- Page 145 and 146: MPLAB C30 C 编 译 器 诊 断func
- Page 147 and 148: MPLAB C30 C 编 译 器 诊 断‘i
- Page 149 and 150: MPLAB C30 C 编 译 器 诊 断libr
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.