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

232 lines
7.3 KiB
Markdown
Raw 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
- 中断控制器
- 可编程芯片
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|试题册索引]]