12.4 8259 可编程中断控制器
8086 只有一根 INTR 引脚,无法单独说明多个设备中究竟谁在请求服务。8259 可编程中断控制器(Programmable Interrupt Controller, PIC)收集八根请求线,执行屏蔽与优先级判断,向 CPU 汇总成一个请求,并在应答期间提供中断类型。
让请求经过 IRR、IMR 与 ISR
三个 8 位寄存器描述控制器的核心状态:
- 中断请求寄存器(Interrupt Request Register, IRR)记录 IRQ0–IRQ7 的待处理请求。
- 中断屏蔽寄存器(Interrupt Mask Register, IMR)标记被阻止的来源;位值 1 表示屏蔽。
- 正在服务寄存器(In-Service Register, ISR)标记已经应答、尚未完成的请求。
在固定优先级方式中,IRQ0 优先级最高,IRQ7 最低。存在符合条件的请求且 CPU 接收 INTR 后,8086 会产生中断应答信号 INTA。8259 把选中的请求从待处理状态移入正在服务状态,并提供其中断类型。服务程序结束时,中断结束(End of Interrupt, EOI)命令清除正在服务状态,让较低优先级工作继续。
屏蔽待处理请求会阻止它被选择,却不一定清除其 IRR 位。忘记发送 EOI 会让请求一直标记为正在服务,并可能阻塞相同或更低优先级的请求;过早发送 EOI 则可能在服务程序尚未保护好共享状态时允许新的服务。
初始化向量映射与级联接线
8259 使用一组初始化命令字(Initialization Command Word, ICW)完成配置:
1. ICW1 开始初始化,并说明基本工作形式。
2. ICW2 提供中断类型基值。
3. 采用级联时,ICW3 描述主片与从片之间的接线。
4. ICW4 选择 8086/8088 处理器方式和其他服务选项。
向量基值必须按八个类型对齐,因为被选中的 IRQ 编号会提供低三位。基值为 20H 时,IRQ0–IRQ7 产生 20H–27H 型中断。每个结果类型仍然通过“类型号乘以四”索引 IVT。
两片级联的 8259 可以提供 15 个设备请求输入:从片增加八路,但主片有一路被级联连接占用。主片的 ICW3 标出哪根 IRQ 线连接了从片;从片的 ICW3 给出自身编号,该编号必须等于所连接的主片 IRQ 号。
配置审查应检查 ICW 顺序、对齐且不重叠的向量范围、级联编号、8086 方式、屏蔽字和服务程序的 EOI 策略。即使接线图正确,错误的 ICW3 仍会把应答送向错误位置。
第 12 章用事件驱动的控制转移取代反复状态查询,并进一步追踪向量、栈帧、服务程序纪律、嵌套优先级和 8259 请求路由。第 13 章将在定时器、数据传送控制器、串行链路和传感器接口中运用这些中断基础。