--- 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|试题册索引]]