Files

101 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags:
- 接口与通讯技术
- 8259A
- 中断结束
- EOI
- 重点复习
create time: 2026-06-28 15:00
---
# 82C59A 中断结束方式
## 概述
82C59A 的中断结束方式(EOI,End of Interrupt)是中断管理的重要环节。在非自动结束方式下,必须在中断服务程序完成前手动发送 EOI 命令,否则中断级别将被永久屏蔽。本专题聚焦 EOI 命令的发送机制和工作方式的区别。
## 正文
### 1. 三种 EOI 方式对比
| EOI 方式 | 说明 | 是否需要软件发 EOI |
|---------|------|:-----------------:|
| **自动结束方式(AEOI)** | 第二个 INTA 脉冲后自动清除 ISR 中对应位 | ✗ 不需要 |
| **非特定结束方式** | 软件发 EOI 命令,清除 ISR 中**最高优先级**的位 | ✓ 需要 |
| **特定结束方式** | 软件发 EOI 命令并指定中断级别,清除 ISR 中指定位 | ✓ 需要 |
> [!important] 考试关键点
> 当 82C59A 工作于**非自动结束方式**时,需要在中断服务完成后发中断结束命令(EOI)。
>
> 后两种方式(非特定 EOI 和特定 EOI)统称为**非自动结束方式**。
### 2. 为什么需要 EOI?
82C59A 的 **ISR(中断服务寄存器)** 记录当前正在被 CPU 服务的中断源:
```mermaid
sequenceDiagram
participant CPU as "CPU"
participant PIC as "82C59A"
participant ISR as "ISR 寄存器"
CPU->>PIC: "响应中断"
Note over ISR: "ISR[i] = 1<br/>(标记中断正在服务)"
Note over CPU: "执行中断服务程序"
CPU->>PIC: "发送 EOI 命令<br/>(OCW2 = 20H)"
Note over ISR: "ISR[i] = 0<br/>(清除服务标记)"
Note over PIC: "可以响应新的中断"
```
> [!warning] 不发送 EOI 的后果
> 如果忘记发送 EOI 命令:
> 1. ISR 中对应位**不会被清除**
> 2. 82C59A 认为该中断**仍在服务中**
> 3. **同优先级及更低优先级**的中断将永远无法被响应
> 4. 只有更高优先级的中断可以打断(全嵌套模式下)
### 3. EOI 命令的发送
EOI 命令通过 **OCW2** 写入偶地址端口(最小系统 = 20H):
| EOI 类型 | OCW2 值 | 二进制 | 说明 |
|---------|:-------:|--------|------|
| 普通 EOI | **20H** | `0010 0000` | 清除 ISR 中优先级最高的位 |
| 特定 EOI | C0H + 级别 | `11xx x000` | 清除 ISR 中指定位 |
```asm
; 普通 EOI 示例(中断服务程序末尾)
MOV AL, 20H ; 非特定 EOI 命令
OUT 20H, AL ; 发送到 82C59A(偶地址端口)
IRET ; 中断返回
```
### 4. 自动结束 vs 非自动结束
```mermaid
graph TD
A["82C59A 中断结束"] --> B{"ICW4 的 AEOI 位"}
B -- "AEOI=1<br/>自动结束" --> C["第二个 INTA 脉冲后<br/>自动清除 ISR 位<br/>无需软件干预"]
B -- "AEOI=0<br/>非自动结束" --> D["需要软件发送<br/>EOI 命令清除 ISR"]
D --> E["OCW2=20H → 20H端口"]
style C fill:#dfd,stroke:#333,color:#000
style D fill:#fdd,stroke:#333,color:#000
```
> [!question] 思考题
> 自动结束方式既然如此方便,为什么还要用非自动结束方式?
>
> 答:自动结束方式在第二个 INTA 脉冲后**立即**清除 ISR 位,此时中断服务程序尚未执行完毕。如果此时有同级中断到来,可能会造成 ISR 状态混乱。非自动结束方式允许程序员在**服务程序真正完成时**才清除 ISR,更加可控和安全。
### 5. 真题回顾
> [!example] 【真题】当 82C59A 工作于\_\_\_\_\_\_方式时,需要在中断服务完成后发中断结束命令。
>
> **答案**:非自动结束方式
## 关联笔记
- [[8259A中断管理基础]]
- [[82C37A DMA控制器]]
- [[接口与通讯技术/复习文档/8259A中断控制器]]
- [[接口与通讯技术/试题册/index|试题册索引]]