Files
final-exam/接口与通讯技术/复习文档/8259A中断控制器.md
T

232 lines
7.3 KiB
Markdown
Raw Normal View History

2026-06-26 23:22:56 +08:00
---
tags:
- 接口与通讯技术
- 8259A
- 中断控制器
- 可编程芯片
create time: 2026-06-26 23:05
---
# 8259A 中断控制器
## 概述
8259A 是 Intel 公司生产的可编程中断控制器(Programmable Interrupt Controller, PIC),**在全部 4 套试卷中均有出现**。它负责管理和控制 8086 系统中的外部中断请求,支持 8 级优先级中断,可通过级联扩展。本芯片的知识点主要集中在 **初始化命令字(ICW)编写**、**中断响应过程** 和 **优先级管理** 三个方面。
> [!tip] 考试要点
> - **ICW 写入顺序**:ICW1 → ICW2 → ICW3(可选)→ ICW4(可选)
> - **ICW2 与中断类型码**的关系
> - **中断响应时序**:两个 INTA 脉冲期间 8259A 做了什么
> - **全嵌套方式**的优先级规则
## 正文
### 1. 8259A 的核心功能
```mermaid
graph TB
A["IR0~IR7 中断请求输入"] --> B["8259A"]
B -- "INT" --> C["CPU"]
C -- "INTA" --> B
B -- "中断类型码 D0~D7" --> C
B --> D["优先级判别器"]
B --> E["中断屏蔽寄存器 IMR"]
B --> F["中断服务寄存器 ISR"]
B --> G["中断请求寄存器 IRR"]
```
| 寄存器 | 缩写 | 功能 |
|--------|------|------|
| 中断请求寄存器 | **IRR** | 记录哪些 IR 引脚有中断请求(8 位,对应 IR0~IR7) |
| 中断屏蔽寄存器 | **IMR** | 某位=1 则屏蔽对应 IR 的中断请求(通过 OCW1 设置) |
| 中断服务寄存器 | **ISR** | 记录当前正在被服务的中断(用于嵌套管理) |
| 优先级判别器 | **PR** | 从 IRR 中未被 IMR 屏蔽的请求里选出最高优先级 |
> [!question] IRR、IMR、ISR 三者如何协作?
> 1. 外设在 IRi 引脚产生中断请求 → **IRR** 对应位置 1
> 2. **IMR** 检查该位是否被屏蔽(=1 则忽略)
> 3. 未屏蔽的请求送入 **PR** 进行优先级判别
> 4. 若当前无更高优先级中断正在服务(查 **ISR**),则 8259A 向 CPU 发出 INT 信号
### 2. 初始化命令字(ICW)
8259A 有 **4 个初始化命令字**,必须按顺序写入:
```mermaid
graph LR
A["ICW1 写入偶地址"] --> B["ICW2 写入奇地址"]
B --> C{"需要级联?"}
C -- "是" --> D["ICW3 写入奇地址"]
C -- "否" --> E{"需要 ICW4?"}
D --> E
E -- "是" --> F["ICW4 写入奇地址"]
E -- "否" --> G["初始化完成"]
F --> G
```
#### ICW1(偶地址端口,A0=0)
```
D7 D6 D5 D4 D3 D2 D1 D0
[A7 A6 A5] 1 [LTIM] [SNGL] [IC4]
0=边沿 0=级联 0=不需要ICW4
1=电平 1=单片 1=需要ICW4
```
> [!info] ICW1 标志位
> D4 位 **固定为 1**,这是识别 ICW1 的标志。写入时 A0 必须为 0(偶地址端口)。
#### ICW2(奇地址端口,A0=1)
ICW2 提供 **中断类型码的高 5 位**(T7~T3),低 3 位由 8259A 自动填入 IR 编码。
```
中断类型码 = T7 T6 T5 T4 T3 [IR2 IR1 IR0]
↑ 自动填充
```
> [!example] ICW2 计算示例
> **要求**:IR0~IR7 对应中断类型码 80H~87H
>
> 80H = `1000 0000B`,高 5 位 = `10000`
>
> ICW2 = **80H**
>
> 验证:IR0 → 80H, IR1 → 81H, ..., IR7 → 87H ✓
#### ICW3(奇地址端口,仅级联时需要)
- **主片**:某位=1 表示对应 IR 引脚连接了从片
- **从片**:低 3 位表示从片的 INT 输出接到主片的哪个 IR 引脚
#### ICW4(奇地址端口,按需)
```
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 [SFNM] [BUF] [M/S] [uPM]
0=普通 0=非缓冲 0=从片 0=8080/8085
1=特殊全嵌套 1=缓冲 1=主片 1=8086/8088
```
> [!warning] 8086 系统中 ICW4 必须写
> 8086/8088 系统下,ICW4 的 D0=1(uPM=1,表示 8086 模式)是必须的。考试中常见最小初始化序列为:ICW1 → ICW2 → ICW4。
### 3. 操作命令字(OCW)
8259A 有 **3 个操作命令字**,在初始化完成后的工作过程中写入:
| OCW | 端口 | 功能 |
|-----|------|------|
| **OCW1** | 奇地址 (A0=1) | 设置中断屏蔽字(直接写入 IMR) |
| **OCW2** | 偶地址 (A0=0) | 控制中断结束方式和优先级轮换 |
| **OCW3** | 偶地址 (A0=0) | 设置特殊屏蔽、读寄存器命令 |
> [!info] EOI 命令
> OCW2 中的 **EOI(End of Interrupt)** 命令用于在中断服务程序结束时清除 ISR 中对应的位:
> - **普通 EOI**:OCW2 = 20H(非自动 EOI 模式下必须手动发送)
> - **特殊 EOI**:指定要清除的 ISR 位
### 4. 中断响应过程
```mermaid
sequenceDiagram
participant P as "外设"
participant I as "8259A"
participant C as "CPU"
P->>I: "IRi 引脚产生中断请求"
Note over I: "IRR 对应位置 1"
Note over I: "PR 判别优先级"
I->>C: "INT = 1"
C->>I: "第一个 INTA 脉冲"
Note over I: "ISR 对应位置 1, IRR 对应位清 0"
C->>I: "第二个 INTA 脉冲"
I->>C: "送出中断类型码 (D0~D7)"
Note over C: "根据类型码查向量表, 跳转 ISR"
```
> [!warning] 两个 INTA 脉冲的作用不同
> - **第一个 INTA**:8259A 内部操作(置 ISR、清 IRR),CPU 此时还未获取类型码
> - **第二个 INTA**:8259A 将中断类型码送上数据总线,CPU 读取后计算向量表地址
### 5. 中断向量表
8086 的中断向量表位于内存最低地址 **00000H~003FFH**(共 1KB),可存放 256 个中断向量。
$$
中断向量地址 = 中断类型号 \times 4
$$
每个向量占 4 字节:**低 2 字节 = IP,高 2 字节 = CS**。
```mermaid
graph LR
A["类型号 N"] -- "x4" --> B["向量地址 N*4"]
B --> C["IP 低字节"]
B --> D["IP 高字节"]
B --> E["CS 低字节"]
B --> F["CS 高字节"]
```
### 6. 优先级管理方式
| 方式 | 特点 | 适用场景 |
|------|------|----------|
| **全嵌套**(默认) | IR0 最高 → IR7 最低,固定不变 | 大多数应用 |
| **自动轮换** | 服务完的中断降为最低优先级 | 公平服务 |
| **特殊全嵌套** | 允许同级中断嵌套 | 级联系统的主片 |
> [!question] 全嵌套方式下,IRQ5 正在服务,哪些中断可以打断它?
> 答:只有优先级更高的 IRQ0~IRQ4 可以打断。IRQ6 和 IRQ7 必须等待 IRQ5 服务完成后才能获得响应。
### 7. 级联扩展
| 配置 | 中断级数 | 说明 |
|------|:--------:|------|
| 单片 8259A | 8 级 | IR0~IR7 |
| 一主一从级联 | 15 级 | 从片占用主片 1 个 IR 端口(8+8-1=15) |
### 8. 典型初始化程序
```asm
; 8259A 初始化示例
; 端口地址:20H(偶地址,A0=0),21H(奇地址,A0=1)
; 中断类型码:80H~87H
; ICW1:边沿触发,单片,需要 ICW4
MOV AL, 13H
OUT 20H, AL
; ICW2:中断类型码基址 = 80H
MOV AL, 80H
OUT 21H, AL
; ICW4:8086 模式,非自动 EOI
MOV AL, 03H
OUT 21H, AL
; OCW1:设置中断屏蔽字(可选)
MOV AL, 00H ; 允许所有中断
OUT 21H, AL
```
> [!example] 中断服务程序模板
> ```asm
> INT_ISR PROC FAR
> PUSH AX ; 保护现场
> PUSH BX
> ; ... 中断处理逻辑 ...
> MOV AL, 20H ; 普通 EOI 命令
> OUT 20H, AL ; 发送到 8259A
> POP BX ; 恢复现场
> POP AX
> IRET ; 中断返回
> INT_ISR ENDP
> ```
## 关联笔记
- [[8255A可编程并行接口]]
- [[8254定时计数器]]
- [[8251A串行通信接口]]
- [[接口与通讯技术/试题册/index|试题册索引]]