232 lines
7.3 KiB
Markdown
232 lines
7.3 KiB
Markdown
---
|
||
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|试题册索引]]
|