输入输出和中断技术
Goal :
- 了解 输入输出(IO)系统, IO接口 和 IO端口 的概念.
- 了解 IO端口 的编址方式
- 深入理解基本IO方法 及 中断控制技术
- 掌握 简单接口芯片的应用
6.1 输入输出系统概述
6.1.1 IO系统的特点
- 复杂性
- 异步性
- 实时性
- 与设备无关性
6.1.2 IO接口的基本功能
1 - IO接口要解决的问题(和怎么解决)
- 速度匹配问题(使用缓冲)
- 信号电平和驱动能力问题
- 信号形式匹配问题 和 信息格式问题(A/D, D/A, 串/并行通信)
- 时序匹配问题(BUSY, READY等控制信号)
- 总线冲突(三态门)
2 - IO接口的功能
- IO地址译码 与 设备选择
- 信息的输入输出
- 命令, 数据和状态的缓冲与锁存
- 信息转换
6.1.3 IO端口的编址方式
CPU 与 IO接口进行通信实际上是通过IO接口内部的一组寄存器 -> IO端口(IO Port)
IO端口(IO Port) 包括 :
- 数据端口 - data IO
- 状态端口 - state IO
- 命令(或控制)端口 - control IO
8088/8086 CPU 最多能够管理 64K 个 端口( A 0 ˜ A 15 A_0 \~~ A_{15} A0 ˜A15) -> 要为外设分配IO地址.
因为一个外设总是对应着一个或者多个端口, 为了管理方便, 通常为其分配一个连续的地址块 -> 该地址块中最小的那个地址称为外设的基地址(Base Address)
在微机系统中, IO端口的编址 由两种方式 :
- 与内存单元统一编址 - Unified Addressing
- 独立编址 - Independent Addressing
1 - IO 端口与内存单元统一编址 - Unified Addressing
又称 存储器映射编址方式, 即把每个IO端口都当做一个存储单元 看待, 端口与存储器单元在同一个地址空间中进行编址.
通常是在地址空间中划分出一小块连续的地址分配给IO端口. 统一编址如图所示:
优点 - merits :
- 可以用访问内存的方法来访问IO端口, 操作内存的指令可以兼容IO的访问, 不再需要专门的IO指令 -> flexibility.
- IO 的控制信号 可以与 存储器的控制信号共用.
缺点 - drawbacks : 占用了一定的内存地址空间
2 - IO端口独立编址 - Independent Addressing
内存地址空间 与 外设地址空间 相互独立编址.
比如, 8086系统中就采用了IO端口独立编址, 8086系统中内存地址范围为00000H~FFFFFH
, 外设端口的地址范围为0000F~FFFFH
, 两个地址空间相互独立, 互不影响.
CPU在寻址内存和外设时, 使用不同的控制信号来区分当前是对内存操作还是对IO端口操作.
特点如下 :
- IO端口的地址空间与内存地址空间完全独立.
- IO端口与内存使用不同的控制信号.
- 指令系统中设置了专门用于访问外设的IO指令.
6.1.4 IO端口地址的译码(decoding)
在执行IO指令时, CPU首先需要将要访问端口的地址放到地址总线AB上.
-
8088 CPU 可寻址的内存空间为
1MB
, 8088 CPU可寻址的IO端口仅为64K
只使用地址总线AB的低16位信号线 -
当CPU工作在最大模式时, 控制 对存储器的读写 -> M E M R ‾ 或 M E M W ‾ \overline{MEMR}或\overline{MEMW} MEMR或MEMW 有效; 控制 对IO端口读写 -> I O R ‾ 或 I O W ‾ \overline{IOR}或\overline{IOW} IOR或IOW
-
I O / M ‾ IO/\overline{M} IO/M 决定 AB 上走的是内存寻址还是IO寻址.
8086CPU与内存和IO端口的交互图如图所示:
6.2 简单接口电路
这节主要对 接口电路的分类与特性 和两个简单芯片的应用做原理上的了解和探讨.
6.2.1 接口电路的基本构成
CPU通过接口与外设连接的示意图:
在输入数据时, 一般情况下, 外设处理数据的时间 > CPU -> 数据在外部总线上保持的时间较长 -> 要求IO接口必须具有对数据的控制能力(三态门) -> 当外部数据准备好, CPU可以读走时才将数据送入DB
输出数据时同理, 要求输出接口必须具有数据的锁存能力.
6.2.2 三态门(three-state gate)接口 - 74LS244为例
两个控制端: E 1 ‾ , E 2 ‾ \overline{E_1}, \overline{E_2} E1,E2 每个控制端各控制4个三态门. 当某一控制端有效, 相应的4个三态门导通, 反之断开.
三态门具有通断信号的控制能力 -> 用其作输入(output)接口
如图给出一个典型的应用电路:
6.2.3 锁存器接口 - 以74LS273为例
74LS273 内部包含了8个D触发器.
其引线和真值表如图所示:
8个数据输入端 D 0 ˜ D 7 D_0 \~~ D_7 D0 ˜D7 和 8个数据输出端 Q 0 ˜ Q 7 Q_0 \~~ Q_7 Q0 ˜Q7.
采用具有信息存储能力的双稳态触发器来实现 -> 用其作输出(output)接口.
一个典型的应用电路如图所示:
8个Q端 与 8个发光二极管相连接, 使得节到 Q 0 , Q 7 Q_0, Q_7 Q0,Q7 端的 发光二极管 发光的程序 :
MOV DX, 0FFFFH
MOV AL, 01000001B
OUT DX, AL
6.3 基本输入输出方式
主要的 基本输入输出方式 有以下四种 : 无条件传送, 查询, 中断 和 直接存储器存取(DMA)方式.
6.3.1 无条件传送
用于外部控制过程的各种动作 是固定的而且是已知的, 控制的对象是一些简单的, 随时"准备好"的外设.
当 CPU 从外设读入数据/写数据到外设 时, CPU 执行 IN / OUT 指令, 将低16位地址信号组成的端口地址送上AB
, 经地址译码选中对应的端口, 然后在
I
O
R
‾
=
0
,
或
I
O
R
‾
=
0
\overline{IOR} = 0, 或~ \overline{IOR} = 0
IOR=0,或 IOR=0 期间将 数据读入CPU / 写入外设.
6.3.2 查询方式
实际应用中, CPU 在数据传送前必须先查询外设的状态. -> 利用程序不断地询问外部设备地状态, 根据它们所处的状态来实现数据的输入和输出的方式就称为程序查询方式.
对单一外设采用查询方式进行数据传送的工作过程可用流程图描述如下:
6.3.3 中断方式
无条件数据传送 和 查询数据传送方式 都是在满足一定条件下采用的.
无条件传送适用于慢速外设 -> 软, 硬件简单, 但使用范围窄, 且CPU与外设不同步时易出错.
查询方式多用于慢速和中速外设 -> 将大量时间耗费在都外设状态及进行检测上, 降低了 CPU 的工作效率.
引入 中断 - CPU并不主动介入外设的数据传输工作, 由外设在需要时向 CPU 发送中断请求, CPU在节到请求后若条件允许, 则暂停(or 中断) 正在进行的工作而转去对该外设服务, 并在服务结束后回到原来被中断的地方继续.
6.3.4 直接存储器存取方式 DMA
以上 3种 方式被统称为 程序控制输入输出方式(Programmable Input and Output, PIO)
对需要告诉数据传送的场合, 我们引入**直接存储器存取(Direct Memory Access, DMA)**方式, 以实现 通过特殊的硬件电路 控制外设与存储器直接进行数据传送
1 - DMA控制器的功能
- 收到接口发出的DMA请求, DMA控制器向CPU发出总线请求信号 H O L D HOLD HOLD, 请求 CPU 放弃总线的控制.
- CPU响应请求(发出响应信号HLDA)后, DMA控制器接管总线的控制权.
- 能向地址总线发出内存地址信息, 找到相应单元并能够自动修改其地址计数器
- 能向存储器或外设发出读写命令
- 能决定传送的字节数,并判断DMA传送是否结束
- DMA过程结束后, 能向CPU发出DMA结束信号, 交还总线控制权.
2 - DMA 控制器的工作过程
- 当外设准备好, 可以进行DMA传送时, 外设向DMA控制器发出DMA传送请求信号(DRQ).
- DMA控制器收到请求后, 向CPU发出"总线请求"信号HOLD, 表示希望占用总线.
- CPU在完成当前总线周期后立即对HOLD信号进行响应. 响应包括两个方面 :
- CPU将数据总线、地址总线和相应的控制信号线均置为高阻态,由此放弃对总线的控制权;
- CPU 向 DMA 控制器发出"总线响应"信号( H L D A HLDA HLDA)
- DMA控制器收到HLDA信号后就开始控制总线,并向外设发出DMA响应信号 DACK.
- DMA控制器送出地址信号和相应的控制信号, 实现直接数据传送.
- 例如, 在地址总线上发出存储器的地址, 向存储器发出写信号 M E M W ‾ \overline{MEMW} MEMW,同时向外设发出I/O地址, I O R ‾ \overline{IOR} IOR和AEN信号, 即可从外设向内存传送一个字节.
- DMA控制器自动修改地址和字节计数器,并据此判断是否需要重复传送操作. 规定的数据传送完后, DMA控制器撤销发往CPU的 H O L D HOLD HOLD信号. CPU检测到 H O L D HOLD HOLD失效后, 撤销 H L D A HLDA HLDA信号, 并在下一时钟周期重新开始控制总线, 继续执行原来的程序.
DMA 存储器写的总线周期时序:
注意两点:
- DMA传送前, CPU必须告诉DMA控制器传送是在哪两
个部件之间进行的, 传送的内存首地址以及传送的字节数是多少. - 在DMA传送时DMA控制器只负责送出地址及控制信号,而数据传送是直接在接口和内存间进行的,并不经过DMA控制器.
对于内存与内存间的 DMA 传送, 是先用一个DMA的存储器读周期将数据由内存读出, 放在DMA控制器的内部数据暂存器中, 再利用一个DMA的存储器写周期将该数据写到内存的另一区域.
DMA 存储器写操作的简要原理图:
6.4 中断技术
6.4.1 中断的基本概念
在微机中, 当 CPU 执行程序过程时, 由于随机的事件引起CPU暂时停止正在执行的程序, 而转而去执行一个用于处理该事件的程序 -> 中断服务程序
引起中断的事件称为 中断源/interrupt source :
-
内部中断源 : 来自 CPU 内部, 中断的控制完全由 CPU 内部实现.
- CPU执行指令时产生的异常, 如 被0除, 溢出, 断电, 但不操作…
- 特殊操作引起的异常, 如存储器越界, 缺页…
- 由程序员安排在程序中的
INT n
软件中断指令
-
外部中断源 : 来自 CPU 外部, 利用 中断输入线 I N T R , N M I INTR, NMI INTR,NMI 控制中断
- IO设备, 如键盘, 打印机, 鼠标…
- 数据通道, 如磁盘, 数据采集装置, 网络…
- 实时钟, 如定时器时间到…
- 故障源, 如掉电, 硬件错, 存储器奇偶校验…
-
I N T R INTR INTR - 可屏蔽中断输入信号 : 受到中断允许标志寄存器IF的控制, 当
IF=1
CPU在一条指令执行完后对中断作出响应; 当IF=0
, CPU不予响应, 中断请求被屏蔽. -
N M I NMI NMI - 非屏蔽中断请求输入信号, 上升沿有效, 无法被屏蔽.
6.4.2 中断处理的一般过程
中断处理过程流程图:
-
中断请求
-
中断源识别(中断判优)
-
软件判优 - 电路中, 外设的中断请求信号
IRQ
, 被锁存在中断请求寄存器中
若某一中断源发出中断请求, 中断请求信号
-
硬件判优
指利用专用的硬件电路或中断控制器来判别那个中断请求的优先级最高.
- 中断控制器判优 : 根据中断向量码(中断类型码)来确定中断源. 中断向量码时为每一个中断源分配的一个编号, 通过该编号可方便地找到与中断源相对应的中断服务程序的入口.
- 链式判优 : 将所有的中断源构成一个链(菊花链). 排在连前面的中断源的优先级别高于排在后面的, 高优先级别的中断会自动封锁低优先级别的中断.
链式优先权排队电路如图所示:
-
中断嵌套问题
类似子程序嵌套, 高优先级的中断可以中断低优先级的中断
-
-
中断响应
中断优先级确定后, CPU在满足以下条件后 会 对中断请求进行相响应:
- 一条指令执行结束.
- CPU处于开中断状态.
- 当前没有发生符文u, 保持, 内部终端和非屏蔽中断请求.
- 若当前执行的指令是开中断指令和中断返回指令, 会再执行一条指令.
中断响应时, CPU要求进行以下4中工作:
- 保护硬件现场, 即FLAGS(PSW).
- 保护断点. 将断点的段基地址(CS)和偏移地址(IP)压入堆栈, 一把凭证中断结束后能正常返回被中断的程序.
- 获得中断服务程序入口
-
中断处理
中断处理由中断服务子程序完成.
- 保护软件现场 - 涉及寄存器的原内容压栈保存
- 开中断(
STI
指令) - 实现中断嵌套的允许 - 执行中断处理程序
- 关中断
- 恢复现场 - 出栈
-
中断返回 - IRET指令
6.4.3 8086/8088中断系统
1 - 内部中断
CPU 执行了某条指令或软件对标志寄存器中某个标志位进行设置而产生的 -> 软件中断
-
除法出错中断 - 0型中断 :
-
单步中断 - 1型中断 :
由8086 CPU 中标志寄存器中的陷阱标志 TF 控制产生.
CPU每执行完一次指令, 都会检查
TF
的状态. 若发现TF = 1
-> CPU 产生 中断类型码为1 的中断, 使 CPU 转向单步中断的处理程序.所有类型的中断在其处理过程中, CPU都会自动的把状态标志
FLAGS
压栈, 然后清除TF
-> 当CPU进入单步中断处理程序时就不再处于单步状态而是正常工作 -> 只有当单步处理结束后, 从堆栈中弹出原来的标志, 才使得 CPU 又回到单步方式8088指令系统提供
POPF / PUSHF
指令以置位/复位TF
, 具体操作如下: -
断点中断 - 3型中断
专门用来设置断点的指令 : INT 3 - (0CCH)
-
溢出中断 - 4型中断
发生
OF=1
-> 执行INTO指令后立即产生一个中断类型码为4的中断 -
用户自定义的软件中断 - n 型中断
2 - 外部中断
-
非屏蔽中断 -
NMI
不受中断允许标志位
IF
控制, 中断类型码固定为 2(INT 2
) -
可屏蔽中断 -
INTR
只有当
IF = 1
才会响应中断, PC中 外部设备的中断请求是通过中断控制器8259A来进行 统一管理的.
3 - 中断向量表
8088/8086 最多允许处理256种类型的中断(中断类型码0~255), CPU响应中断时, 通过得到的中断类型码来判断是哪个中断源提出了中断.
8088规定虽有终端服务的子程序的首地址都必须放在 中断向量表 中,
-
中断向量表地址位于内存中
00000H~003FFH(1KB)
, -
中断向量表共256个表项, 每个中断向量占4个字节, 其中低位字(2bytes)存放终端服务子程序入口地址的偏移量OFFSET, 高位字存放中断服务子程序入口地址的段基址
只要知道中断类型码 n
, 就可以计算出对应的中断向量
中断向量在表中的存放地址 = n × 4 中断向量在表中的存放地址 = n \times 4 中断向量在表中的存放地址=n×4
计算出中断向量地址后 -> 取 4n 和 4n+1 单元的内容装入 IP, 取 4n+2 和 4n+3 单元的内容装入CS -> 转入中断服务子程序.
4 - 中断响应过程
中断类型可分为以下三种:
中断类型 { 内部中断 i n t e r n a l i n t e r r u p t 可屏蔽中断 m a s k a b l e i n t e r r u p t 非可屏蔽中断 n o n m a s k a b l e i n t e r r u p t 中断类型\begin{cases} 内部中断~internal~interrupt \\ 可屏蔽中断~maskable~interrupt \\ 非可屏蔽中断~nonmaskable~interrupt \\ \end{cases} 中断类型⎩ ⎨ ⎧内部中断 internal interrupt可屏蔽中断 maskable interrupt非可屏蔽中断 nonmaskable interrupt
中断响应和中断处理流程:
内部中断响应过程
- 计算中断向量的地址 : 类型码n X 4.
- 硬件现场保护 : FLAGS 压栈
- 清除
IF
和TF
: 屏蔽新的INTR
中断和单步中断 - 保存断点 : 将断点处的
IP 和 CS
值压入堆栈, 先压入CS
, 再压入IP
- 从中断向量表中取出中断服务子程序的入口地址 : [n+2][n+3] = 段:偏移
- 转入中断服务子程序执行
内部中断具有如下一些特点:
- 中断由 CPU 内部引起, 中断类型码的获得与外界无关 -> CPU不需要额外的执行中断响应周期取获得中断类型码.
外部中断响应过程
-
非屏蔽中断响应 -
NMI
NMI
中断不受IF
影响, CPU自动按照中断类型码2(INT 2
)计算中断向量的地址, 剩下的同内部中断响应过程. -
可屏蔽中断响应 -
INTR
INTR
有效时, CPU再执行完当前指令后, 产生两个连续的中断响应总线周期.- 第一个总线周期 :
AB/DB
置高阻态, 发出一个中断响应信号'INTA
给 8259A 中断控制器; 最大模式下还会启动LOCK
信号通知总线仲裁器8289.
2.第二个总线周期 : CPU son送出第二个!INTA
信号, 通知8259A 将相应中断请求的中断类型码送DB
, CPU读取中断类型码n
后剩下的同内部中断响应过程
8088对INTR的中断响应时序/可屏蔽中断响应:
- 第一个总线周期 :
6.5 可编程中断控制器 8259A
引线
-
D 0 ˜ D 7 D_0 \~~ D_7 D0 ˜D7 : 8位双向数据线, 传送数据和控制字.
-
C S ‾ \overline{CS} CS : 片选信号.
-
R D ‾ , W R ‾ \overline{RD}, \overline{WR} RD,WR : 读/写控制信号, 连接系统总线的 I O W ‾ , I O R ‾ \overline{IOW}, \overline{IOR} IOW,IOR.
-
A 0 A_0 A0 : 8259A内部寄存器的端口地址选择信号线.
-
I N T INT INT : 8259A 的中断请求输出信号.
-
I N T A ‾ \overline{INTA} INTA : 中断响应输入信号.
-
C A S 0 ˜ C A S 3 CAS_0 \~~ CAS_3 CAS0 ˜CAS3 : 级联控制线.
-
S P ‾ / E N ‾ \overline{SP} / \overline{EN} SP/EN : 双功能引线.
8259A 支持一层级联, 即最多支持微机系统中接入9片8259. 一片作为主片, 其余作为从片, 当某从片8259A 提出中断请求时, 主片 8259A送出相对应的编码给从片以允许中断.
-
I R 0 ˜ I R 7 IR_0 \~~ IR_7 IR0 ˜IR7 : 中断请求输入信号, 与外设的中断请求线相连.
8259A的内部结构
由中断请求寄存器IRR, 中断服务寄存器ISR, 中断屏蔽寄存器IMR, 中断判优电路, 数据总线缓冲器, 读写电路, 控制逻辑和级联缓冲/比较器组成.
-
中断请求寄存器 IRR / Interrupt Request Register :
保持从 I R 0 ˜ I R 7 IR_0 \~~ IR_7 IR0 ˜IR7来的中断请求信号. 保持该中断直到被响应. -
中断服务寄存器 ISR / Interrupt Service Register :
保存所有正在服务的中断源. 中断响应时, 判优电路把IRR中top priority的中断源在ISR中置一 -> 表示正在处理该中断.
ISR
中的某一位 I S i IS_i ISi可阻断低优先级的中断源响应, 不阻止高优先级 -> 允许中断嵌套 -
中断屏蔽寄存器 ISR / Interrupt Mask Register : 用于存放中断屏蔽字, 每一位分别与 I R 0 ˜ I R 7 IR_0 \~~ IR_7 IR0 ˜IR7 对应.
-
中断判优电路
6.5.2 8259A 的工作过程
- 初始化 - 写入控制字
初始化完成后, 8259A就绪, 随时可以接收中断请求信号
- 一或多条中断请求输入线收到中断请求信号 -> IRR 相应位置一.
- 中断请求输入线上 存在没被IMR屏蔽的中断(合法valid的中断) -> 8259A 由INT引脚向CPU发送中断请求信号
INTR
- CPU若
IF=1
, 处于开中断状态 -> 当前指令执行完后, CPU响应中断, 发出!INTA
回应. - 8259A 接收到CPU发出的第一个
!INTA
后 -> 使ISR中最高优先权位置一 - 第二个中断响应总线周期中, CPU再次输出
!INTA
脉冲 -> 8259A把选定中断源 的中断向量码送DB
- 若 8259A 工作在
- 自动中断结束AEOI方式 -> 第二次
!INTA
脉冲后使中断源所对应的ISR
中的相应位复位. - 非自动中断结束方式 -> 由 CPU在中断服务子程序结束时向8259A写入EOI命令以使
ISR
对应位复位
- 自动中断结束AEOI方式 -> 第二次
6.5.3 8259A 的工作方式
8259A 级联工作方式
6.5.4 8259A 初始化编程
8259A的控制命令分为初始化控制字ICW(Initialization Command Word)和操作命令字OCW(Operation Command Word) -> 8259A 初始化编程分为初始化编程和操作方式编程两个步骤. 用户对于8259A的使用与配置都是通过写入ICW和OCW实现的.
基本结构:
8259 A 初始化编程 { 初始化控制字 I C W { I C W 1 − 初始化字 I C W 2 − 中断向量码 I C W 3 − 级联控制字 I C W 4 − 中断结束方式字 操作命令字 O C W { O C W 1 − 中断屏蔽字 O C W 2 − 中断结束和优先级循环 O C W 3 − 屏蔽方式和状态读出控制字 8259A~初始化编程 \begin{cases} 初始化控制字~ICW \begin{cases} ICW1 - 初始化字 \\ ICW2 - 中断向量码 \\ ICW3 - 级联控制字 \\ ICW4 - 中断结束方式字 \\ \end{cases} \\ 操作命令字~OCW \begin{cases} OCW1 - 中断屏蔽字 \\ OCW2 - 中断结束和优先级循环 \\ OCW3 - 屏蔽方式和状态读出控制字 \\ \end{cases} \\ \end{cases} 8259A 初始化编程⎩ ⎨ ⎧初始化控制字 ICW⎩ ⎨ ⎧ICW1−初始化字ICW2−中断向量码ICW3−级联控制字ICW4−中断结束方式字操作命令字 OCW⎩ ⎨ ⎧OCW1−中断屏蔽字OCW2−中断结束和优先级循环OCW3−屏蔽方式和状态读出控制字
1 - 8259A 内部寄存器的寻址方法
内部寄存器较多, 需要配合 R D ‾ , W R ‾ 和 D 4 , D 3 \overline{RD}, \overline{WR} 和 D_4, D_3 RD,WR和D4,D3进行寻址:
2 - 8259A 初始化顺序
若
A
0
=
1
A_0 = 1
A0=1 -> 写入对象为 : ICW2, ICW3, ICW4, OCW1
-> 一个地址映射4个寄存器, 写入时遵守规定的写入顺序顺序写入
初始化命令字 ICW
-
ICW1 - 初始化字 / word initialization : 重新初始化 8259A
当 A 0 = 0 , D 4 = 1 A_0 = 0, D_4 = 1 A0=0,D4=1时选中.
ICW1格式:
-
ICW2 - 中断向量码 / interrupt vector code : 存放中断向量码.
当 A 0 = 1 A_0 = 1 A0=1时选中 . 初始化时仅需要确定 T 6 ˜ T 3 T_6 \~~ T_3 T6 ˜T3. 低三位 T 2 ˜ T 0 T_2 \~~ T_0 T2 ˜T0由输入8259A的中断源序号( I R 0 ˜ I R 7 IR_0 \~~ IR_7 IR0 ˜IR7)填入.
ICW2格式:
-
ICW3 - 级联控制字 / cascade control word
仅在多片 8259A 级联时需要写入. 主片与从片的ICW3格式上不同.
主片与从片的ICW3的控制字必须与其硬件电路接线一致.
ICW3格式:
-
ICW4 - 中断结束方式字 / interrupt ended mode word
操作命令字 OCW
-
OCW1 - 中断屏蔽字 / interrupt mask word
决定中断请求信号线 I R i IR_i IRi是否屏蔽, 初始时全为0.
-
OCW2 - 中断结束和优先级循环 / end of interrupt and cycle of priority
对8259A发出中断结束命令 EOI, 还可以控制中断优先级的循环.
-
R - 优先级循环控制位 :
R=0
使用固定优先级R=1
使用循环优先级
-
SL - 特殊循环控制 :
SL=1
使 L 2 , L 0 L_2, L_0 L2,L0对应的 I R IR IR为最低优先级
-
EOI - 中断结束命令
EOI=1
复位ISR, 即结束此时的中断服务
ICW4 中的
AEOI=0(非自动EOI)
的情况下, 需要使用OCW2来复位现行中断的ISR
-
-
OCW3 - 屏蔽方式和状态读出控制字 / mask mode and command word read
-
设置中断屏蔽方式
-
查询中断请求 : CPU 向 8259A 写一个
P=1
的OCW3, 再对同一地址读入, 即可读到以下格式的状态字节:I=1
表示有中断请求产生R2~R0
给出最高优先级的IR
-
读8259A状态
-
4 - 8259A 编程举例
主片8259A的IR_2
级联从片8259A, 具体的中断源和类型号规定如下:
给出主片8259A的端口地址为20H, 21H
, 中断向量码为08H~0FH
, 从片8259A的端口地址为A0H, A1H
, 中断向量码为70H~77H
, 8259A 初始化编程
; 主片 8259A 初始化
MOV AL, 11H ;写入 IOW1=00010011B, edge-trigger, cascade
MOV DX, 20H ;端口地址A0 = 0
OUT DX, AL
JMP INTR1
INTR1: MOV AL, 08H ;写入 IOW2=00001111B -> T7~T3 = 00001
MOV DX, 21H ;端口地址A0 = 1
OUT DX, AL ;
JMP INTR2
INTR2: MOV AL, 04H ;IR_2接入从片级联, 写入 IOW3=00000100B
OUT DX, AL
JMP
INTR3: MOV AL, 01H ;写IOW4 -> 一般嵌套, 非自动AEOI=00000001B
OUT DX, AL