1、第 8 章 中断,本章讲述:8.1 引言8.2 最简单的中断情况8.3 中断优先权8.4 8086微处理器的中断方式8.5 中断控制器Intel8259A,8.1 引言8.1.1 为什么要用中断,当CPU与外设交换信息时,若用查询的方式,则CPU就要浪费很多时间去等待外设。这样就存在一个快速的CPU与慢速的外设之间的矛盾,这也是计算机在发展过程中遇到的严重问题之一。为了解决这个问题,一方面要提高外设的工作速度;另一方面发展了中断的概念。实现了中断,就有以下好处:,1. 同步操作有了中断功能,就可以使CPU和外设同时工作。CPU在启动外设工作后,就继续执行主程序,同时外设也在工作,当外设把数据准
2、备好后,发出中断申请,请求CPU中断它的程序,执行输入或输出(中断处理),处理完以后,CPU恢复执行主程序,外设也继续工作。而且有了中断功能,CPU可命令多个外设同时工作。这样大大提高了CPU的利用率,也提高了输入输出的速度。,2. 实现实时处理当计算机用于实时控制时,中断是一个十分重要的功能。现场的各个参数、信息,可在任何时间发出中断申请,要求CPU处理;CPU则可以马上响应(若中断是开放的话)并加以处理。这样的及时处理在查询的工作方式下是做不到的。3. 故障处理计算机在运行过程中,往往会出现事先预料不到的情况,或者出现一些故障如电源突跳、存储出错、运算溢出等。计算机就可以利用中断系统自行处
3、理,而不必停机或报告工作人员。,8.1.2 中断源,引起中断的原因,或能发出中断申请的来源,称为中断源。通常中断源有以下几种: (1) 一般的输入输出设备。如键盘、行打印机等。(2) 数据通道中断源。如磁盘、磁带等。(3) 实时时钟。在控制中,常要遇到时间控制,若用前面介绍的用CPU执行一段程序来实现延时的方法,则在这段时间内,CPU不能干别的工作,降低了CPU的利用率,所以,常用外部时钟电路,当需要定时的时候,CPU发出命令,令时钟电路(这样的电路的定时时间通常是可编程的即可用程序来确定和改变的)开始工作,待规定的时间到了以后,时钟电路发出中断申请,由CPU加以处理。,(4) 故障源。例如电
4、源掉电,就要求把正在执行的程序的状态PC(或IP)、各个寄存器的内容和标志位的状态保留下来,以便重新供电后能从断点处继续运行。另外,目前绝大部分微型计算机,RAM是使用半导体存储器,故电源掉电后,必须接入备用的电池供电电路,以保护存储器中的信息。所以,在直流电源上并上大电容,使其因掉电、电压下降到一定值时就发出中断申请,由计算机的中断系统执行上述的各项操作。(5) 为调试程序而设置的中断源。一个新的程序编制好以后,必须经过反复调试才能正确可靠地工作。在程序调试时,为了检查中间结果,或者为了寻找毛病所在,往往要求在程序中设置断点,或进行单步工作(一次只执行一条指令),这些就要由中断系统来实现。,
5、8.1.3 中断系统的功能,为了满足上述各种情况下的中断要求,中断系统应该具有如下功能: 1. 实现中断及返回当某一中断源发出中断申请时,CPU能决定是否响应这个中断请求(当CPU在执行更紧急、更重要的工作时,可以暂不响应中断),若允许响应这个中断请求,CPU必须在现行的指令执行完后,把断点处的IP和CS值(即下一条应执行的指令的地址)、各个寄存器的内容和标志位的状态推入堆栈保留下来称为保护断点和现场。然后转到需要处理的中断源的服务程序(Interrupt Service Routine)的入口,同时清除中断请求触发器。当中断处理完后,再恢复被保留下来的各个寄存器和标志位的状态(称为恢复现场)
6、,恢复IP和CS值(称为恢复断点),使CPU返回断点,继续执行主程序。,2. 实现优先权排队在系统中通常有多个中断源,会出现两个或更多个中断源同时提出中断请求的情况,这样就必须要设计者事先根据轻重缓急,给每个中断源确定一个中断级别优先权。当多个中断源同时发出中断申请时,CPU能找到优先权级别最高的中断源,响应它的中断请求;在优先权级别最高的中断源处理完了以后,再响应级别较低的中断源。,3. 高级中断源能中断低级的中断处理当CPU响应某一中断源的请求,在进行中断处理时,若有优先权级别更高的中断源发出中断申请,则CPU要能中断正在进行的中断服务程序;保留这个程序的断点和现场(类似于子程序嵌套),响
7、应高级中断,在高级中断处理完以后,再继续进行被中断的中断服务程序。而当发出新的中断申请的中断源的优先权级别与正在处理的中断源同级或更低时,则CPU就先不响应这个中断申请,直至正在处理的中断服务程序执行完以后才去处理新的中断申请。,8.2 最简单的中断情况,CPU由于引脚的限制,它的中断请求线的数量是有限的,例如8080只有一条中断请求线。最简单的情况当然是只有一个中断源,我们就从这个最简单的情况分析起。,8.2.1 CPU响应中断的条件,设置中断请求触发器每一个中断源,要能发出中断请求信号,并且这个信号能保持着,直至CPU响应这个中断后,才可清除中断请求。故要求每一个中断源有一个中断请求触发器
8、A,如图8-1所示。,2. 设置中断屏蔽触发器因为在实际系统中,往往有多个中断源。为了增加控制的灵活性,在每一个外设的接口电路中,增加一个中断屏蔽触发器,只有当此触发器为“1”时,外设的中断请求才能被送出至CPU,如图8-2所示。可把8个外设的中断屏蔽触发器组成一个端口,用输出指令来控制它们的状态。,3. 中断是开放的在CPU内部有一个中断允许触发器。只有当其为“1”时(即中断开放时),CPU才能响应中断;若其为“0”(即中断是关闭的),即使INTR线上有中断请求,CPU也不响应。而这个触发器的状态可由STI和CLI指令来改变。当CPU复位时,中断允许触发器为“0”,即关中断,所以必须要用ST
9、I指令来开中断。当中断响应后,CPU就自动关中断,所以必须在中断服务程序中用STI指令来开中断。,4. 现行指令执行结束 CPU在现行指令结束后响应中断,即运行到最后一个机器周期的最后一个T状态时,CPU才采样INTR线。若发现有中断请求,则把内部的中断锁存器置“1”,然后下一个机器周期(总线周期)不进入取指周期,而进入中断周期。其响应的流程如图8-3所示。,8.2.2 CPU对中断的响应,当满足上述条件后,CPU就响应中断,转入中断周期,CPU做以下几种事: 1. 关中断8086在CPU响应中断后,发出中断响应信号INTA的同时,内部自动地实现关中断。2. 保留断点CPU响应中断,封锁IP+
10、1,并且把IP和CS推入堆栈保留,以备中断处理完毕后,能返回主程序。,3. 保护现场为了使中断处理程序不影响主程序的运行,故要把断点处的有关的各个寄存器的内容和标志位的状态,推入堆栈保护起来。8086系统是由软件(即在中断服务程序中)把要用到的寄存器的内容用PUSH指令推入堆栈。4. 给出中断入口,转入相应的中断服务程序8086是由中断源提供的中断矢量形成中断入口地址(即中断服务程序的起始地址)。在中断服务程序完成后,还要做下述的5、6两步。,5. 恢复现场把所保存的各个内部寄存器的内容和标志位的状态从堆栈弹出,送回CPU中的原来位置。这个操作在8086中也是由服务程序中用POP指令来完成的。
11、6. 开中断与返回在中断服务程序的最后,要开中断(以便CPU能响应新的中断请求)和安排一条返回指令,将堆栈内保存的IP和CS值弹出,运行就恢复到主程序。上述过程可用图8-4的流程图表示。,8.3 中断优先权,如前所述,实际的系统中,是有多个中断源的,但是,由于CPU引脚的限制,往往就只有一条中断请求线。于是,当有多个中断源同时请求时,CPU就要识别出是哪些中断源有中断请求,辨别和比较它们的优先权(priority),先响应优先权级别最高的中断申请。另外,当CPU正在处理中断时,也要能响应更高级的中断申请,而屏蔽掉同级或较低级的中断申请。,8.3.1 用软件确定中断优先权,要判别和确定各个中断源
12、的中断优先权可以用软件和硬件两种方法。软件采用查询技术。当CPU响应中断后,就用软件查询以确定是哪些外设申请中断,并判断它们的优先权。把8个外设的中断请求触发器组合起来,作为一个端口,并赋以设备号,如图8-5所示。把各个外设的中断请求信号相“或”后,作为INTR信号,故任一个外设有中断请求,都可以向CPU送出INTR信号。当CPU响应中断后,把中断寄存器的状态,作为一个外设读入CPU,逐位检测它们的状态,若有中断请求就转到相应的服务程序的入口。用软件查询技术确定中断优先权的流程如图8-6所示。,查询程序有两种方式: (1) 屏蔽法INAL,20H;输入中断请求触发器的状态TESTAL,80H;
13、检查最高位(电源故障)是否有请求JNEPWF;有,则转至电源故障处理程序TESTAL 40H;否,检查磁盘是否有请求JNEDISS;有,转至磁盘服务程序TESTAL 20H;否,检查磁带是否有请求JNEMT;有,转至磁带服务程序 ,(2) 移位法XORAL,ALINAL,20HRCLAL,1JCPWFRCLAL,1JCDISS,查询方法的优点是: (1) 询问的次序即是优先权的次序。显然,最先询问的,优先权的级别最高。(2) 省硬件。不需要有判断与确定优先权的硬件排队电路。但随之而来的缺点是: 由询问转至相应的服务程序入口的时间长,尤其是在中断源较多的情况下。,8.3.2 硬件优先权排队电路,
14、中断优先权编码电路用硬件编码器和比较器的优先权排队电路,如图8-7所示。若有8个中断源,当任一个有中断请求时,通过“或”门,即可有一个中断请求信号产生,但它能否送至CPU的中断请求线,还要受比较器的控制(若优先权失效信号为低电平,则与门2关闭)。8条中断输入线的任一条,经过编码器可以产生三位二进制优先权编码A2A1A0,优先权最高的线的编码为111,优先权最低的线的编码为000。而且若有多个输入线同时输入,则编码器只输出优先权最高的编码。,正在进行中断处理的外设的优先权编码,通过CPU的数据总线,送至优先权寄存器,然后输出编码B2B1B0至比较器,以上过程是由软件实现的。比较器比较编码A2A1
15、A0与B2B1B0的大小,若AB,则“AB”端输出低电平,封锁与门1,就不向CPU发出新的中断申请(即当CPU正在处理中断时,当有同级或低级的中断源申请中断时,优先权排队线路就屏蔽它们的请求);只有当AB时,比较器输出端才为高电平,打开与门1,将中断请求信号送至CPU的INTR输入端,CPU就中断正在进行的中断处理程序,转去响应更高级的中断。,若CPU不在进行中断处理时(即在执行主程序),则优先权失效信号为高电平,当有任一中断源请求中断时,都能通过与门2,发出INTR信号。这样的优先权电路,如何能做到转入优先权最高的外设的服务程序的入口呢?当外设的个数8时,则它们公用一个产生中断矢量的电路,它
16、有三位由比较器的编码A2A1A0供给,就能做到不同的编码转入不同的入口地址。,2. 雏菊花环(Daisy Chain)式或称为链式优先权排队电路另一种常用的硬件排队电路,如图8-8所示。当多个输入有中断请求,则由中断输入信号的“或”电路产生INTR信号,送至CPU。当CPU在现行指令执行完后,响应中断,发出中断响应信号。但CPU转向哪一个中断服务程序的入口呢?这要由图8-8所示的链式优先权排队电路确定。当中断响应为高电平,若F/F-A有中断请求,则它的输出为高,于是与门A1输出为高,由它控制转至中断1的服务程序的入口;且门A2输出为低电平;因而使门B1、B2和C1、C2所有下面各级门的输入和输
17、出全为低电平,即屏蔽了所有别的各级中断。,若第一级没有中断请求,即F/F-A=“0”,则中断输出1为低电平,但门A2的输出却为高电平,起到了把中断响应传递至中断请求2。若此时F/F-B=“1”,则与门B1输出为高电平,控制转去执行中断2的服务程序;此时与门B2的输出为低,因而屏蔽了以下各级。而若F/F-B=“0”,则与门B1输出为低,而与门B2输出为高,把中断响应传递至中断请求3综上所述,在键式优先权排队电路中,若上级的输出信号为“0”,则屏蔽了本级和所有的低级中断,若上级输出为“1”,在本级有中断请求时,则转去执行本级的处理程序,且使本级输至下级的输出为“0”,屏蔽所有低级中断;若本级没有中
18、断请求,则输至下级的为“1”,允许下一级中断。故在链式电路中,排在链的最前面的中断其优先权最高。,8.4 8086微处理器的中断方式,8086有两类中断: 软件中断由指令的执行所引起的;硬件中断由外部(主要是外设)的请求所引起的。,8.4.1 外部中断,8086有两条外部中断请求线: 非屏蔽中断NMI(Non Maskable Interrupt)和可屏蔽中断INTR。1. 可屏蔽中断出现在INTR线上的请求信号是电平触发的,它的出现是异步的,在CPU内部是由CLK的上升沿来同步的。在INTR线上的中断请求信号(即有效的高电平)必须保持到当前指令的结束。在这条线上出现的中断请求,CPU是否响应
19、要取决于标志位I的状态,若I=1,则CPU就响应,可以认为此时CPU是处在开中断状态;若I=0,则CPU就不响应,可以认为此时CPU是处在关中断状态。而I位的状态,可以用指令STI使其置位开中断;也可以用CLI指令来使其复位关中断。,注意: 在系统复位以后,标志位I=0;另外任一种中断(内部中断、NMI、INTR)被响应后,I=0。所以必须在一定的时候用STI指令来开放中断。CPU是在当前指令周期的最后一个T状态采样中断请求线,若发现有可屏蔽中断请求,且中断是开放的(I标志为“1”),则CPU转入中断响应周期。8086进入两个连续的中断响应周期,每个响应周期都是由4个T状态组成,而且都发出有效
20、的中断响应信号。请求中断的外设,必须在第二个中断响应周期的T3状态前,把反映中断的向量(类型)号输至CPU的数据总线(通常通过8259A传送)。CPU在T4状态的前沿采样数据总线,获取中断向量号,接着就进入了中断处理序列。,2. 非屏蔽中断出现在NMI线上的中断请求,不受标志位I的影响,在当前指令执行完以后,CPU就响应。在NMI线上的请求信号是边沿触发的,它的出现是异步的,由内部把它锁存。8086要求NMI上的请求脉冲的有效宽度(高电平的持续时间)要大于两个时钟周期。通常非屏蔽中断用于电源故障。非屏蔽中断的优先权高于屏蔽中断。CPU采样到有非屏蔽中断请求时,自动给出中断向量号2,而不经过上述
21、的可屏蔽中断那样的中断响应周期。,8.4.2 内部中断,8086可以有几种产生内部中断的情况: (1) DIV或IDIV指令在执行除法指令时,若发现除数为0或商超过了寄存器所能表达的范围,则立即产生一个类型为0的内部中断。(2) INT指令如前所述,在8086的指令系统中有一条中断指令即INT n指令。这种指令的执行引起中断,而且中断的类型可由指令中的n加以指定。,(3) INTO指令若上一条指令执行的结果,使溢出标志位O=1,则INTO指令引起类型为4的内部中断。否则,此指令不起作用,程序执行下一条指令。(4) 单步执行若标志位T=1,则CPU在每一条指令执行完以后,引起一个类型为1的中断,
22、这可以做到单步执行,是一种强有力的调试手段。8086规定这些中断的优先权次序为: 内部中断、NMI、INTR,优先权最低的是单步执行。,8.4.3 中断向量表,8086有一个简便的而又多功能的中断系统。上述的任何一种中断,CPU响应以后,都是要保护现场(主要是标志位)和保护断点(现行的码段寄存器CS和指令指针IP),然后转入各自的中断服务程序。8086在内存的前1KB(地址00000H003FFH)建立了一个中断向量表,可以容纳256个中断向量(或256个中断类型),每个中断向量占用4个字节。在这4个字节中,包含着这个中断向量(或这种中断类型)的服务程序的入口地址前两个字节为服务程序的IP,后
23、两个字节为服务程序的CS。如图8-22所示。,其中前32个中断向量(或中断类型)由Intel和操作系统使用,余下的就可以由用户使用,可以作为外部中断源的向量。外部中断源,只要在第二个中断响应周期,向数据总线送出一个字节的中断类型号,即可以转至相应的中断处理程序。,8.4.4 8086中的中断响应和处理过程,8086中的各种中断的响应和处理过程是不相同的,但主要区别在于如何获取相应的中断类型码(向量号)。对于硬件(外部)中断,CPU是在当前指令周期的T状态采样中断请求输入信号,如果有可屏蔽中断请求,且CPU处在开中断状态(I标志为1),则CPU转入两个连续的中断响应周期,在第二个中断响应周期的T
24、4状态前沿,采样数据线获取由外设输入的中断类型码;若是采样到非屏蔽中断请求,则CPU不经过上述的两个中断响应周期,而在内部自动产生中断类型码2。对于软件中断,中断类型码也是自动形成的。被零除为0、单步为1、断点为2和溢出为4对于INT n指令,则类型码即为指令中给定的n。,8086在取得了类型码后的处理过程是一样的,其顺序为: (1) 将类型码乘4,作为中断向量表的指针;(2) 把CPU的标志寄存器入栈,保护各个标志位,此操作类似于PUSHF指令;(3) 复制追踪标志T的状态,接着清除I和T标志,屏蔽新的INTR中断和单步中断;(4) 保存主程序中的断点,即把主程序断点处的IP和CS值推入堆栈
25、保护,先推入CS值,再推入IP值;,(5) 从中断向量表中取中断服务程序的入口地址,分别送至CS和IP中,先取CS值;(6) 按新地址执行中断服务程序。在中断服务程序中,通常要保护CPU内部寄存器的值(保护现场),开中断(若允许中断嵌套的话)。在中断服务程序执行完后,要恢复现状,最后执行中断返回指令IRET,IRET指令按次序恢复断点处的IP和CS值,恢复标志寄存器(相当于POP F)。于是程序就恢复到断点处继续执行。8086的中断响应和处理过程可用图8-23的流程图来表示。,8.5 中断控制器Intel 8259A 8.5.1 8259A的功能,Intel 8259A是与8080/8085系
26、列以及8088/8086系列兼容的可编程的中断控制器。它的主要功能为: (1) 具有8级优先权控制,通过级连可扩展至64级优先权控制。(2) 每一级中断都可以屏蔽或允许。(3) 在中断响应周期,8259A可提供相应的中断向量,从而能迅速地转至中断服务程序。(4) Intel 8259A有多种工作方式,可以通过编程来进行选择。,8.5.2 8259A的结构,Intel 8259A的方框图如图8-9所示。一片8259A有8条外界中断请求线IR0IR7,每一条请求线有一个相应的触发器来保存请求信号,从而形成了中断请求寄存器IRR(Interrupt Request Register)。正在服务的中断
27、,由中断服务寄存器ISR(INService Register)保存。优先权电路对保存在IRR中的各个中断请求,经过判断确定最高的优先权,并在中断响应周期把它选通至中断服务寄存器。,中断屏蔽寄存器IMR(Interrupt Mask Register)的每一位可以对IRR中的相应的中断源进行屏蔽。但对于较高优先权的输入线实现屏蔽并不影响较低优先权的输入。数据总线缓冲器是8259A与系统数据总线的接口,它是8位的双向三态缓冲器。凡是CPU对8259A编程时的控制字,都是通过它写入8259A的;8259A的状态信息,也是通过它读入CPU的;在中断响应周期,8259A送至数据总线的中断矢量也是通过它
28、传送的。,读/写控制逻辑,CPU能通过读/写控制逻辑实现对8259A的读出(状态信号)和写入(初始化编程)。级连缓冲器能实现8259A芯片之间的级连,使得中断源可由8级扩展至64级。控制逻辑部分,对芯片内部的工作进行控制,使它按编程的规定工作。,8.5.3 8259A的引线,Intel 8259A是28个引脚的双列直插式芯片,其引线如图8-10所示。D7D0是双向三态数据线,它可直接与系统的数据总线相连。IR0IR7是8条外界中断请求输入线。RD#是读命令信号线,当其有效时,控制信息由8259A至CPU。WR#是写命令信号线,当其有效时,控制信息由CPU写入至8259A。,CS#是选片信号线,
29、由地址高位控制。A0用以选择8259A内部的不同寄存器,通常直接连至地址总线的A0。CAS2CAS0是级连信号线,当8259作为主片时,这三条为输出线;作为从片时,则此三条线为输入线。这三条线与SP/EN线相配合,实现8259A的级连(详见后面有关级连部分的叙述)。8259A与Intel系列的标准系统总线的连接,如图8-11所示。,8259A的A0通常与地址总线的A0相连,A7A1经过译码与CS#相连(全译码方式);或与某一条高位地址线相连(线选方式)。RD#与系统的控制信号线IOR#相连,WR#线与IOW#相连。其他与系统的同名信号端相连就可以了。,8.5.4 8259A的中断顺序,(1)
30、当有一条或若干条中断请求输入线(IR7IR0)变高,则使中断请求寄存器IRR的相应位置位。(2) 若中断请求线中至少有一条是中断允许的,则8259A由INT引脚向CPU送出中断请求信号。(3) 若CPU是处在开中断状态,则在当前指令执行完以后,用INTA信号作为响应。(4) 8259A在接收到CPU的INTA信号后,使最高优先权的ISR位置位,而相应的IRR位复位。但在此周期中,8259A并不向系统数据总线送任何内容。,(5) 8088/8086 CPU将启动另一个中断响应周期,输出另一个INTA脉冲。在这个周期8259A向数据总线输送一个8位的指针(向量)。CPU在此周期中,读取此向量把它乘
31、以4,就可以从中断服务程序入口地址表中取出中断服务程序的入口地址(包括段地址和段内偏移量)。(6) 这样中断响应周期就完成了,CPU就可以转至中断服务程序。若8259A工作在AEOI模式,在第二个INTA脉冲结束时,使中断源在ISR中的相应位复位;否则,直至中断服务程序结束,发出EOI命令,才使ISR中的相应位复位。,在第一个中断响应周期,8259A并不向CPU输送任何内容。在第二个中断响应周期,8259A将向CPU输送如表8-2所示的中断向量。其中的T7T3是由用户在8259A的初始化编程中规定,而低3位则是由8259A自动插入的。,8.5.5 8259A的编程,8259A的编程可以分为两种
32、: (1) 初始化编程: 由CPU向8259A送24个字节的初始化命令字ICW(Initialization Command Word)。在8259A开始正常工作之前,必须由初始化命令字,使其处在开始点。(2) 工作方式编程: 由CPU向8259A送三个字节的工作命令字OCW(Operation Command Word),以规定8259A的工作方式。,例如: 中断屏蔽结束中断优先权旋转中断状态工作命令字可在8259A已经初始化以后的任何时间写入。这些命令字的写入,以及8259A的状态的读出是由A0、RD和WR信号以及命令字中的某些特定位所规定的。,8259A的初始化编程 若CPU用一条输出指
33、令向8259A写入一个命令字,其D4=1,输出指令地址中A0=0,则被解释为初始化命令字1(ICW1)。ICW1启动了8259A中的初始化顺序,自动发生下列事件:(1) 边沿敏感电路复位,这意味着在初始化以后,中断请求输入线必须由低变高才产生中断;(2) 中断屏蔽寄存器清零;(3) IR7输入被赋为优先权7;(4) 从模式地址置为7;,(5) 特殊屏蔽模式清除,状态读置为IRR;(6) 若IC4=0,则在ICW4中所选择的所有功能全置为0(非缓冲方式,非自动停止中断方式,用于MCS-80/85系统)。对8259A的初始化编程是向它输送24个字节的初始化命令字,其顺序如图8-12所示。ICW1和
34、ICW2是必须送的,而ICW3和ICW4是由工作方式来选择的。,ICW1的功用可用图8-13来说明。其D4必须为1。D0确定是否送ICW4,若根据选择ICW4的各位应为0,则可令D0位(即IC4)为0,则不送ICW4。D1位SNGL,规定系统中是单片8259A工作还是多片8259A级连工作。D2位ADI,规定CALL地址的间隔,若D2=1,则间隔为4,这适用于建立一个转移指令表;若D2=0,则间隔为8。D3位LTIM,规定中断请求输入线的触发方式,D3=1为电平触发方式,此时边沿检测逻辑断开;D3=0则为边沿触发方式。,D7、D6、D5这三位当应用于MCS-80/85系统时,即为入口地址低8位
35、中的编程位(A7、A6、A5位)。若选择间隔为4,则这三位全可编程;若选择间隔为8,则只有D7(A7)、D6(A6)位可编程,此时D5位不起作用。ICW2各位的功能如图8-14所示。ICW2的D7D3用以确定中断向量的T7T3,此时ICW2的D2D0位无用。,ICW3用于8259A的级连,若系统中只有一片8259A,则不用ICW3;若有多片8259A级连,则主8259A和每一片从8259A都必须用ICW3。8259A最多允许有一片主8259A和8片从8259A,使中断源扩展至64个。主和从8259A的ICW3有所不同,其功用如图8-15所示。,(1) 对于主8259A(由SP=1或由ICW4中
36、的M/S=1规定在缓冲方式所决定),ICW3的每一位对应于一片从8259A,即若有一片从8259A,则可令ICW3的S0=1,别的位全为0;若有两片从8259A,则可令S0=1,S1=1,别的位全为0。在中断响应周期,主8259A向数据总线输送CALL指令的操作码(在MCS-80/85系统中),然后由相应的从8259A输送入口地址的高8位(在8088/8086系统中,只输送一字节的中断向量)。,(2) 若是从8259A,则ICW3中只有低三位(D2D1D0)作为这个从8259A的标识符(ID),高5位全为0。在中断响应周期中,主8259A通过级连线输送申请中断源中优先权最高的中断源所在的从82
37、59A的标识符,每个从8259A拿这个标识符与自己编程时ICW3中所规定的标识符相比较,只有两者相符合的这片从8259A,能在下两个中断响应周期输送入口地址的低8位和高8位(对于8088/8086系统,只送一个字节的中断向量)。,ICW4的功用如图8-16所示。D0位PM,用于规定所用的微处理器。若PM=0,则规定8259A用于MCS-80/85系统中;若PM=1,则规定用于MCS-86系统中。D1位AEOI,规定结束中断的方式,若AEOI=1,则为自动结束中断方式。D2位M/S,它与D3位BUF配合使用,若BUF=1,选择为缓冲模式,则M/S=1确定为主8259A;若M/S=0,则为从825
38、9A。若BUF=0,则M/S位不起作用。D3位BUF,若BUF=1,则为缓冲模式,此时SP/EN变为允许输出线,同时由M/S确定是主还是从8259A。D4位SFNM,若SFNM=1,则规定为特殊的全嵌套模式。,2. 8259A的工作命令字在对8259A进行了初始化编程(输送了适当的初始化命令字)之后,芯片已作好了接收中断请求输入的准备。在8259A的工作期间可由工作命令字以规定其各种工作方式。8259A有三个工作命令字OCW(OCW1、OCW2和OCW3)。OCW1是中断屏蔽命令字,如图8-17所示。命令字的每一位,可以对相应的中断请求输入线进行屏蔽。OCW1的某一位为“1”,则相应的输入线被
39、屏蔽;若某一位为“0”,则相应的输入线的中断就允许。,OCW2的功用如图8-18所示。图中说明了R、SL、EOI三位的功用,它们的不同组合决定了几种不同的工作方式。在其中的三种工作方式中要用到OCW2的最低三位即L2、L1、L0,这3位二进制编码决定了 8个中断源的某一个被SEOI信号复位,或规定某一个的优先权最低。D4、D3为00是写入OCW2的标志。,OCW3的功用如图8-19所示。它的最低两位决定下一个操作是否为读操作(RR=1),以及是读中断请求寄存器IRR(若RIS=0),还是读中断服务寄存器ISR(若RIS=1)。D2位P,决定是查询命令(P=1),还是非查询命令(P=0)。D4、
40、D3位为01为写入OCW3的标志。D6、D5这两位决定是否工作于特殊屏蔽模式,当D6、D5为11时,则允许特殊屏蔽模式;而D6、D5为10时则撤除特殊屏蔽模式返回正常的屏蔽模式。若D6位ESMM=0,则D5位SMM不起作用。,8.5.6 8259A的工作方式,1. 查询方式当系统的中断源很多,超过了64个时,则8259A芯片可以工作在查询方式。此时,在8259A的编程中,使OCW3的D2位P置为1。程序中令CPU关中断,用查询方式对外设进行服务。在令OCW3的D2位P置为1后的下一个读命令,被8259A看作是中断响应信号,使最高优先权的ISR的相应位置位。读命令从数据总线上读取一个字节,其内容
41、为: 其中I=1,表示此片8259A有中断请求,I=0则无中断,可查询别的芯片。在I=1时,W2W0即为有中断请求的最高优先权源的编码。,2. 中断屏蔽8259A的8个中断请求线的每一条都可根据需要单独屏蔽,OCW1写入主屏蔽字寄存器,它的每一位可对相应的请求线实现屏蔽。在某些应用场合,可能要求能在软件的控制下动态地改变系统的优先权结构。也就是若CPU正处在中断服务过程中,希望能屏蔽一些较低优先权的中断源的中断,而允许一些优先权更低的中断源申请中断。,但是在通常的工作方式下,当较高优先权的中断源正处在中断服务的过程中,所有优先权较低的中断源的中断全给屏蔽了,达不到上述的要求。为此,8259A中
42、有一种特殊屏蔽模式。若在OCW3中的D6位ESMM=1,且D5位SMM=1,则使8259A工作在特殊的屏蔽模式。此时,由OCW1写入的屏蔽字中为“1”的这些位的中断被屏蔽,而为“0”的这些位的中断不管其优先权如何,在任何情况下都可以申请中断。若OCW3中的ESMM=1而SMM=0,则恢复为正常的屏蔽方式。,3. 缓冲模式当8259A在一个大的系统中使用,且8259A要求级连,则要求数据总线有总线驱动缓冲器,也就要求有一个缓冲器的允许信号。当编程规定使8259A工作在缓冲模式,则8259A送出一个允许信号SP/EN,每当8259A的数据总线输出是允许的,SP/EN输出变为有效。在缓冲器模式,必须
43、在初始化编程时规定此片8259A是主还是从。以上的工作方式是由ICW4决定的。,4. 中断嵌套模式在8259A中有两种中断嵌套模式: 全嵌套模式和特殊全嵌套模式。(1) 全嵌套模式当工作在全嵌套模式时,在初始化编程以后,中断优先权是固定的,且IR0优先权最高,IR7优先权最低(除非用优先权旋转的办法来改变)。当CPU响应中断时,申请中断的优先权最高的源在ISR中的相应位置位,而且把它的中断矢量送至数据总线。在此中断源的中断服务程序完成之前,与它同级或优先权更低的中断源的申请就被屏蔽,只有优先权比它高的源的中断申请才是允许的(当然CPU是否响应取决于CPU是否处在开中断状态)。,(2) 特殊全嵌
44、套模式若在一个大的系统中,8259A用在级连情况下,就需要采用特殊的全嵌套模式。在这种模式下与全嵌套模式的工作情况基本上是相同的,只有以下两点不同。 当某一个从8259A有中断请求,CPU响应以后,这个从8259A的中断并没有被屏蔽,即这个从8259A中优先权高于正在处理的源的中断申请仍可以产生(在全嵌套模式中这样的中断是被屏蔽的)。, 当某个中断源要退出中断服务程序前,用软件检查它是否是这个从8259A中的惟一的中断源。检查的办法是送一个非特殊中断结束(EOI)命令给这个从8259A,然后读它的ISR,检查它是否为0。若为0,则这个从8259A中的中断源是惟一的;否则就不是惟一的。只有在读回
45、的ISR为0时,再把另一个非特殊EOI命令送至主8259A,结束此片从8259A的中断。,5. 中断优先权旋转在实际应用中,中断源的优先权的情况是比较复杂的,不一定有明显的等级,而且优先权还有可能改变。所以,不能总是规定IR0优先权最高,而IR7优先权最低,而要能根据情况来改变。在8259A中有两种改变优先权的办法。,(1) 自动旋转在某些应用情况下,若干个中断源有相等的优先权。因此,当某一个中断源服务完以后,它的优先权应该变成最低的。这样,某个中断源的请求必须等待,在最坏情况下,必须等待其他7个源都服务一次以后才能再服务。下面用图8-20说明在这种工作模式下,优先权是如何改变的。在旋转以前,
46、若IR4和IR6同时有中断请求,而当时的优先权次序为IR0最高,IR7最低,如图8-20(a)所示。因此,就服务IR4的请求。而在IR4被服务以后,它的优先权变为最低的了(优先权的等级为7),而IR5就变为优先权等级最高的了(优先权的等级为0),如图8-20(b)所示。因而,接着就应该响应IR6的请求。这种工作模式,可由OCW2来规定。,(2) 特殊旋转方式上述的自动旋转方式,适用于设备的优先权相等的情况下。特殊旋转方式可用程序来改变优先权。可以用OCW2来设置最低优先权的源,则别的输入线的优先权也就相应固定了。例如设置IR5为最低优先权,则IR6的优先权就变为最高的了。在这种工作模式下,优先
47、权的设置是由OCW2决定的,可以用设置优先权命令,即R=1,SL=1,EOI=0,此时L2L0规定为最低优先权源的编码。优先权还可以在执行EOI命令时予以改变,这就要使OCW2中的R=1,S=1,EOI=1,同样L2L0为要改变为最低优先权源的编码。,6. 中断结束命令当某一个中断源的服务完成时,必须给8259A一个中断结束命令,使这个源在ISR中的相应位复位。在不同的工作情况下,8259A可以有几种不同的给出中断结束命令的方法。(1) 自动中断结束模式(AEOI)可以在ICW4中规定工作在这种模式,则在最后一个中断响应周期(对于MCS-86为第二个)的INTA信号的后沿8259A自动地使中断
48、源在ISR中的相应位复位。这种方式显然只能用于不要求中断嵌套的情况下。,(2) 非自动中断结束方式(EOI)在这种工作方式下,当中断服务完成从中断服务程序返回之前,必须输送中断结束(EOI)命令。若是工作在8259A级连的情况下,则必须送两个EOI命令,一个送给从8259A,另一个送给主8259A(若是在特殊嵌套模式下,在送了第一个EOI命令后,必须经过检查确定这一片从 8259A的所有申请中断的源都已经服务了,才向主8259A送出另一个EOI命令)。,EOI命令又有两种形式: 特殊的和非特殊的。当8259A是工作在全嵌套模式,则当服务过的源就是中断优先权最高的源,可以用非特殊EOI命令使它在ISR中的相应位复位。但是当工作在特殊的全嵌套模式时,8259A可能不能确定刚服务的源的等级,就要用特殊的EOI命令,此时OCW2中的L2L0就是在ISR中要复位的位的编码。但若这一位在特殊的屏蔽模式中由IMR的位屏蔽,则不能由特殊的EOI命令复位。两种EOI命令是由OCW2规定的。,