01.12.2014 Views

RealView Compilation Tools Developer Guide - ARM Information ...

RealView Compilation Tools Developer Guide - ARM Information ...

RealView Compilation Tools Developer Guide - ARM Information ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

处 理 处 理 器 异 常<br />

BLEQ<br />

MOV<br />

STR<br />

ADD<br />

LDMFD<br />

SUBS<br />

ENDP<br />

C_int_handler<br />

r0,#0<br />

r0,[r4,#4]<br />

sp,sp,#4<br />

sp!,{r0-r4,r12,lr}<br />

pc,lr,#4<br />

将 其 与 没 有 使 用 __irq 关 键 字 时 的 结 果 比 较 :<br />

IRQHandler PROC<br />

STMFD<br />

MOV<br />

LDR<br />

CMP<br />

BLEQ<br />

MOV<br />

STR<br />

LDMFD<br />

ENDP<br />

sp!,{r4,lr}<br />

r4,#0x80000000<br />

r0,[r4,#0]<br />

r0,#1<br />

C_int_handler<br />

r0,#0<br />

r0,[r4,#4]<br />

sp!,{r4,pc}<br />

6.7.2 可 重 入 中 断 处 理 程 序<br />

如 果 中 断 处 理 程 序 再 次 激 活 了 中 断 , 然 后 调 用 一 个 子 例 程 , 并 且 产 生 了 另 个 一 中<br />

断 , 则 在 第 二 个 IRQ 被 占 用 时 , 子 例 程 的 返 回 地 址 ( 存 储 在 lr_IRQ 中 ) 将 被 破<br />

坏 。 在 C 语 言 中 使 用 __irq 关 键 字 不 会 造 成 重 入 中 断 处 理 程 序 所 要 求 的 对 SPSR<br />

进 行 存 储 和 恢 复 , 因 而 要 使 用 汇 编 语 言 编 写 高 层 中 断 处 理 程 序 。<br />

在 跳 转 到 嵌 套 子 例 程 或 C 函 数 前 , 重 入 中 断 处 理 程 序 须 保 存 IRQ 状 态 、 切 换 处<br />

理 器 模 式 并 为 新 的 处 理 器 模 式 保 存 该 状 态 。<br />

<strong>ARM</strong> 版 本 4 或 以 后 版 本 可 切 换 至 系 统 模 式 。 系 统 模 式 使 用 了 用 户 模 式 寄 存 器 ,<br />

并 启 用 您 的 异 常 处 理 程 序 所 要 求 的 特 权 存 取 方 式 。 有 关 详 细 信 息 请 参 阅 第 6-43<br />

页 的 系 统 模 式 。 相 反 , 在 早 于 v4 版 本 的 <strong>ARM</strong> 体 系 结 构 中 , 必 须 切 换 到 超 级 用<br />

户 模 式 。<br />

备 注<br />

该 方 法 适 用 于 IRQ 和 FIQ 中 断 。 但 是 , 因 FIQ 中 断 要 求 尽 快 得 到 服 务 , 通 常 仅<br />

有 一 个 中 断 源 , 所 以 , 可 能 不 必 为 其 提 供 重 入 特 性 。<br />

IRQ 处 理 程 序 安 全 地 激 活 中 断 所 需 的 步 骤 是 :<br />

1. 构 造 返 回 地 址 并 保 存 在 IRQ 堆 中 。<br />

2. 保 存 工 作 寄 存 器 和 spsr_IRQ。<br />

<strong>ARM</strong> DUI 0203BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 6-29

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

Saved successfully!

Ooh no, something went wrong!