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 用 户 指 南为 使 编 译 器 填 充 指 向 中 断 函 数 的 中 断 向 量 , 按 照 前 表 命 名 函 数 。 例 如 , 如 果 定 义 了 下列 函 数 , 堆 栈 错 误 向 量 将 自 动 被 填 充 :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 页

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.

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

Saved successfully!

Ooh no, something went wrong!