7.3.3 中断控制器8259A
可编程中断控制器8259A 能够管理输入CPU 的多个可屏蔽中断请求,实现中断优先权判别,提供中断向量和屏蔽中断等功能。一片8259A 可直接管理8级中断,如果采用级联方式,不用附加外部电路就能管理最多64级中断。8259A 使用+5 V 电源供电,具有多种工作方式,能适应各种系统要求,其优先级方式在执行主程序的任何时刻都可动态改变。下面详细介绍8259A 芯片。
图7.13 中断处理过程流程
1.8259A 的功能和作用
8259A 可协助CPU 完成如下中断管理任务:
(1)接受外部设备的可屏蔽中断请求,并经优先权电路判决找出优先级最高的中断源,然后向CPU 发出中断请求信号INT。一片8259A 可接受8级可屏蔽中断请求,通过9片8259A 级联可管理64级可屏蔽中断。
(2)8259A 具有允许或禁止(屏蔽)某个可屏蔽中断的功能。8259A 中断控制器可对提出中断请求的I/O 设备进行允许或屏蔽,采用8259A 可使系统无须添加其他电路,只需要对8259A 进行级联就可管理8级、15级或最多到64级的可屏蔽中断。
(3)为CPU 提供中断类型号(可编程的标识码),也就是中断服务程序入口地址指针,这是8259A 最突出的特点之一。CPU 在中断响应周期根据8259A 提供的中断类型号乘以4,找到中断服务程序的入口地址来实现中断服务程序的转移。
(4)8259A 具有多种中断优先权管理方式,可通过编程来进行选择。
2.8259A 内部结构
8259A 的内部结构如图7.14所示。
由图7.14可见,中断控制器8259A 主要由以下几部分组成:
(1)中断请求寄存器(IRR):是一个具有锁存功能的8位寄存器,该寄存器存放外部输入的中断请求信号IR0~IR7。当某个IR i端有中断请求,IRR 中相应位置1,其内容可由CPU 读出。当中断请求响应时,IRR 相应位就复位为0。
图7.14 8259A 的内部结构示意图
(2)中断屏蔽寄存器(IMR):是一个可对8级中断请求分别独立地加以屏蔽或允许的寄存器。若IMR 的某位置1,与之对应的中断请求即被屏蔽。屏蔽优先级高的中断请求不影响优先级较低的中断请求。
(3)中断服务寄存器(ISR):与中断请求信号IR0~IR7相对应,存放所有正在进行服务的中断请求(包括那些没有执行完而中途被优先级更高的中断所打断的中断请求)。若ISR某位为1,表示正在为相应的中断源服务。
(4)数据总线缓冲器:这是8259A 与微机系统数据总线的接口,是一个双向三态缓冲器。CPU 向8259A 输出的数据、命令、控制字,以及CPU 从8259A 输入的数据、状态信息都要经过数据总线缓冲器。
(5)读/写控制逻辑:接收来自CPU 的读/写命令、
,配合
端的片选信号和A 0端的地址输入信号,以实现CPU 对8259A 的读/写操作。当CPU 对8259A 进行写操作时,读/写控制逻辑电路将写入的数据送到相应的命令寄存器中,当CPU 对8259A 进行读操作时,读/写控制逻辑电路将相应的寄存器的内容(IRR、ISR、IMR)输出到数据总线上。
(6)优先权电路:也称优先级判别器(PR),用来管理和识别各中断请求信号的优先级。当输入端有多个中断请求信号同时产生时,由PR 判定哪个中断请求具有最高优先权。PR对保存在IRR 中的各个中断请求,排序并判定其中优先权最高的,使ISR 中相应位置1,表示正在为之服务。如果此后又有中断请求,则将后来的中断与ISR 中正在被服务的中断的优先级相比较,以决定是否向CPU 发出新中断请求。
(7)控制逻辑:8259A 内部的控制逻辑电路,它根据编程设置的工作方式管理8259A的全部工作。当IRR 中有未被屏蔽的中断请求时,控制逻辑向CPU 输出高电平的INT 信号,表示申请中断。在中断响应期间,控制逻辑使ISR 相应位置1,并发出相应的中断类型号,通过数据总线缓冲器输出到系统总线上。在中断服务结束时,控制逻辑按照编程规定的方式对ISR 进行处理。
(8)级联/缓冲比较器:用于存储并比较系统中所用的全部8259A 的输入信号,以实现最多8片的8259A 的级联。与此器件相关的是3条级联线CAS0~CAS2和从片编程/允许缓冲器/
线。其中CAS0~CAS2是8259A 芯片互相连接用的专用总线,用来构成8259A 主从式级联控制结构,通过编程可使从8259A 的从设备标志保存在级联/缓冲比较器中。
1片8259A 芯片只能接收8级中断,超过8级时(≤64级)可用多片8259A 级联使用,此时可用1片8259A 芯片做主片,1~8 片8259A 芯片做从片,构成主从控制结构。当8259A 进行级联时,主8259A 的端接+5V(为1),从8259A 的
接地(为0),且从8259A的INT 输出接到主8259A 的中断请求信号线IR 上,因此最多可组合成64 级中断请求控制。
当8259A 进行级联时,主片和从片的CAS0~CAS2 端并接在一起作为级联总线。在中断响应过程中,主8259A 的CAS0~CAS2是输出信号,从8259A 的CAS0~CAS2是输入信号。当CPU 发送的第1个脉冲结束时,主8259A 将中断优先级最高的从8259A 的从设备标志ID 送入CAS0~CAS2总线。每个从8259A 接收后,将主片送来的标志ID 与自己的标志ID 进行比较。若相同,表明本从片被选中,则在CPU 发送第2个
脉冲期间把相应的中断类型号送至数据总线,传送给CPU。
如图7.15所示为3片8259A 级联的连接。
图7.15 3片8259A 级联的连接
3.8259A 引脚说明
8259A 是双列直插式芯片,一共有28个引脚,如图7.16所示,各引脚功能说明如下:
(1):片选输入引脚,低电平有效。当
为低电平时,CPU 可以通过数据总线对8259A进行读/写操作。一般由系统地址总线经译码后形成,
决定了8259A的端口地址范围。
(2):写控制信号引脚,低电平有效。写信号有效时,CPU 可向8259A 写入命令控制字。
(3):读控制信号引脚,低电平有效。读信号有效时,8259A 将状态信息送至数据总线供CPU 读取。
(4)D0~D7:双向输入/输出引脚,直接与系统数据总线相接,用来传送控制、状态和中断类型号等信息。
(5)CAS0~CAS2:级联信号引脚,主片时为输入,从片时为输出。与/
信号配合,实现芯片的级联,这三个引脚信号的不同组合实现为000~111,刚好对应8个从片。
(6)IR0~IR7:I/O 设备中断请求信号线。当级联的时候,从片的INT 端与主片的某一个IR i端相连。
(7)/
:双向从片编程/允许缓冲器引脚,低电平有效。这条信号线有如下两种功能:当8259A 工作在缓冲方式时,它是输出信号,用作缓冲器接收和发送的启动信号(
);当8259A 工作在非缓冲器方式时,它是输入信号,用来指明该8259A 是作为主片工作(
/
=1),还是作为从片工作(
/
=0)。
(8)INT:中断请求信号输出引脚,高电平有效,接CPU 的中断输入端INTR。
(9):中断响应信号输入引脚,低电平有效,接收CPU 送来的中断响应信号。
(10)A0:地址选择信号,对于8086CPU 通常接地址总线的A1。通常,A0与、
、
一起用来对寄存器进行选择,表示正在访问8259A 的哪个端口。
图7.16 8259A 引脚
4.中断优先级设置方式
8259A 中断控制器的中断管理方式非常灵活,可满足用户的各种不同要求。8259A 中断管理的核心是对中断优先级的管理,8259A 对中断优先级的设置方式包括:一般全嵌套、特殊全嵌套、自动循环、特殊循环4种方式。
(1)一般全嵌套方式:这是8259A 控制器最基本和最常用的优先级设置方式,如果在对8259A 初始化时没有设置其他优先级方式,此方式为默认方式。在一般全嵌套方式下,8259A IR0~IR7端引入的中断具有固定优先级排队顺序,IR0 为最高优先级,IR1 为次高优先级,……以此类推,IR7 为最低优先级。而且,当某个级别的中断请求正在被服务期间,8259A 将禁止同级或较低级的中断请求,但允许高优先级的中断打断低优先级的中断服务,实现中断嵌套。
(2)特殊全嵌套方式:工作方式与一般全嵌套方式基本相同。唯一的区别是在特殊全嵌套方式下,当处理某一级中断请求时,如果有同级的中断请求,也会暂停当前中断服务给予响应,从而实现对同级中断请求的特殊嵌套。而在一般全嵌套方式中只有更高级的中断请求到来时才可以暂停当前中断,对同级中断请求不会予以响应。
【例7.5】 假设在一个8259A 级联系统中,设置主片为特殊全嵌套方式。此时,任何一个从8259A 接收到的中断请求,若经该8259A 判定为当前最高优先级,则通过INT 端向主8259A 相应IR 端提出中断请求。若此时主8259A 中ISR 相应位等于1,则说明该从8259A其他端已提出过中断请求,且正在服务。从8259A 优先权电路判别到刚申请的中断优先级更高,故应暂停现行中断服务转去为刚申请的中断服务。若主8259A 工作在一般全嵌套方式,主8259A 将把同一个从8259A 芯片不同级别中断请求认为是同级的,而不予以响应。因此在级联系统中,就要求将主8259A 的优先级设置为特殊全嵌套方式,此时主8259A 可响应同级或更高级的中断,不响应低级别的中断请求。显然,此时接在主片IR3上的从片比接在IR4上的从片优先级更高,而从主片IR0、IR1、IR2端发出的中断请求比从接在主片IR3上的从片发出的中断请求优先级更高。
(3)自动循环方式:在一般全嵌套方式下,中断请求IR0~IR7的优先级是固定不变的,使得从IR0引入的中断总是具有最高优先级。但在某些情况下,我们需要改变这种优先级,这时可采用自动循环方式。在该方式下,IR0~IR7引入的中断轮流为最高优先级,当某个中断源被服务后,它的优先级就被改变为最低优先级,而最高优先级分配给该中断的下一级中断。假设开始中断优先级队列为IR0、IR1、…、IR7,如这时IR4有请求,响应IR4后优先级队列变为IR5、IR6、IR7、IR0、…、IR4。
8259A 设置为自动循环方式后,其中断系统的初始优先级仍是固定的,即IR0最高,IR1次之……IR7最低,其他以此类推。自动循环方式适用于系统中多个中断源的优先级相等的情况。
(4)特殊循环方式:该方式与上述自动循环方式相比,不同之处在于在特殊循环方式中,一开始的最低优先级由编程确定,而不是像自动循环方式中固定为IR7。在此方式中,设置IR0~IR7中哪一级为最低都可以,最低优先级设置后,最高优先级也就确定了。例如,在8259A 初始时,编程设定IR3为最低级,则IR4就为最高优先级,其他以此类推。
5.中断屏蔽方式
8259A 可编程设置对中断请求的允许或屏蔽,中断屏蔽的设置方式有如下两种:
(1)普通屏蔽方式:8259A 内的中断屏蔽寄存器IMR 为8位,与8个中断源IR0~IR7相对应。设置普通屏蔽方式,CPU 只需向8259A 的中断屏蔽寄存器IMR 中发一个屏蔽字,屏蔽字中为“1”的位所对应的中断源就被屏蔽,它们的中断申请就不能传送到CPU;屏蔽字中为“0”的位所对应的中断源则被允许提出中断请求。如CPU 在执行某级中断服务中,为了禁止比它级别高的中断进入,可在中断服务程序中将IMR 中比此中断级别高的相应位置“1”而加以屏蔽。
(2)特殊屏蔽方式:此方式的特点是CPU 正在处理某一级中断时,只可对本级中断进行屏蔽,允许级别比它高的或比它低的中断源申请中断。在中断处理过程中,需要动态改变系统的优先级结构时可采用特殊屏蔽方式。
在多级中断嵌套的情况下,通常都是按事先安排好的优先级顺序进行嵌套,而且只允许级别高的中断源打断优先级别低的中断源。在这种情况下,如果有某个优先级高的中断源的服务程序运行时间很长,那么那些低优先级的中断申请可能等很长时间也得不到响应。为了能够临时改变固定的嵌套顺序,允许低级别的中断打断高级别的中断,即实现优先级的动态改变,就要采用特殊屏蔽方式。
当中断系统设置使用特殊屏蔽方式之后,在中断系统正在处理某个级别的中断的时候,对于外界来说,只有同一级别的中断被屏蔽,其他比当前级别高的或低的中断系统都可以响应。
6.中断结束管理
当8259A 响应某一级中断并为其服务时,中断服务寄存器(ISR)相应位置“1”,表示正在对外服务,当有更高级的中断请求进入时,ISR 相应位又要置“1”。因此ISR 寄存器中会有多位同时置“1”的情况。这样,中断管理会比较混乱,所以在中断服务结束时,ISR 相应位应清“0”,以便再次接收同级别中断。所谓中断结束管理,就是用不同的方式使ISR 相应位清“0”,并确定随后的优先权排队顺序。
8259A 中断结束管理可分为如下3种方式。
(1)自动中断结束方式:在此方式下,某级中断被响应后,当8259A 收到第1个中断响应信号后,ISR 中对应位就被置“1”;当8259A 收到第2 个中断响应信号
后,8259A 就自动将ISR 中对应位清“0”。这时,该中断服务程序可能还在执行,但对8259A 来说,因为在ISR 中对应标志位为“0”,它对本次中断的控制已经结束。在此方式下,当中断服务程序结束时,不需要向8259A 发送EOI命令(中断结束命令),本方式是一种最简单的中断结束方式。
但是这种方式存在着明显的缺欠,当8259A 收到第2个中断响应信号后,由于ISR 中相应位已被清0,在8259A 中已没有对应的标志,如果在此过程中出现新的中断请求,那么只要CPU 允许中断,不管新的中断级别如何,都将打断正在执行的中断服务程序而被优先执行。这样显然是不合理的,而且如果低级中断可以打断高级中断,反过来高级中断又可打断低级中断,将产生重复嵌套,并且无法控制嵌套深度。因此,自动中断结束方式只能用在一些以预定速率发生中断,且不会发生同级中断互相打断或低级中断打断高级中断的情况下。
(2)普通中断结束方式:适用于一般全嵌套方式。在这种方式下,当中断服务结束时,由CPU 发送一个普通EOI命令,在8259A 收到该命令后,将当前ISR 中最高优先级对应的位清“0”。此方式只有在当前结束的中断总是尚未处理完的优先级最高的中断时才能使用。倘若在中断服务中修改过中断优先级,则不能采用这种方式。
(3)特殊中断结束方式:因为在自动循环、特殊循环等方式下,无法根据ISR 的内容来确定哪一级中断是最后响应和处理的,这时就要采用特殊的中断结束方式来指出应将ISR寄存器中哪一个置“1”位清0。
特殊中断结束方式与普通中断结束方式类似,当中断服务结束,CPU 给8259A 发出EOI命令的同时,将当前结束的中断级别也发送给8259A。即在命令字中明确指出对ISR寄存器中指定优先级相应位清“0”,所以这种方式也称为“指定EOI方式”。
特殊中断结束方式在任何情况下都可以使用,尤其适合8259A 级联方式。这时,当中断结束时,CPU 应发出两个EOI命令,一个发送给主8259A,用来将主8259A 的ISR 相应位清“0”;另一个发送给从8259A,用来将从8259A 中的ISR 相应位清“0”。
7.连接系统总线的方式
8259A 中断控制器与系统总线的连接分为缓冲方式和非缓冲方式。
(1)缓冲方式:此方式应用于多片8259A 级联的中断系统中,这时8259A 通过总线驱动器与系统数据总线相连。为了解决总线驱动器的启动问题,将8259A 的/
端和总线驱动器的允许端相连。8259A 工作在缓冲方式时,将在输出状态字或中断类型号的同时,从
/
端输出一个低电平,此低电平用作总线驱动器的启动信号。
(2)非缓冲方式:当中断系统中只有单片8259 A 或不多几片8259 A 时,一般要将它直接与数据总线相连。在上述情况下,8259 A 就可以工作在非缓冲方式下。在此方式下,8259 A 中的/
端作为输入端。当中断系统中只有单片8259 A 时,其
/
端必须接高电平;当有多片8259 A 时,主片
/
端接高电平,从片
/
端接低电平。
8.中断请求触发方式
8259A 中断控制器允许I/O 设备的中断请求信号以以下两种方式触发:
(1)电平触发方式:8259A 将中断请求输入端出现的高电平作为有效中断请求信号。在这种方式下,当中断请求输入端出现一个高电平并得到CPU 响应时,高电平必须及时撤销。否则,当CPU 进入中断处理过程并开放中断后,会引起第2次不应该有的中断。因此,对中断源产生的中断请求触发电平要有时间的限定,若有效高电平持续的时间太短,就达不到触发中断的目的;但时间如果太长就会引起重复触发。一般要求中断请求触发电平应持续到CPU 响应中断的第1个脉冲的下降沿为止。
(2)边沿触发方式:8259A 将中断请求输入端出现的上升沿作为有效的中断请求信号。当请求信号的上升沿出现后,相应引脚可以保持高电平,直到下一次需要申请时为止,不会产生电平触发方式的误动作。
9.中断响应过程
8259A 在8086/8088微机系统中的中断响应过程如下:
(1)若中断请求线(IR0~IR7)上有一条或几条变为高电平时,则将中断请求寄存器IRR 的相应位置位。
(2)若IRR 某一位被置1后,则检查IMR 中相应的屏蔽位,若该屏蔽位为1,则禁止该中断请求;若该屏蔽位为0,则将中断请求发送给优先权电路。
(3)优先权电路接收到中断请求后,比较它们的优先级,把当前优先级最高的中断请求信号由INT 引脚输出,发送到CPU 的INTR 端。
(4)如果CPU 处于开中断状态(IF=1),则在当前指令执行完毕后,向8259A 发出中断响应信号。
(5)若8259A 接收到CPU 的第1个信号,把ISR 中对应于允许中断的最高优先级请求位置1,并清除IRR 中的相应位。
(6)CPU 向8259A 发 出 第2 个,在该脉冲期间,8259A 向CPU 发出中断类型号。
(7)如果8259A 设置为自动中断结束方式,则第2个结束时,相应的ISR 位被清“0”。在其他方式中,ISR 相应位由中断服务程序结束时发出的EOI命令来清“0”。
如果8259A 为级联方式的主从结构,且某从8259A 的中断请求优先级最高,则在第1个脉冲结束时,主8259A 将这个从设备标志ID 发送到级联线上。系统中的每个从8259A 把这个标志与自己级联缓冲器中保存的标志相比较,在第2个
期间,将被选中的从8259A 的中断类型号发送到数据总线上。
(8)CPU 收到从8259A 发来的中断类型号,将它乘以4得到中断向量,然后跳转至中断服务程序。