1、第6章 中 断教学提示:中断传送方式是最常用、比较及时和快速的输入输出控制方式。现在我们使用的不同种类的计算机和各种操作系统都支持中断处理。本章首先描述了中断传送的一般概念和原理,然后着重描述了8086中断处理的相关内容,最后比较详细地描述了8259A中断控制器的功能以及同微处理器的连接方法。教学目标:理解什么是中断,为什么要使用中断;什么是中断源。熟知响应中断的条件、中断的优先级、中断嵌套的概念以及中断的处理过程。深刻理解8086中断处理相关知识,包括可屏蔽和非屏蔽中断请求的区别;中断的屏蔽与开放;中断向量表;中断类型码;中断响应和处理过程。理解8259A的功能、内部结构与引脚信号含义;6种
2、操作方式及中断处理过程;各命令字含义及编程;掌握它在微型计算机中的连接方法。6.1 概 述 中断是计算机所具有的非常重要的功能,具有中断功能的CPU可以实现:(1)与外设同步工作。(2)实现实时处理。(3)故障处理。(4)在现代微型计算机中,使用中断机制可以实现多道程序和多重任务的自动切换。6.1.1 中断的基本概念所谓中断是指CPU在正常运行程序的过程中,CPU内部或外部出现某些事件、异常需要及时处理,导致CPU暂停正在执行的程序,转去执行处理该事件或异常对应的程序,并在处理完毕返回原程序处继续执行被暂停的程序,这一过程称为中断及中断处理。中断处理过程如图6.1所示。中断时,被打断执行的程序
3、中下一条被暂停执行的指令所在的地址称为断点。能够实现中断功能的硬件电路和相应软件,统称为中断系统。任何能够引发中断的事件称为中断源。常见的中断源有:一般的输入/输出外设,如键盘、打印机等;数据通道,如磁盘机、磁带机等;实时时钟,如定时器/计数器8253提供的定时信号等;故障源,如电源掉电、内存出错等;为调试程序设置的断点等。可以看出中断源的种类非常多,而中断系统为区别不同种类的中断源,一般采用若干位二进制编码进行区分,方法是为每个中断源分配一个不同的编码,称为中断类型码。图6.1 中断处理过程示意图继续执行断点主程序中断服务程序有中断请求中断处理返回断点6.1.2 中断处理过程从中断源向CPU
4、发出中断请求信号到CPU将这一请求处理完成的过程,叫中断处理过程。这一过程包括:中断请求、中断响应、中断处理和中断返回几个步骤。1.中断请求根据中断请求信号引入CPU内部中断处理逻辑部件的不同渠道,中断请求分为内部请求和外部请求,也称软件中断请求和硬件中断请求。软件中断请求在CPU内部由中断指令或程序出错直接引发中断;硬件中断请求必须通过专门的引脚引入中断请求信号。例如,8086/8088 CPU用INTR引脚和NMI引脚接收硬件可屏蔽和非屏蔽中断请求信号。2.中断响应对于可屏蔽的硬件中断请求,CPU执行程序的时候,在一条指令执行过程中检测判断有无中断请求信号。当CPU检测到中断请求信号,且内
5、部的中断允许触发器的状态为1,表示允许中断时,CPU在执行完现行指令后,发出INTA中断响应信号。图6.2所示为CPU内部产生中断响应信号的逻辑电路。从图6.2可以看出,一旦CPU发出中断响应信号,应立即清除中断请求信号,以避免同一个中断请求被CPU多次处理。从图中也可以看出,只有执行开中断指令后,才能够响应中断。当执行关中断指令后,就禁止了响应中断请求信号。开中断也称为允许中断,关中断也称为屏蔽中断或禁止中断。图6.2 CPU内部产生中断响应信号的逻辑电路图3.中断处理CPU一旦响应中断,立即进入中断处理过程。该过程实际上就是CPU中止正在运行的程序,转去执行引起该中断事件的程序,即中断处理
6、(服务)子程序。主要操作有:(1)关中断(2)保护断点(3)确定中断处理子程序入口地址(4)执行中断处理子程序 对现场的保护 对其他中断请求的处理 中断处理子程序的最后一条指令一定是中断返回指令 4.中断返回执行完中断处理子程序后,要返回到主程序的断点处,此过程称为中断返回。实际上就是在中断处理子程序中通过执行最后一条指令中断返回指令(如8086/8088的IRET指令)来实现的。中断返回指令的操作是保护断点的逆过程。6.1.3 中断优先级1.中断优先级当系统中有多个设备用中断方式与CPU进行数据交换时,由于各设备随时会向CPU提出中断请求,所以就避免不了有时会同时出现多个中断请求的情况。而此
7、时CPU只能按优先级别(也称优先权,是设计者根据引起中断事件的轻重缓急程度为每个中断源事先确定好的中断优先级别)的次序予以响应和处理,这个响应的次序称为中断优先级。不同级别的中断请求,常常遵循的处理原则是:(1)不同优先级的多个中断源同时发出中断请求时,应按优先级别由高到低次序响应并处理。实现中断优先级排队。(2)高优先级请求可以中断低优先级的中断处理程序,实现中断嵌套。如果正在处理高优先级中断,出现低优先级中断请求,可暂不响应。(3)中断处理时,出现同级别中断请求,应在当前中断处理结束后再处理新的请求。2.确定中断优先级1)软件查询法图6.3 软件查询法对应的硬件电路软件查询方法的流程图如图
8、6.4所示。图6.4 软件查询法程序流程图 对于图6.3所示电路,设中断请求寄存器端口号为40H,软件查询的程序段如下:IN AL,40H;读中断请求寄存器TEST AL,80H;判断电源故障请求?JNZ PWF;是,转处理电源故障中断处理子程序TEST AL,40H;判断磁盘请求?JNZ II2 ;是,转磁盘中断处理子程序 2)简单硬件电路排队法 常用的硬件优先级排队电路有菊花链电路、中断优先级编码电路等。下面简单介绍菊花链电路(p235)。6.1.4 中断嵌套 图6.6 中断嵌套示意图 在允许中断嵌套的系统中应注意:一般CPU响应中断请求后,硬件会自动关闭中断,这样,CPU在执行中断处理子
9、程序时将不能再响应其他任何中断请求。若要实现中断嵌套,应在进入低级别中断处理子程序之初设置一条开中断指令STI。6.2 8086/8088中断及中断处理基础 8086/8088CPU的中断类型码使用8位二进制数,范围为0255,可以处理256种不同类型的中断,CPU根据中断类型码来识别不同的中断源。8086/8088的中断源如图6.7所示。从图6.7可以看出这256个中断源可分为两大类:一类是外设接口的中断请求,由CPU的引脚引入,中断源来自CPU外部,故称外部中断(又称硬件中断);另一类在执行指令时引起,来自CPU的内部,故称内部中断(又称软件中断)。图6.7 8086/8088中断源6.2
10、.1 8086/8088的外部中断 8086/8088 CPU有两条外部中断请求引脚:NMI(非屏蔽中断)和INTR(可屏蔽中断)引脚。1.非屏蔽中断NMI2.可屏蔽中断INTR6.2.2 8086/8088的内部中断1.内部中断(软件中断)1)除法错误中断 当CPU执行除法指令(DIV/IDIV)时,若除数为0或所得的商超过了寄存器所能表示的范围,则立即产生一个除法错误中断。该中断是类型码为0的内部中断,CPU响应中断后转去执行除法错误中断处理子程序。2)溢出中断INTO CPU进行带符号数的算术运算时,若发生了溢出,则标志位OF=1,如果此时执行INTO指令,会产生溢出中断。若OF=0,执
11、行INTO指令不产生中断,CPU继续执行下一条指令。INTO指令通常安排在算术指令之后,以便在溢出时能及时处理。例如:ADD BX,CX INTO;测试加法是否溢出,其中断类型码为43)单步执行中断(单步中断)当TF=1时,每执行一条指令,CPU会自动产生一个单步中断。单步中断处理子程序显示各个寄存器及使用的存储单元内容,以便分析单条指令执行的结果。单步中断又称为陷阱中断,主要用于程序调试。此中断类型码为1。4)INT n中断指令引起的中断中断指令的操作数n就是中断类型码。CPU执行INT n指令后,会立即产生一个类型码为n的中断,转入相应的中断处理子程序。5)断点中断断点电中断即INT 3指
12、令引起的中断,中段类型码为3,一般在调试程序中设置断点可使用本指令实现。程序执行到本指令停下转入中断处理子程序,显示相关寄存器和内存单元的值。2.内部中断的特点内部中断具有如下特点:1)所有内部中断的中断类型码及相应优先级均由系统确定,如表6.1所示(p239)。前三种内部中断优先级均高于外部中断,外部中断中NMI级别高于INTR,只有单步执行中断优先级最低且低于外中断。2)除单步执行中断外,其它内部中断均无法禁止。单步执行中断用TF位禁止,当标志寄存器中TF=0时,禁止。3)由于中断类型码已确定,所以不用执行中断响应周期取中断类型码。4)由于内部中断均处于程序的固定位置处,所以无随机性。6.
13、2.3 中断向量表8086/8088最多可以处理256个中断,在中断管理系统中,可以响应多少个中断就应该有多少个中断处理子程序与之对应。为统一管理这些存放在内存不同区域的中断处理子程序,8086/8088将这些中断处理子程序的入口地址统一存放在内存的一个固定区域。图6.8 8086/8088的中断向量表 由图6.8可看出,中断处理子程序入口地址在中断向量表中是按中断类型码顺序存放的,因此每个中断处理子程序入口地址在中断向量表中的位置可由“中断类型码4”计算出来。例如,若中断类型码n=40H,则其中断向量放在中断向量表0:0100H开始的连续4个单元中,若物理地址00100H、00101H、00
14、102H、00103H这4个连续的单元中存放的数据分别是00H、20H、00H、10H,则对应中断处理子程序入口地址为1000H:2000H。在8086/8088的中断向量表中:有5个专用中断(中断类型码为04),它们的用途已经确定;27个系统保留的中断(中断类型码为531)供系统使用,不允许用户自行定义;224个用户自定义中断(中断类型码为32255),这些中断类型码可供软件中断INT n或可屏蔽中断INTR使用。注意其中有些中断类型码已经有了固定用途,例如,中断类型码21H的中断已用作DOS的系统功能调用,用户选择中断类型码时必须避开。由用户确定了中断类型码后,还应先将相应的中断处理子程序
15、入口地址填入中断向量表,以便CPU根据提供的中断类型码找到相应的中断向量。其方法有两种:1.直接装入法 用传送指令直接将中断处理子程序首地址装入中断向量表中。设中断类型码为40(此类型码对应的向量表地址为从000A0H开始的4个连续存储单元)。程序段如下:PUSH DSXOR AX,AXMOV DS,AXMOV AX,OFFSET INT40 ;取中断处理子程序偏移地址MOV 00A0H,AX;设置中断处理子程序偏移地址MOV AX,SEG INT40;取中断处理子程序段地址MOV 00A0H+2,AX;设置中断处理子程序所在代码段的段地址 POP DS2.DOS系统功能调用法(1)利用DOS
16、系统功能调用的25H子功能,可以把中断向量放入中断向量表中相应的位置,方法是将DOS调用入口参数置成:子功能号:(AH)=25H入口参数:(AL)=中断类型码,INT40H为中断处理子程序的标号(DS)=中断处理子程序入口地址的段地址(DX)=中断处理子程序入口地址的偏移地址 下面程序段是完成中断类型码为40H的入口地址的设置:PUSHDS;保护DSMOV DX,OFFSET INT40H ;取中断处理子程序偏移地址MOV AX,SEG INT40H ;取中断处理子程序段地址MOV DS,AXMOV AH,25H ;送子功能号MOV AL,40H ;送中断类型码INT 21H ;DOS功能调用
17、POPDS ;恢复DS(2)利用DOS系统功能调用的35H子功能,能够把AL中的中断类型码所对应的中断向量表中的中断向量,取到ES:BX中。ES为段地址,BX为偏移地址。方法是将DOS调用入口参数设置成:子功能号:(AH)=35H入口参数:(AL)=中断类型码执行:INT 21H返回参数:ES:BX=中断类型码对应的中断向量(中断处理子程序的段地址、偏移地址)程序为:MOV AL,N ;N为中断类型码0255MOV AH,35H ;子功能号INT 21H ;返回时中断向量在ES:BX中6.2.4 8086/8088的中断处理过程 图6.9(p242)表示8086/8088CPU中断处理的基本过
18、程。由图6.9可以看出,CPU在每条指令的最后一个机器周期的最后一个T状态,均按顺序采样中断请求信号。首先采样的是内部中断,由此可见其中断优先级最高,其次采样NMI,INTR和TF。对这几种中断的处理过程基本类似,所不同的是获取中断类型码的方法不同。对于软件中断和非屏蔽中断,其中断类型码由系统设定。对于可屏蔽中断,其中断类型码由发出INTR请求的8259A提供。在8086/8088系统中,CPU对可屏蔽中断的响应处理要经过以下几步:(1)执行2个中断响应总线周期,取得中断类型码。当CPU响应INTR引脚上的中断请求后,在2个总线周期的T2T4状态分别输出2个负脉冲,在第2个总线周期的T2T4状
19、态内,CPU在低8位数据总线上获得8259A送来的中断类型码。(2)执行一个总线写周期将标志寄存器FLAG的值压栈。(3)将TF送入TEMP。(4)设置IF=0,TF=0,即关中断和禁止单步中断。(5)执行两个总线写周期,将断点处的段地址CS和偏移地址IP的内容压栈保护。(6)执行两个总线读周期,将中断向量前两个字节即中断处理子程序偏移地址和后两个字节段地址的内容分别送入IP和CS寄存器,调用中断处理子程序。在图6.9所示的流程中,(1)(6)是CPU的内部处理,由硬件自动完成。对于非屏蔽中断和软件中断不需要第一步,只需从第二步开始。中断处理子程序的一般结构如图6.10所示。图6.10 中断处
20、理子程序的一般结构关中断保护现场开中断中断服务恢复现场中断返回 如前所述,若该中断处理允许被更高级别的中断源中断,则需加入开中断指令。中断处理子程序的最后一条指令一定是中断返回指令,以保证断点的恢复。用户在设计中断处理子程序时要预先确定一个中断类型码,不论是采用软件中断还是硬件中断,其类型码都只能在系统预留给用户的类型码中选择。6.3 可编程中断控制器Intel 8259A6.3.1 Intel 8259A功能、内部结构与引脚信号1.功能 (1)具有8级中断优先级控制,若采用级联方式,最多可管理64级中断。(2)对每一个中断请求均有屏蔽功能;在中断响应期间,可提供中断类型码。(3)8259A是
21、可编程器件,可以根据需要通过编程随时对所具有的多种中断管理方式,进行设置或重新组织。2.8259A的内部结构 图6.11所示为8259A的内部结构图,其基本组成是由:中断请求寄存器IRR;中断服务寄存器ISR;优先权判别器PR;中断屏蔽寄存器IMR;数据总线缓冲器;读/写控制逻辑;控制逻辑及级联缓冲/比较器构成。图6.11 8259A内部结构框图 1)中断请求寄存器 中断请求寄存器IRR(Interrupt Request Register),由一个8位锁存器构成,接收并锁存来自引脚IR7IR0上的中断请求信号,当IR7IR0某一引脚上出现有效中断请求信号时,IRR对应位被置1,该锁存器可被C
22、PU读取。2)中断屏蔽寄存器 中断屏蔽寄存器IMR(Interrupt Mask Register)由一个8位寄存器组成。若IRR中记录的各个中断请求有任何一个需要屏蔽,只要将IMR的相应位置1即可,未被屏蔽的中断请求允许进入优先权电路。中断屏蔽寄存器通过编程进行设置。3)中断服务寄存器 中断服务寄存器ISR(In-Service Register),是一个8位寄存器,通过8位二进制数的值记录当前正在处理的中断请求。例如,当ISR的D3=1时,表示CPU正在处理来自IR3引脚的中断请求。ISR的置位是在相应引脚的中断请求被响应时,由8259A的控制逻辑设置。相应位被清零,表示中断处理结束。清零
23、动作的发生时间及方式可通过编程设置。4)优先权判别器 优先权判别器电路用于识别和管理各个中断请求信号的优先级别,当有多个中断请求信号同时申请时,优先权电路根据编程设置的优先权管理方式,选择IRR中优先级最高者,在CPU响应中断时将ISR中相应位置1。若某中断请求正在被处理时,又有新的中断请求,则由优先权电路将新进入的中断请求的优先级和当前正在处理的中断的优先级进行比较。若比较结果是新的中断请求比正在处理的优先级高,则正在处理的中断程序自动被中断,由优先权电路通过控制逻辑向CPU发出中断请求INT信号,CPU处理级别高的中断请求,形成中断嵌套。5)数据总线缓冲器数据总线缓冲器是一个8位双向三态缓
24、冲器,是8259A与系统之间传送信息的数据通道。它与数据总线相连,可以接收CPU发来的命令字,也可以向CPU发送中断类型码,或由CPU读取相关信息。6)读/写控制逻辑 读/写控制逻辑的功能是,根据CPU的读写命令确定数据总线缓冲器中数据的传输方向,同时根据片选信号-CS和A0选择内部与CPU进行数据交换的各命令字寄存器。当CPU发读信号时,将选中寄存器的内容送到数据总线上;当CPU发写信号时,将CPU发来的命令字送入指定的命令字寄存器。7)控制逻辑 8259A的控制逻辑部分,主要包括了一组初始化命令字寄存器和一组操作命令字寄存器。其主要作用是确定8259A的工作方式,并按照编程设定的工作方式管
25、理8259A的全部工作;同时还负责根据IRR、IMR及优先权电路的状态,通过INT引脚向CPU INTR引脚发出中断请求信号;CPU收到8259A的中断请求信号后,进入中断处理流程。过程如下:(1)当CPU从INTR引脚收到中断请求信号后,若IF=1,则CPU完成当前指令后,响应中断,执行两个中断响应总线周期,每个总线周期都在-INTA引脚上发出一个负脉冲,负脉冲宽度为两个时钟周期。(2)8259A的控制逻辑在收到第一个负脉冲后,使IRR锁存功能失效,不再接收IR7IR0上的中断请求信号(直到第二个负脉冲结束后,IRR锁存功能才有效),并清除IRR的相应位。使ISR的对应位置1,以便优先权判别
26、器为以后的中断请求裁决提供依据。(3)收到第二个负脉冲后,8259A把当前中断的中断类型码送到D7D0,CPU根据此类型码进入相应的中断处理子程序。(4)在中断处理子程序结束时,CPU应向8259A发中断结束命令,该命令将ISR寄存器的相应位清0,中断处理结束。8)级联缓冲/比较器 级联缓冲/比较器用来存放和比较在级联系统中用到的所有8259A的级联地址。当系统需要扩展而采用级联方式时,级联缓冲/比较器的三个引脚CAS0、CAS1和CAS2的意义不同。做为主片的8259A这三个引脚为输出端,发送从片的级联地址,用于表示哪1个从片的中断请求被响应;作为从片的8259A,这三个引脚是输入端,用于接
27、收主片送来的片选代码。例如,1个从片的INT端连接到主片的IR2端,当从片的中断请求通过主片送到CPU,CPU响应发出第1个负脉冲时,主片CAS2、CAS1、CAS0输出二进制数010,表示连接到IR2引脚上的从片中断请求被响应。3.8259A引脚信号含义图6.12 8259A引脚图 (1)IR7IR0:中断请求信号输入引脚,引入外设接口电路或其他8259A(从片)向8259A发出的中断请求信号。IRn的触发方式有边沿触发和电平触发方式,通过编程设定。(2)D7D0:双向、三态数据线,与系统数据总线的D7D0相连,用来传送命令字、某些寄存器内容和中断类型码等。(3)-WR:写信号,输入,低电平
28、有效。通知8259A接收CPU从数据总线上送来的命令字。(4)-RD:读信号,输入,低电平有效。用于CPU读取8259A中某些寄存器的内容(如IMR、ISR或IRR等)。-WR和-RD均控制数据总线缓冲器中数据的传输方向。(5)INT:8259A向CPU发出的中断请求信号,高电平有效。该引脚连接CPU的INTR端。在级联方式下,从片INT输出连接到主片中断请求信号输入引脚IRn上。(6)-INTA:中断响应信号,输入,低电平有效。接收CPU发来的中断响应信号,并在第二个负脉冲期间,8259A将中断类型码送到数据总线上。(7)-CS:片选信号,输入,低电平有效。由地址译码器对高位地址译码后产生。
29、只有该信号有效时,CPU才能对8259A进行读/写操作。(8)A0:地址输入信号,用于对8259A内部寄存器端口的寻址,与地址总线的A0或A1相连。每片8259A对应两个端口地址,一个为偶地址,一个为奇地址,且偶地址小于奇地址。在与8088连接时,可直接将该引脚与地址总线的A0连接;与8086连接时要注意,因为8259A只有8位数据线,8086有16位,8086与8259A的所有数据传送都用16位数据总线的低8位进行,而8086CPU在传输数据时只有偶地址端口的数据通过低8位数据总线输入输出,所以为保证所有传送都用总线的低8位,最简单的方法是将8086地址总线的A1和8259A的A0端相连,这
30、样就可以用两个相邻的偶地址作为8259A的端口地址,从而保证用数据总线的低8位与8259A交换数据。6.3.2 8259A的操作方式和中断处理过程1.中断优先级管理方式 1)完全嵌套方式 完全嵌套方式也称固定优先级方式。在这种方式下,由IRn引脚引入的中断请求信号具有固定的优先级,规定IR0最高,IR7最低。在对8259A初始化后若没有设置其他优先级管理方式,则默认为完全嵌套方式。在完全嵌套方式下,当一个中断请求被响应时,ISR中的对应位ISn被置1。除中断自动结束方式外,在CPU发出中断结束命令EOI前,此位一直保持为1,以封锁同级或低级的中断请求,但允许响应级别高的中断请求,以实现中断嵌套
31、。2)特殊全嵌套方式 特殊全嵌套方式与完全嵌套方式基本类似,区别在于允许同级的中断请求进入。3)优先级自动循环方式 采用优先级自动循环方式,各中断源优先级是循环变化的,具有大体相同的优先级。当一个中断源的中断服务完成后,其优先级自动降为最低,而将最高优先级赋予与之相邻的低一级的中断请求源。此方式主要用在系统中各中断源优先级相同的情况下。开始时,优先级队列次序是IR0IR7(IR0最高,IR7最低);若此时出现了IR3请求,响应IR3并处理完成后,优先级队列变为IR4IR7、IR0、IR1、IR2、IR3(最低)。4)优先级特殊循环方式 该方式与优先级自动循环方式相比,主要区别是可以通过编程设置
32、开始的最低优先级。例如,最初设定IR2为最低优先级,那么IR3就是最高优先级,而优先级自动循环方式中,最初的最高优先级一定是IR0。2.中断屏蔽方式 8259A可对8个中断请求引脚上引入的中断请求信号,根据需要通过编程写入相应的屏蔽字分别进行屏蔽。具体屏蔽方式有以下两种。1)普通屏蔽方式 普通屏蔽方式是通过对中断屏蔽寄存器(IMR)的设定,实现对中断请求的屏蔽。中断屏蔽寄存器的每一位对应一个中断请求。当某一位为1时,与之相对应的中断请求被屏蔽。为0时,开放 2)特殊屏蔽方式 特殊屏蔽方式是当一个优先级较高的中断请求正在被处理时,若设置了特殊屏蔽方式,在进入中断处理子程序后,用操作命令字OCW1
33、,将屏蔽寄存器中本级中断的对应位置1,使本级中断受到屏蔽,同时8259A自动清除中断服务寄存器ISR中本级中断对应位,使优先级较低的中断请求也被开放,能够通过8259A向CPU请求中断。3.中断结束方式 所谓中断结束(End Of Interrupt,EOI),就是将正在被处理或处理即将完成的中断请求在ISR中的相应位清0,具体有以下两种方法。1)自动结束方式(AEOI)自动结束方式在第二个-INTA负脉冲的后沿将对应的ISR位清0。2)非自动结束方式 在非自动结束方式下,从中断程序返回前,需通过程序向8259A输出一个中断结束命令(EOI),将ISR中的相应位清0。具体方法有以下两种:(1)
34、一般结束方式。此方式由8259A自动选择ISR中优先权最高位清0。此方式常用于完全嵌套方式下的中断结束。(2)特殊结束方式。此方式需由用户指明将ISR中的哪一位清0,常用于特殊全嵌套方式。在级联系统中均采用一般结束方式或特殊结束方式。在中断处理程序结束时,必须发两次中断结束命令,一次发给主片,另一次发给从片。4.中断触发方式 中断触发方式指的是IRn引脚上的信号在什么状态下作为有效信号。8259A有两种状态可供选择。1)电平触发方式 设置为电平触发方式时,当IRn引脚上出现高电平时,作为中断请求信号。请求一旦被响应,该高电平信号应及时撤除,否则会引发第二次中断。2)边沿触发方式 边沿触发方式以
35、IRn引脚上出现由低电平向高电平的跳变作为中断请求信号,跳变后高电平要一直保持,直到被响应。5.查询方式 当CPU的IF位为0时,禁止响应外部的可屏蔽中断请求。当8259A向CPU发中断请求信号INT时,CPU不响应。由于外设仍然向8259A发中断请求信号,要求CPU服务,此时CPU可通过用软件查询的方法来确认中断源,从而实现对外设的服务。基本过程如下:1)CPU首先向8259A发查询命令字。2)紧接着执行一条输入指令,从8259A的偶地址端口读出一字节的查询字。查询字格式为:IxxxxW2W1W0。3)CPU读入查询字后,判断其最高位I,若最高位为I=1,说明8259A的IRn已有中断请求输
36、入,此时该查询字的最低三位W2W1W0组成的代码,表示了当前有一个或多个中断请求中的最高优先级对应的IRn的编号,CPU据此转入相应的中断处理子程序。6.与系统总线的连接方式 1)缓冲方式 为减轻系统总线负担,在多片8259A级联的大系统中一般采用缓冲方式。在缓冲方式下,8259A通过总线收发器和数据总线相连。8259A的-SP/-EN作为输出端,-EN有效,使总线收发器使能。2)非缓冲方式 非缓冲方式主要用于单片8259A或片数不多的8259A级联的系统中。在该方式下,8259A直接与数据总线相连,8259A的-SP/-EN作为输入端,-SP有效。只有单片8259A时,-SP/-EN端必须接
37、高电平;有多片8259A时,该引脚用于区分主从芯片。-SP/-EN端接高电平则表示该8259A为主片;接低电平,则表示该8259A为从片。7.8259A中断处理过程 8259A完成一次中断响应的过程如下:(1)当外设向8259A中断请求引脚上发送中断请求信号时,中断请求寄存器IRR中的相应位置位,并将信号锁存在IRR中。(2)IRR中的内容与中断屏蔽寄存器IMR中的对应位进行比较,如果该请求信号未被屏蔽,则信号被送入优先权比较电路(判别器)。(3)优先权比较电路根据送来的信号,确定优先级最高者以后,通过控制逻辑向CPU发出中断请求信号INT。(4)当CPU接收到8259A传入的INT信号时,I
38、F=1时进入中断响应周期,发出两个连续的 -INTA信号到8259A的-INTA引脚上。(5)8259A在接到第一个-INTA信号后,禁止接收IR0IR7的中断请求,直到第二个-INTA结束;使ISR相应位置位,并清除相应的IRR位。(6)8259A在第2个-INTA负脉冲到来时,将该中断请求的中断类型码送到数据总线D7D0。(7)根据所设置的不同的结束方式,将ISR相应位清0。至此完成1个中断请求的处理过程。6.3.3 8259A的编程 8259A是可编程的中断控制器,使用前要根据要求和硬件连接方式对其进行初始化。此后在工作过程中,其初始化编程所设置的状态保持不变。但可以根据实际情况动态地对
39、相关的中断操作进行编程,以达到随时控制中断处理的目的。所以,对于8259A,有两组命令字初始化命令字ICW(Initialization Command Words)和操作命令字OCW(Operation Command Words)。相应地,CPU可写入两组7个命令字到7个对应的寄存器,分别是保存ICW的ICWR1ICWR4和OCW的OCWR1OCWR3寄存器。1.初始化命令字及其编程 8259A使用前必须对其进行初始化编程,以确定基本操作方式。初始化编程设置通过4个初始化命令字ICW1ICW4来完成。1)初始化命令字 (1)ICW1主要用于设置操作方式,其格式如图6.13所示。图6.13
40、ICW1命令字格式(2)ICW2用于设置中断类型码,此命令字应紧跟ICW1写入A0=1的端口,即奇地址端口,其格式如图6.14所示。图6.14 ICW2命令字格式在8086/8088系统中,ICW2的D7D3位设置中断类型码的高5位,低3位D2D0的内容由8259A根据申请中断请求引脚IR7IR0进行编码,自动填入000111范围内的3位二进制数,与高5位一同构成8位中断类型码。例如:若ICW2的高5位D7D3=10011,则对应IR0IR7申请中断请求的相应中断类型码分别为98H、99H、9AH、9BH、9CH、9DH、9EH和9FH。(3)ICW3用作级联方式下主、从芯片的初始化命令字,只
41、有在ICW1的SNGL=0表示系统中包含多片8259A时才需设置ICW3,并写入奇地址端口,格式如图6.15所示。图6.15 ICW3命令字格式对主片和从片ICW3需分别设置:对于主片,当IR7IR0引脚上接有从片时,S7 S0相应位就置1。例如,若主片ICW3的内容为05H(00000101B)时,说明主片的IR0、IR2上连有从片。对于从片,ICW3的D7D3位不用,可置0;用D2D0位的编码表示本从片与主片的对应引脚的连接情况。例如,若某从片ICW3的内容为05H,说明该从片的INT引脚与主片的IR5相连。(4)ICW4也叫方式控制初始化命令字,用于设置8259A的工作方式,当ICW1的
42、IC4位为1时,才设置ICW4,写入A0=1即奇地址端口,格式如图6.16所示。图6.16 ICW4的作用 2)初始化编程 初始化编程是在系统加电之初进行的,由于8259A内部有7个命令字需设置,而只有两个端口地址,所以在编程过程中,命令字从两个端口地址写入,可以按以下原则进行端口的寻址:(1)必须按照确定顺序,对寄存器进行设置。(2)在命令字中,设置特征位。初始化设置就采用这两种方法,使得4个命令字从两个端口地址写入。其初始化顺序如图6.17所示。当系统加电后,向8259A偶地址端口中写入一个D4=1的命令字(ICW1),表示8259A进入初始化编程。紧跟ICW1,立即向奇地址端口中写入IC
43、W2、ICW3(若ICW1的D1=0)和ICW4(若ICW1的D0=1)。8259A无论与8086/8088还是8080/8085芯片配合工作,初始化都必须发送ICW1和ICW2,只有在ICW1中指明需要ICW3和ICW4以后,才发送ICW3和ICW4。一旦初始化以后,若要改变某一个ICWn寄存器中的内容,则必须重新进行初始化编程,不能只写入单独的一个ICWn初始化命令字。图6.17 8259A初始化顺序 例如,在PC/AT机中8259A采用两片级联方式,主片设定为:上升沿触发、在IR2引脚连接从片、需写入ICW4、非自动结束方式、中断类型码应设为08H0FH、采用完全嵌套方式、主片8259A
44、端口地址是20H、21H;从片定义为:上升沿触发、级联到主片的IR2引脚、需设置ICW4、非自动结束方式、中断类型码为70H77H、采用完全嵌套方式、从片8259A端口地址是A0H、A1H。初始化过程如下:初始化主片:MOV AL,11H ;置ICW1,上升沿触发、多片级联、写ICW4OUT 20H,AL MOV AL,08H;置ICW2,设置中断类型码的高5位 OUT 21H,AL MOV AL,04H;置ICW3,主片IR2引脚接从片 OUT 21H,AL MOV AL,01H ;置ICW4,完全嵌套、非缓冲、一般EOI、8086 OUT 21H,AL 初始化从片:MOV AL,11H ;
45、置ICW1,上升沿触发、多片级联、写ICW4OUT 0A0H,ALMOV AL,70H;置ICW2,设置中断类型码的高5位OUT 0A1H,ALMOV AL,02H;置ICW3,从片标识码,;从片INT引脚连接到主片IR2引脚OUT 0A1H,ALMOV AL,01H ;置ICW4,完全嵌套、非缓冲、一般EOI、8086OUT 0A1H,AL 2.操作命令字及其编程 1)操作命令字 系统初始化完成以后,8259A进入正常工作状态时,可以在应用程序中随时通过对8259A的操作命令字进行编程,改变8259A的工作方式或读出8259A内部寄存器的内容。8259A的操作命令字有OCW1、OCW2和OC
46、W3。其写入过程与初始化命令字不同,可以不按顺序。8259A是通过不同的端口地址及特征位对这三个操作命令字加以区分的。(1)OCW1的功能是设置和清除中断屏蔽寄存器IMR的相应位,用于设定对8259A输入引脚IR7 IR0的屏蔽状态。OCW1需写入A0=1即奇地址端口,格式如图6.18所示。图6.18 OCW1命令字格式 (2)OCW2是常用的命令字,主要用于设置优先级循环方式和中断结束方式,OCW2需向A0=0即偶地址端口写入,格式如图6.19所示。图6.19 OCW2命令字格式 中断结束命令是一个常用的命令。PC机上8259A端口地址为20H和21H,以下指令能够发出非自动结束方式中的一般
47、结束方式的结束命令:MOV AL,20H OUT 20H,AL (3)OCW3主要用于设置和撤消特殊屏蔽方式、设置中断查询方式以及发出对8259A内部寄存器的读出命令。OCW3写入A0=0即偶地址端口,格式如图6.20所示。图6.20 OCW3命令字格式 D4和D3位是特征位,当向偶地址写入的命令字中D4D3=01时,表示写入的是OCW3。D7:无关位,可设为任意值。D6:ESMM,设置保持屏蔽方式命令字。ESMM=1时SMM位才有意义。根据SMM位设置屏蔽方式;ESMM=0,保持原来设置的屏蔽方式。D5:SMM,特殊屏蔽方式设置位。与ESMM配合使用,SMM=1,表示设置特殊屏蔽方式;SMM
48、=0,表示清除特殊屏蔽方式。D2:P,查询命令位,D2=1时表示该OCW3用作查询命令,可以通过软件查询方式获得中断请求的编号。具体方法是:8086/8088标志寄存器中IF设为0,关闭中断。用输出指令将OCW3写入8259A,随后读8259A,8259A即可将一个查询字送到数据总线上(查询命令字见6.3.2)。D2为0表示非查询方式。D1D0:RR、RIS,读8259A状态功能位。这两位的组合确定对中断请求寄存器(IRR)还是对中断服务寄存器(ISR)内容的读出。D1D0=10时,表明下一个对偶地址端口的读信号读出的内容是IRR的值;D1D0=11时,下一个对偶地址端口的读信号读出ISR的值
49、。D1=0,这两位无意义。这两位的使用在D2(P)=0时起作用。2)8259A的读操作编程 通过读操作,可将8259A内部的寄存器内容读出。8259A常用的读操作有如下几种(假设8259A的端口地址为20H和21H):(1)读出IRR的值。即先向20H端口写OCW3=0AH(RR=1、RIS=0),再读20H端口,程序如下:MOVAL,0AH;OCW3=0AH,读IRR OUT 20H,AL;OCW3写入8259A IN AL,20H ;读出IRR 内容 (2)读出ISR的值。即先向20H端口写OCW3=0BH(RR=1、RIS=1),再读20H端口,程序如下:MOVAL,0BH;OCW3=0
50、BH,读ISR OUT20H,AL;OCW3写入8259A IN AL,20H;读出ISR 内容 (3)读IMR的值。随时可用奇地址读IMR的值,并可对其作出修改。如开放IR3、IR5引脚中断请求,保持其余引脚状态不变,程序如下:IN AL,21H;读IMR AND AL,D7H;开放IR3、IR5 中断 OUT 21H,AL;修改IMR 若屏蔽IR3和IR4引脚中断请求,保持其余引脚状态不变,程序如下:IN AL,21H;读IMR OR AL,18H;屏蔽IR3、IR4中断 OUT 21H,AL;修改IMR (4)读查询字(根据查询状态字,可读出最高级别的中断请求IRn):先向20H端口写O