Appearance
题目
单级中断系统中,中断服务程序内的执行顺序是( )。
I. 保护现场 II. 开中断
III. 关中断 IV. 保存断点
V. 中断事件处理 VI. 恢复现场 VII. 中断返回
错因
B
把"关中断"塞到了 ISR 内部最前面。关中断(III)是中断响应阶段由 CPU 硬件自动完成的——在保存 PC、转入 ISR 入口之前就已经关了,不在 ISR 内。把硬件已经做过的步骤再写进软件流程,明显错位。另外 B 完全漏了"恢复现场"和"开中断"两步,没法保证返回后通用寄存器和中断使能位的正确状态。
C
同样把硬件做的"关中断(III)+ 保存断点(IV)"塞进了 ISR 开头——这两步都属于硬件中断响应("中断隐指令"),不需要 ISR 软件来做。而且 C 漏掉了"开中断(II)",意味着中断返回后 CPU 一直处于关中断状态,再也不响应任何后续中断,系统会卡死——明显不合理。
D
把硬件做的"保存断点(IV)"误写进 ISR——断点(PC)的保存由中断响应硬件自动完成,软件不需要再做。同时漏掉了"开中断(II)"。其余次序看似合理(保护现场 → 处理 → 恢复现场 → 返回),但少了开中断这一步,中断屏蔽位永远不再打开,系统就关闭了中断响应能力。
总解析
第一步:明确"硬件做"和"软件做"的分界
| 阶段 | 谁做 | 步骤 |
|---|---|---|
| 中断响应(中断隐指令) | 硬件(CPU 自动) | III. 关中断 → IV. 保存断点(PC) → 引出中断服务程序入口 |
| 中断服务程序(ISR) | 软件(OS / 中断处理代码) | I. 保护现场 → V. 处理 → VI. 恢复现场 → II. 开中断 → VII. 中断返回 |
题目问的是 "中断服务程序内" 的顺序——所以要排除 III 和 IV(它们由硬件先做完了)。
第二步:ISR 内部 5 步的顺序
I. 保护现场(push 通用寄存器、PSW 等到栈或专用区)
↓
V. 中断事件处理(执行真正的中断逻辑)
↓
VI. 恢复现场(pop 通用寄存器、PSW,恢复 ISR 进入前的状态)
↓
II. 开中断(清中断屏蔽位,准备好响应下一次中断)
↓
VII. 中断返回(IRET 等指令,从栈中弹出 PC,回到被中断的程序)即:I → V → VI → II → VII
第三步:为什么"开中断"放在恢复现场之后、中断返回之前
- 不能放在 ISR 开头:ISR 关键代码段(特别是保护现场、恢复现场)需要独占执行,这期间若来新中断,可能损坏栈和现场——所以 ISR 内的关键操作必须在关中断状态下进行。
- 不能放在中断返回之后(也无法放):中断返回(IRET)会同时恢复 PSW 中的中断使能位(被中断时的状态),但单级中断系统里硬件进入 ISR 时已强制关中断,需要由 ISR 主动开回——所以必须在 IRET 之前完成"开中断",否则就再也不响应中断。
- 单级中断不允许嵌套——开中断这步看似允许嵌套,但因为前面已恢复现场、栈也清空,即便此刻被打断,也不会破坏数据;目的是"准备好响应下一次外部中断",而不是"允许嵌套自己"。
最终答案是 A(I → V → VI → II → VII)。
记忆框架:
| 步骤 | 必须发生在哪一段 | 不能放哪 |
|---|---|---|
| 关中断 III | 硬件中断响应 | ISR 软件层(已经关过了) |
| 保存断点 IV | 硬件中断响应 | ISR 软件层(PC 已自动入栈) |
| 保护现场 I | ISR 起始 | 处理之后(先保护后处理) |
| 中断处理 V | 保护现场之后 | — |
| 恢复现场 VI | 处理之后 | 开中断之后(避免被打断时栈紊乱) |
| 开中断 II | 恢复现场之后、返回之前 | ISR 中段(关键代码段会被打断) |
| 中断返回 VII | ISR 末尾 | — |