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 用 户 指 南7.3 编 写 中 断 服 务 程 序可 以 根 据 本 节 提 供 的 要 领 , 仅 使 用 C 语 言 语 法 结 构 编 写 所 有 应 用 代 码 , 其 中 包 括 中 断服 务 程 序 (ISR)。7.3.1 编 写 中 断 服 务 程 序 的 要 领编 写 ISR 的 要 领 为 :• 不 带 参 数 并 以 void 返 回 值 类 型 声 明 ISR ( 强 制 )• 不 要 通 过 一 般 程 序 调 用 ISR ( 强 制 )• 不 要 用 ISR 调 用 其 他 函 数 ( 建 议 )MPLAB C30 的 ISR 和 任 何 其 他 C 函 数 一 样 , 可 以 有 局 部 变 量 , 可 以 访 问 全 局 变 量 。但 是 , ISR 需 要 声 明 为 没 有 参 数 , 没 有 返 回 值 。 这 是 必 须 的 , 因 为 ISR 作 为 对 硬 件 中断 或 陷 阱 的 响 应 , 对 它 的 调 用 与 一 般 C 程 序 异 步 ( 即 ISR 不 是 按 通 常 的 方 式 调 用 的 ,因 此 不 能 有 参 数 和 返 回 值 )。ISR 只 能 通 过 硬 件 中 断 或 陷 阱 调 用 , 不 能 通 过 其 他 C 函 数 调 用 。 ISR 使 用 中 断 返 回(RETFIE) 指 令 退 出 函 数 , 而 不 是 使 用 一 般 的 RETURN 指 令 。 不 恢 复 现 场 使 用RETFIE 指 令 退 出 中 断 服 务 程 序 会 破 坏 处 理 器 资 源 , 如 status 寄 存 器 的 值 。最 后 , 由 于 中 断 响 应 时 间 的 原 因 , 建 议 不 要 使 用 ISR 调 用 其 他 函 数 。 更 多 信 息 请 参 阅第 7.6 节 “ 中 断 响 应 时 间 ”。7.3.2 编 写 中 断 服 务 程 序 的 语 法为 将 C 函 数 声 明 为 中 断 服 务 程 序 , 指 定 函 数 的 interrupt 属 性 ( 参 见 § 2.3 中 关 于__attribute__ 关 键 字 的 描 述 )。 interrupt 属 性 的 语 法 如 下 :__attribute__((interrupt [([ save(symbol-list)][, irq(irqid)][, altirq(altirqid)][, preprologue(asm)])]))可 以 在 interrupt 属 性 名 和 参 数 名 的 前 后 加 下 划 线 字 符 。 因 此 , interrupt 和__interrupt__ 是 等 价 的 , save 和 __save__ 也 是 等 价 的 。可 选 的 save 参 数 指 定 进 入 和 退 出 ISR 时 需 要 保 护 和 恢 复 的 一 个 或 多 个 变 量 。 变 量 名列 表 包 含 在 括 号 内 , 变 量 名 中 间 用 逗 号 分 隔 开 。如 果 不 想 导 出 全 局 变 量 的 值 , 应 该 保 护 可 能 在 ISR 中 修 改 的 全 局 变 量 。 被 ISR 修 改 的全 局 变 量 应 该 用 volatile 限 定 。可 选 的 irq 参 数 允 许 将 一 个 中 断 向 量 对 应 于 一 个 特 定 的 中 断 , 可 选 的 altirq 参 数 允许 将 一 个 中 断 向 量 对 应 于 一 个 指 定 的 备 用 中 断 。 每 个 参 数 都 需 要 一 个 括 号 括 起 来 的 中断 ID 号 。( 参 阅 第 7.4 节 “ 写 中 断 向 量 ” 中 的 中 断 ID 列 表 。)可 选 的 preprologue 参 数 允 许 在 生 成 的 代 码 中 , 编 译 器 生 成 的 函 数 prologue 前 插 入汇 编 语 句 。DS51284C_CN 第 88 页© 2005 Microchip Technology Inc.

中 断7.3.3 为 中 断 服 务 程 序 编 写 代 码下 面 的 原 型 声 明 了 函 数 isr0 为 中 断 服 务 程 序 :void __attribute__((__interrupt__)) isr0(void);由 原 型 可 以 看 出 , 中 断 函 数 必 须 不 带 参 数 , 没 有 返 回 值 。 如 果 需 要 的 话 , 编 译 器 将 保护 所 有 工 作 寄 存 器 , 以 及 status 寄 存 器 和 重 复 计 数 寄 存 器 。 将 其 他 变 量 指 定 为interrupt 属 性 的 参 数 , 可 以 保 护 这 些 变 量 。 例 如 , 要 使 编 译 器 自 动 保 护 和 恢 复 变 量var1 和 var2, 使 用 下 面 的 原 型 :void __attribute__((__interrupt__(__save__(var1,var2)))) isr0(void);为 请 求 编 译 器 使 用 快 速 现 场 保 护 ( 使 用 push.s 和 pop.s 指 令 ), 指 定 函 数 的shadow 属 性 ( 参 阅 第 2.3.2 节 “ 指 定 函 数 的 属 性 ”)。 例 如 :void __attribute__((__interrupt__, __shadow__)) isr0(void);7.3.4 使 用 宏 声 明 简 单 的 中 断 服 务 程 序如 果 一 个 中 断 服 务 程 序 不 需 要 interrupt 属 性 的 任 何 可 选 参 数 , 则 可 使 用 简 单 的 语 法 。在 针 对 器 件 的 头 文 件 中 定 义 了 下 面 的 宏 :#define _ISR __attribute__((interrupt))#define _ISRFAST __attribute__((interrupt, shadow))例 如 , 声 明 timer0 中 断 的 中 断 服 务 程 序 :#include void _ISR _INT0Interrupt(void);用 快 速 现 场 保 护 声 明 SPI1 中 断 的 中 断 服 务 程 序 :#include void _ISRFAST _SPI1Interrupt(void);© 2005 Microchip Technology Inc. DS51284C_CN 第 89 页

