MPLAB® C30 C ç¼è¯å¨ç¨æ·æå
MPLAB® C30 C ç¼è¯å¨ç¨æ·æå MPLAB® C30 C ç¼è¯å¨ç¨æ·æå
MPLAB ® C30 用 户 指 南为 使 编 译 器 填 充 指 向 中 断 函 数 的 中 断 向 量 , 按 照 前 表 命 名 函 数 。 例 如 , 如 果 定 义 了 下列 函 数 , 堆 栈 错 误 向 量 将 自 动 被 填 充 :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 C30 在 ISR 中 保 存 它 使 用 的 寄 存 器 , 这 包 括 工 作 寄 存 器 和RCOUNT 特 殊 功 能 寄 存 器 。 而 且 , 如 果 ISR 调 用 一 个 普 通 的 函 数 , 编 译 器 要 保 存所 有 的 工 作 寄 存 器 和 RCOUNT, 即 使 在 ISR 中 没 有 显 式 使 用 这 些 寄 存 器 。 必 须 要保 存 这 些 寄 存 器 , 因 为 一 般 来 说 , 编 译 器 不 知 道 被 调 用 函 数 使 用 了 哪 些 资 源 。dsPIC30F 器 件 支 持 中 断 嵌 套 。 由 于 在 ISR 中 将 处 理 器 资 源 保 存 在 堆 栈 中 , 对 嵌 套 ISR的 编 码 与 非 嵌 套 中 断 的 编 码 相 同 。 通 过 清 零 INTCON1 寄 存 器 中 的 NSTDIS 位 ( 嵌 套中 断 禁 止 位 ) 来 使 能 中 断 嵌 套 。 注 意 这 是 默 认 设 置 , 因 为 dsPIC30F 器 件 在 复 位 时 是使 能 嵌 套 中 断 的 。 在 中 断 优 先 级 控 制 寄 存 器 (IPCn) 中 , 为 每 个 中 断 源 分 配 了 一 个 优先 级 。 如 果 有 一 个 处 于 等 待 状 态 的 中 断 请 求 (IRQ), 其 优 先 级 等 于 或 高 于 处 理 器 状 态寄 存 器 中 的 (ST 寄 存 器 中 的 CPUPRI 字 段 ) 当 前 处 理 器 优 先 级 , 处 理 器 将 响 应 中断 。可 单 独 禁 止 或 使 能 每 个 中 断 源 。 每 个 IRQ 的 都 有 一 个 中 断 使 能 位 位 于 中 断 使 能 控 制 寄存 器 (IECn) 中 。 将 中 断 使 能 位 置 1 将 使 能 相 应 的 中 断 ; 将 中 断 使 能 位 清 零 将 禁 止 相应 的 中 断 。 dsPIC 器 件 复 位 时 , 所 有 中 断 使 能 位 都 被 清 零 。 另 外 , 处 理 器 还 有 一 个 禁止 中 断 指 令 (disable interrupt instruction,DISI), 可 在 指 定 的 指 令 周 期 数 内 禁 止 所 有中 断 。注 : 陷 阱 , 如 地 址 错 误 陷 阱 , 不 能 禁 止 。 只 有 IRQ 是 可 以 被 禁 止 的 。© 2005 Microchip Technology Inc. DS51284C_CN 第 93 页
- Page 47 and 48: 使 用 MPLAB C30 C 编 译 器表
- 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: 中 断表 7-1: 中 断 向 量 (
- Page 101 and 102: 第 8 章 汇 编 语 言 和 C 模
- 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
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.