1.13k likes | 1.25k Views
第五章. 中断系统. 5.1 中断的基本概念 5.2 8086/8088的中断系统 5.3 可编程中断控制器8259 A. 5.1 中断的基本概念. 随着计算机技术的发展,尤其是 CPU 速度的迅速提高,对计算机内部机制的要求愈来愈高。希望计算机能随时发现系统中的各种错误并自动处理;对意想不到的事件能及时地响应并妥善处理;在低速的外部设备和主机交换信息时,主机高速运算的性能能很好地发挥,所以中断是提高计算机工作效率的一种重要技术。. 5.1.1 基本概念. 1、 中断与中断源 。
E N D
第五章 中断系统
5.1 中断的基本概念 5.2 8086/8088的中断系统 5.3 可编程中断控制器8259A
5.1 中断的基本概念 随着计算机技术的发展,尤其是CPU速度的迅速提高,对计算机内部机制的要求愈来愈高。希望计算机能随时发现系统中的各种错误并自动处理;对意想不到的事件能及时地响应并妥善处理;在低速的外部设备和主机交换信息时,主机高速运算的性能能很好地发挥,所以中断是提高计算机工作效率的一种重要技术。
5.1.1 基本概念 1、中断与中断源。 中断是一个“过程”。这个过程,由微处理器内外部硬件或软中断指令引起,即由它们发出中断请求,CPU接到中断请求后暂时中止现行程序的执行,转去执行请求中断的那个外设或事件的中断处理子程序,待中断服务子程序处理完毕后,再返回到暂停处继续执行原来的程序,也就是说,中断就是CPU在执行当前程序的过程中,由于意外的事件输入另一段程序的运行。
2、中断系统。 能实现中断过程的软硬件系统叫中断系统。中断系统应具有以下功能。 (1)能实现中断响应、中断服务和中断返回。 (2)能实现中断优先权排队。 (3)能实现中断嵌套。
5.1.2中断处理过程 各种微型计算机的中断系统都不一样,然而其实现中断的过程是相同的。一个完整的中断处理过程包括四个阶段:中断请求、中断响应、中断服务(处理)和中断返回。如图5.1所示。
保护现场 执行指令 否 中断服务 指令结束否? 恢复现场 中断请求吗? 开中断 响应中断 返回 关中断 取下一条指令 图5.1 中断处理过程
中断处理过程是硬件和软件编程相结合的处理过程,有些是通过硬件完成的,有的是编写程序实现的。 1、中断请求 外部设备需要CPU为其服务时,首先向CPU发“中断请求”信号。发出中断请求信号必须满足下列条件。 (1)请求中断的外设应通过接口电路在CPU的中断请求输入引腿上输入一个符合规定的请求信号,该信号可以是电平或边沿信号。
(2)外设处于就绪状态。如输出设备准备好接收CPU的数据时,才能向CPU发出中断请求。 (3)该中断源未被屏蔽,通常每个中断源设置有一个中断允许触发器,用来开放或禁止该设备的中断请求,中断允许触发器被置位时,表示允许发出中断申请。中断允许触发器的置位或复位状态,由软件设置(管理)。 2、中断响应 在中断响应周期内CPU通过内部硬件自动完成三件事:
(1)关中断。 (2)保护断点和标志寄存器内容。 (3)形成中断服务程序的入口地址。 所以,CPU响应中断是有条件的 8086 /8088响应外部中断请求的条件是:(1)现行指令周期内无总线请求。 (2)中断允许触发器标志IF=1。 (3)现行指令执行完毕。 3、中断处理 CPU响应中断,执行中断服务程序。要顺序完成以下几步工作。
(1)保护现场 (2)开中断 (3)查找中断源转向相应的中断服务程序。 (4)关闭中断 (5)恢复现场 (6)开中断 4、中断返回 中断服务程序的最后一条指令必须是“中断返回”指令,CPU执行中断返回指令时,自动将保存在现行堆栈中的标志寄存器内容和断点地址弹出,使程序回到中断前的地址继续执行,即CPU从中断服务程序返回而继续执行被中止的主程序。
5.1.3 中断识别和中断优先级 实际系统中,常常会出现多个中断源同时提出中断请求,或者在尚未处理完一个中断时又有一个新的中断请求提出。然而CPU每次只能响应一个中断源的请求,所以,CPU必须确定首先为哪一个中断源服务,以及服务次序。解决的方法是按中断源中断请求的轻重缓急,安排一个中断处理的优先次序,即优先级(priority)首先响应优先权级别高的中断请求。
1、中断优先级排队 微型计算机系统中,对多个中断源进行识别和优先级排队的目的是要寻找出优先级最高的中断源,并形成该中断源的中断服务程序的入口地址,以便CPU将控制转移到该中断服务程序。 系统中CPU识别中断源及比较其优先级是同时解决的,称为中断优先级排队。 CPU实现中断优先级排队有两种方法:查询中断和矢量断。
(1)查询中断 查询中断或叫程序查询方式,就是在CPU响应中断后,通过简单硬件接口电路中断识别程序查询连接到系统上的每个设备。确定哪些外设提出中断请求,是按事先确定的优先级别确定查询的先后顺序,最先被查询的优先级别最高。查询过程如图5.2所示。
INT …… …… 电源故障 硬盘 打印机 软 盘 图5.2 (a)软件查询接口
中断服务程序入口 保护现场 读中断请求 IR0请求? 0#中断服务程序 IR1请求? 1#中断服务程序 IR7请求? 7#中断服务程序 恢复现场 中断返回 图5.2(b) 软件查询式中断流程图
软件查询过程中,各外设的中断申请信号寄存在中断请求寄存器中,通过或门送到CPU的中断请求引腿INT,所有中断请求状态位组成一个端口,任一外设有中断请求时,CPU响应中断后进入查询程序,读取端口内容,对端口寄存器的内容进行逐位查询,查到哪个外设有中断申请,就转到相应的中断服务程序。查询程序的查询顺序,决定了外设中断优先的级别。 软件查询中断优先级方法的优点是硬件简单、改变程序中的查询次序就可改变外设的中断优先级而不必变更硬件连接。主要缺点是速度慢,实时性差,特别是当中断源较多时,而请求中断的外设的级别较低时尤为突出。此外软件查询要占用CPU时间,降低了CPU的使用效率。
(2)矢量中断 矢量中断就是CPU响应中断后,要求中断源提供一个地址信息,该地址信息称为中断向量(或叫中断矢量),这种中断称为向量(矢量)中断。 根据形成入口地址的机制的不同,向量中断又分为:简单硬件查询法--菊花链法和中断控制专用硬件方法。 ① 简单硬件查询方式-菊花链法 图5.3所示是菊花链法的原理示意图。
数据总线 CPU 以及总线 控制逻辑 __ 接口3 接口1 接口2 菊花链 逻辑电路 菊花链 逻辑电路 菊花链 逻辑电路 INTA INTR 图53菊花链优先级查询示意图
当外设通过接口和中断请求电路向CPU发出中断申请号INTR,并且满足中断响应条件时,CPU在执行完当前指令后便发出中断响应信号 ,该响应信号在所有中断源形成的链形结构中逐级传送,位于链首的1#设备首先得到响应。 如果所到达的中断源已请求中断,则中断响应信号被截获,不再往下传。截获了 信号的中断源通过接口电路经数据总线向CPU提供一个中断类型码,不同的中断源提供的类型码不同,CPU根据为类型码就能转向相应的中断服务程序。 菊花链方式具有中断响应速度快的优点,缺点是各中断源的优先级因硬件连接固定而不易修改。
中断控制专用硬件方式 • 图5.4所示是一个典型的向量中断优先控制器原理框图。
2、中断的多级嵌套 CPU总是首先响应优先级最高的中断请求。当CPU正在执行优先级别较低的中断服务程序时,允许响应优先级别高的中断源的中断请求,中止起正在处理的中断,这就是中断嵌套和称多重中断。此时,CPU暂停正在执行着的级别较低的中断服务程序,为优先级别高的中断源服务,待优先权高的中断服务结束后,再返回到刚才被中断的那一级,继续为它进行中断服务。直至处理结束返回主程序,如图5.5所示。
1#中断服务 程序 2#中断服务 程序 3#中断服务 程序 主 程 序 INT2 INTR # INT3# INT 1# 返回 返回 返回 继续主程序 图5.5 中断嵌套示意图
编写具有中断嵌套的中断服务程序时需注意: (1)要有屏蔽本级和低级中断请求的环节,防止低级中断的干扰。 (2)执行中断服务程序之前,要开放中断,允许优先级比它高的中断源进行中断,实现中断嵌套。 (3)中断服务程序结束后,为使恢复现场的过程不受任何中断请求的干扰,必须执行CLI指令,中断关才,才能恢复现场。 (4)恢复现场后,执行开中断指令STI,重新开放中断,允许CPU响应任何其他中断请求。8086/8088CPU 执行了紧跟在STI指令后面的一条指令之后,才重新开放中断,一般紧跟在STI之后的是一条返回指令RET。也就是把原来被中断的服务程序的断点地址送回IP后,CPU开放中断,响应新的中断请求。
5.2 8086/8088的中断系统 8086/8088微机系统具有一个功能强大的中断系统,可以处理多达256种不同类型的中断。对应的中断类型码为0~255。
非屏蔽中断请求 8259A NMI INTR 中断逻辑 可屏蔽 中断请求 除法 出错 中断 级管理逻辑 单步 中断 INT n 指令 8086/8088CPU 图5.6 8086/8088的中断源 5.2.1 8086/8088的中断分类 按产生中断的方法来分,可以分为两大类:一类是硬件中断,另一类是软件中断,如图5.6所示。
硬件中断是由外部硬件产生,所以,又称为外部中断,硬件中断又分为非屏蔽中断和可屏蔽中断两大类。非屏蔽中断通过CPU的NMI引脚输入,可屏蔽中断是通过CPU的INTR引脚输入。两者不同之处是:非屏蔽中断主要用于处理非常重要或非常紧急的事件如电源掉电、存储器故障等,所以它不受中断允许标志IF的影响,一旦发生,直接通过NMI引脚进入CPU,CPU在当前指令执行完成后,立即响应。整个系统中只能有一个非屏蔽中断;可屏蔽中断由外设提出,受中断允许标志IF状态的影响,IF=1时,可屏蔽中断可以进入,当IF=0,可屏蔽中断被屏蔽。通常,所有外设的中断源请求信号都送至可编中断控制器8259A,由8259A向CPU发出中断请求信号。 软件中断是CPU处理某些内部事件时引起的中断,软件中断也叫内部中断。
5.2.2 中断向量和中断向量表 中断向量是中断服务程序的入口地址,每一个中断服务程序都有一个唯一确定的入口地址,即中断向量。把系统中的全部中断向量集中存放到存储器的某一区域内,这个存放中断向量的存储区就叫中断向量表,即中断服务程序入口地址表。 8086/8088的中断系统可以处理256种不同的中断,每个中断对应一个类型码。中断服务程序入口地址包括中段地址(CS)和段内偏移地址(IP)两部分,各占2个字节单元,所以,每个中断向量需占用4个字节单元,其中前2个单元存放IP,低位在前,高位在后,后2个单元存放CS,同样是高位在前,低位在后。
8086/8088系统在存储器的最低端地址从0段0单元开始的,共1K字节单元作为中断向量表,见课本P66图5.7所示。8086/8088系统在存储器的最低端地址从0段0单元开始的,共1K字节单元作为中断向量表,见课本P66图5.7所示。 当CPU响应中断调用中断类型号为n(n=0~255)的中断服务程序时,首先将中断类型号n乘以4,得到中断向量的存放地址4n,然后把中断向量表中4n和4n+1两个单元中的内容(中断服务程序入口地址的偏移地址)装入指令指针寄存器,即: IP(4n,4n+1) 再把向量表中两个高字节单元,即(4n+2,4n+3)中的内容(中断入口的段基址)装入代码段寄存器CS中,即: CS(4n+2,4n+3) 这样,就把控制引导到类型n的中断服务程序的起点,开始类型n的中断处理。
例如 中断类型号为13的中断所对应的中断向量存放在向量表中4n=4×13=34H单元(即0000∶0034H)开始的4个单元中,如果034H,035H,036H,037H 4个单元中的内容为30H、40H、50H、60H,那么,在该系统中,类型号为13的中断所对应的中断服务程序的入口地址为6050H∶4030H。 8086/8088系统中的256个中断分为三大类: 第一类是专用中断,它们对应于类型0~4,它们有明确的定义和处理功能,分别对应于除法出错、单步中断、不可屏蔽中断、断点中断和溢出中断,用户不能修改。
第二类是从类型5~31共27个中断,是系统保留的中断,是提供给系统使用,这些中断中,有的没有使用,但是为了保持系统之间的兼容性以及与将来Intel系统的兼容,用户不能对这些中断进行自行定义。 第三类是从类型32~255共224个中断,这类中断原则上是可以由用户定义。可定义为由INT n指令引入软中断,可以是通过INTR引脚直接引入,或者通过中断控制器8259A引入的可屏蔽中断,使用时用户要装入相应的入口地址。但是,这类中断类型号中,有的系统已分配有固定的用处,比如类型号为21H的中断已定义为操作系统MS-DOS的系统调用。
中断向量表虽然设置在RAM的低位存储区。但它并不是常驻内存,而是每次开机上电后,在系统正式工作之前都必须对其进行初始化,即由程序将相应的中断服务程序的入口地址装入指定的中断向量表区中。 8086/8088系统中,其内部中断的优先级别最高(单步中断除外),其次是不可屏蔽中断(NMI),单步中断的优先级别最低。
5.2.3 硬件中断 硬件中断也叫外部中断。由I/O设备或外部电路产生。8086/8088CPU中的硬件中断分为两种:非屏蔽中断NMI,可屏蔽中断INTR,分别从CPU的NMI和INTR引入。 1. 非屏蔽中断NMI 从NMI引脚引入的中断为非屏蔽中断,它不受中断允许标志的影响。非屏蔽中断的类型码为2,因此,非屏蔽中断处理子程序的入口地址存放在开始的4个单元中。
当NMI引脚上出现中断请求时,不管CPU当前正在做什么事情,都会响应这个中断请求而作出相应的处理。所以,除了系统中有十分紧急的情况以外,要尽量避免引起这种中断。非屏蔽中断一般用来处理系统的重大故障,如系统掉电处理。 非屏蔽中断处理程序要在晶体振荡器停振之前将现场作出紧急处理。一般采用以下措施: (1)将当前现场保留到非易失性存储器中,以便电源恢复正常后继续往下执行刚才被中断了的程序。非易失性存储器即使在电源去除之后也能保留存入的数据。 (2)启动备用电源,在尽量短的时间内用备用电源维持系统的工作。
2、可屏蔽中断 一般外部设备请求的中断都是从CPU的INTR端引入的可屏蔽中断。当CPU接收到一个可屏蔽中断请求时,如果中断允许标志IF为1,那么CPU就会在执行完当前指令后响应这一中断请求。至于IF的设置和清除,则可以通过指令或调试工具来实现。 如果系统对多台外设采用中断方式进行控制时,就需要使用中断控制器来配合CPU进行中断管理。如8259A就是一种中断控制器。可以管理8级可屏蔽中断。
3、硬件中断的响应和时序 下面讨论可屏蔽中断的响应过程。当CPU在INTR引脚上接收到一个有效高电平中断请求信号后,并且当前的中断允许标志IF为1时,CPU就会在当前指令执行完毕后,响应外部中断请求。CPU进入中断响应周期,该周期包含两个连续的总线周期,在这两个连续的总线周期内,CPU要从 引脚向外设接口发出负脉冲即两个中断响应信号,具体说,CPU响应外设中断,并转入中断服务程序的过程中,要依次完成以下操作:
①执行第一个中断响应总线周期,发 负脉冲,通知外部设备接口,中断请求已被响应,同时封锁总线,禁止其他总线主模块发总线请求。 ②执行第二个中断响应总线周期,从数据总线上读取中断类型码存入内部暂存器 ③将标志寄存器的内容推入堆栈。 ④将IF和TF清零。清除IF是为了在中断响应过程中禁止其他外部中断以免中断响应过程被中断请求所打扰;清除TF是为了避免CPU以单步方式执行中断服务子程序。
⑤保护断点。即将当前指令的下一条指令的段地址CS值和段内偏移地址IP值推入栈,使中断处理完毕后正确地返回断点处继续执行主程序。 ⑥转入中断处理子程序。根据②得到的类型码,从中断向量表中找到中断向量并转入相应的中断服务子程序。 ⑦中断返回。中断服务程序结束时,CPU依次从堆栈中弹出IP,CS和FR的内容,然后按照IP和CS值返回主程序的断点处继续执行原来的程序,返回断点的一系列操作是由IRET中断返回指令实现的。
结束当前指令 是 是内部中断? 是 是NMI中断? 中断响应 是 是 是INTR中断? IF=1? 读类型码 n 否 TF=1? 标志入栈 执行下一条指令 令TEMP=TF 清除IF、TF CS、IP入栈 执行中断服务程序 有 有NMI吗? 无 是 TEMP=1? 否 调中断服务程序 弹出CS和IP 弹出标志 返回断点 图5.8 8086/8088的中断响应过程
T4 T3 T2 T3 T4 T1 T2 T1 图5.9 8086/8088中断响应总线周期时序图 CLK ALE LOCK INTA n D7~D0
由图可以看出8086CPU的中断响应要用两个总线周期,每个总线周期包含4个时钟周期(T1~T4)。每个总线周期CPU都要发出一个中断响应负脉冲。关于中断响应时序作以下几点说明: ①第一个中断响应总线周期中,CPU将地址/数据复用总线置为浮空状态,在T2~T4期间向外设接口发出中断响应负脉冲,表示CPU准备响应中断,外设准备好中断类型码,并禁止其他总线主模块的总线请求。 ②第二个 中断响应总线周期中,CPU接收外设接口通过数据总线发来的中断类型码,根据此类型码得到中断服务程序入口地址,接着,CPU保护状态标志转入中断服务程序。
③8086/8088要求可屏蔽中断请求信号INTR是一个电平触发信号,而且有效高电平必须维护2个时钟周期,否则会使中断请求信号得不到响应。 ③8086/8088要求可屏蔽中断请求信号INTR是一个电平触发信号,而且有效高电平必须维护2个时钟周期,否则会使中断请求信号得不到响应。 ④工作在最大模式时,CPU通过、、 发低电平信号来响应中断,由总线控制器组合出中断响应脉冲送给外设。 ⑤CPU不允许在两个总线响应周期间响应总线保持请求,但当同时出现中断请求和总线保持请求时,CPU先对总线保持请求服务。
⑥外设的中断类型码是通过16位数据总线的低8位传送给CPU,所以,要求提供中断类型码的外设接口应连接在总线的低8位上。 ⑦在中断响应周期的两个连续总线周期中,地址/数据/状态总线是浮空的,但是M/ 为低电平,ALE信号在两个总线周期的T1输出正脉冲作为地址锁存信号。 ⑧软件中断和NMI中断不按照以上时序响应中断。
4、中断服务子程序 不同的中断源其中断服务子程序的功能不同,但所有的中断服务子程序都有着相同的结构模式。 (1)中断服务程序的一开始要用压栈指令保护现场,即保护CPU内有关寄存器的值,以及中断服务程序中要使用的寄存器值 (2)用STI指令开中断,以便在中断处理过程中允许优先级更高的中断进入实现嵌套。 (3)执行中断处理程序,进行具体的中断服务,这是中断服务程序的主要部分。
(4)中断处理模块执行完后,用CLI指令关中断,恢复现场中禁止其他中断。(4)中断处理模块执行完后,用CLI指令关中断,恢复现场中禁止其他中断。 (5)通过一系列的出栈指令POP将保护现场时压入堆栈的内容以相反的次序弹出,即灰复现场。 (6)开放中断。 (7)最后是中断返回指令,返回主程序,执行中断返回指令,使堆栈中保存的断点值和标志值分别装入IP、CS和标志寄存器。
注意: 转入中断服务子程序时的断点及标志入栈,和中断返回时的断点及标志出栈,是在转子和执行IRET指令时,自动进行的,不要用PUSH和POP指令,而保护其它寄存器的内容及出栈需在子程序中用PUSH和POP实现。
5.2.4 软件中断 8086/8088系统中,提供了直接调用中断处理子程序的软件手段,这就是中断指令INT n.通过中断指令使CPU执行中断处理子程序的方法叫软件中断。软件中断是由CPU内部所引起,也叫内部中断。软件中断可以由中断指令INT n引起,由CPU的某些运算错误(如除法出错等)引起或由调试程序DEBUG设置的中断。 CPU执行程序过程中,会发现运算中出现的一些错误,这时就会中断程序的执行,自动启动内部逻辑转去执行所需要的中断服务程序处理这些错误。
类型0中断(除法出错中断)。除法过程中,若除数为0或商超过了寄存器所能表示的范围,这时就会产生一个类型为0的中断,转入类型0的中断服务程序。 类型1中断(单步中断)。在CPU执行一条指令前,如果检测到标志寄存器中的单步标志IF=1,则8086/8088就处于单步工作方式,即每执行完一条指令后都自动产生一个1型中断,执行一次单步中断处理程序,此程序用来显示一些内部寄存器的值,以及一些附带信息。因此,单步中断一般用于程序的调试。
类型3中断(断点中断)。断点中断是专供在程序中设置断点用的,可以很方便地插入到程序的任何地方,插入类型3中断之处便是断点,在断点处,停止正常的执行过程,以便进行某种特殊的处理。也用于程序的调试。 类型4中断(运算溢出中断)。CPU检测溢出标志OF=1时,就执行一条INTO指令,之后立即产生一个类型4的中断,此时中断处理程序给出错误标志。 由中断指令INT n引起的中断。CPU执行一条INT n指令后立即产生中断,并且会调用系统中相应的中断处理程序来完成中断功能。指令中的n为中断类型码。