MPLAB ® <strong>C30</strong> 用 户 指 南7.3 编 写 中 断 服 务 程 序可 以 根 据 本 节 提 供 的 要 领 , 仅 使 用 C 语 言 语 法 结 构 编 写 所 有 应 用 代 码 , 其 中 包 括 中 断服 务 程 序 (ISR)。7.3.1 编 写 中 断 服 务 程 序 的 要 领编 写 ISR 的 要 领 为 :• 不 带 参 数 并 以 void 返 回 值 类 型 声 明 ISR ( 强 制 )• 不 要 通 过 一 般 程 序 调 用 ISR ( 强 制 )• 不 要 用 ISR 调 用 其 他 函 数 ( 建 议 )MPLAB <strong>C30</strong> 的 ISR 和 任 何 其 他 C 函 数 一 样 , 可 以 有 局 部 变 量 , 可 以 访 问 全 局 变 量 。但 是 , ISR 需 要 声 明 为 没 有 参 数 , 没 有 返 回 值 。 这 是 必 须 的 , 因 为 ISR 作 为 对 硬 件 中断 或 陷 阱 的 响 应 , 对 它 的 调 用 与 一 般 C 程 序 异 步 ( 即 ISR 不 是 按 通 常 的 方 式 调 用 的 ,因 此 不 能 有 参 数 和 返 回 值 )。ISR 只 能 通 过 硬 件 中 断 或 陷 阱 调 用 , 不 能 通 过 其 他 C 函 数 调 用 。 ISR 使 用 中 断 返 回(RETFIE) 指 令 退 出 函 数 , 而 不 是 使 用 一 般 的 RETURN 指 令 。 不 恢 复 现 场 使 用RETFIE 指 令 退 出 中 断 服 务 程 序 会 破 坏 处 理 器 资 源 , 如 status 寄 存 器 的 值 。最 后 , 由 于 中 断 响 应 时 间 的 原 因 , 建 议 不 要 使 用 ISR 调 用 其 他 函 数 。 更 多 信 息 请 参 阅第 7.6 节 “ 中 断 响 应 时 间 ”。7.3.2 编 写 中 断 服 务 程 序 的 语 法为 将 C 函 数 声 明 为 中 断 服 务 程 序 , 指 定 函 数 的 interrupt 属 性 ( 参 见 § 2.3 中 关 于__attribute__ 关 键 字 的 描 述 )。 interrupt 属 性 的 语 法 如 下 :__attribute__((interrupt [([ save(symbol-list)][, irq(irqid)][, altirq(altirqid)][, preprologue(asm)])]))可 以 在 interrupt 属 性 名 和 参 数 名 的 前 后 加 下 划 线 字 符 。 因 此 , interrupt 和__interrupt__ 是 等 价 的 , save 和 __save__ 也 是 等 价 的 。可 选 的 save 参 数 指 定 进 入 和 退 出 ISR 时 需 要 保 护 和 恢 复 的 一 个 或 多 个 变 量 。 变 量 名列 表 包 含 在 括 号 内 , 变 量 名 中 间 用 逗 号 分 隔 开 。如 果 不 想 导 出 全 局 变 量 的 值 , 应 该 保 护 可 能 在 ISR 中 修 改 的 全 局 变 量 。 被 ISR 修 改 的全 局 变 量 应 该 用 volatile 限 定 。可 选 的 irq 参 数 允 许 将 一 个 中 断 向 量 对 应 于 一 个 特 定 的 中 断 , 可 选 的 altirq 参 数 允许 将 一 个 中 断 向 量 对 应 于 一 个 指 定 的 备 用 中 断 。 每 个 参 数 都 需 要 一 个 括 号 括 起 来 的 中断 ID 号 。( 参 阅 第 7.4 节 “ 写 中 断 向 量 ” 中 的 中 断 ID 列 表 。)可 选 的 preprologue 参 数 允 许 在 生 成 的 代 码 中 , 编 译 器 生 成 的 函 数 prologue 前 插 入汇 编 语 句 。DS51284C_CN 第 88 页© 2005 Microchip Technology Inc.

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

Saved successfully!

Ooh no, something went wrong!