7.3 KiB
tags, create time
| tags | 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 的核心功能
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 三者如何协作?
- 外设在 IRi 引脚产生中断请求 → IRR 对应位置 1
- IMR 检查该位是否被屏蔽(=1 则忽略)
- 未屏蔽的请求送入 PR 进行优先级判别
- 若当前无更高优先级中断正在服务(查 ISR),则 8259A 向 CPU 发出 INT 信号
2. 初始化命令字(ICW)
8259A 有 4 个初始化命令字,必须按顺序写入:
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 对应中断类型码 80H87H80H =
1000 0000B,高 5 位 =10000ICW2 = 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. 中断响应过程
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。
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. 典型初始化程序
; 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] 中断服务程序模板
INT_ISR PROC FAR PUSH AX ; 保护现场 PUSH BX ; ... 中断处理逻辑 ... MOV AL, 20H ; 普通 EOI 命令 OUT 20H, AL ; 发送到 8259A POP BX ; 恢复现场 POP AX IRET ; 中断返回 INT_ISR ENDP