电子说
所谓中断,是指CPU在正常运行程序时,由程序预先安排好的事件,或者由内、外部事件引起CPU中断正在运行的程序,而转到为预先安排的事件或内、外部事件服务的程序中去。
执行到此,立即转到对应的服务程序去执行。
内部事件是指系统板上出现的一些事件信号,中断指令也可看做内部事件 。
外部事件是指某些接口设备所发出的请求中断程序执行的信号, 这些信号称为中断请求信号 。
中断请求信号何时发生是不可预知的 ,然而,它们一旦请求中断,就会向CPU发出电信号,因此这些信号CPU是可以测知的。这样,CPU就无需花大量的时间去查询这些信号。
例如,键盘何时有键按下是随机的,因而CPU可以对键盘不加等待,而去执行其他程序,一旦有键按下,键盘马上产生中断信号,CPU得知这一信号后,就立即去执行为键盘服务的中断程序,服务结束后,CPU又恢复执行被中断了的程序。
优先级高的中断,CPU首先响应;优先级低的中断暂不响应,称为挂起。
CPU响应中断转去执行中断服务程序前,需要把被中断程序的现场信息保存起来,以便执行完中断服务程序后,接着从被中断程序的断点处继续往下执行。
现场信息包括程序计数器的内容、CPU的状态信息、执行指令后的结果特征和一些通用寄存器的内容。
有些信息的保存,如程序计数器的内容等,由机器硬件预先安排完成,称为中断处理的隐操作;而有些信息的保存是在中断服务程序中预先安排的。
CPU响应中断, 由中断源提供地址信息,引导程序转移并执行中断服务程序,这个地址信息称为中断向量 ,它一般是和中断源相对应的。PC采用类型码来标识中断源。
在数据采集或实时控制中,CPU对接口设备的控制或交换信息,可采用查询、中断、DMA等方式,而中断方式以其执行速度快,可实时处理,不占用CPU过多的时间等优点,在接口技术中较多地被采用。
如上所述,CPU在与外设交换信息时,若用查询的方式,则CPU就要浪费很多时间去等待外设。
这样就存在一个快速的CPU与慢速的外设之间的矛盾,这也是计算机在发展过程中遇到的严重问题之一。为解决这个问题,一方面要提高外设的工作速度;另一方面发展了中断的概念。中断有以下好处。
有了中断功能,就可以使CPU和外设同时工作。 CPU在启动外设工作后,就继续执行主程序,同时外设也在工作;当外设把数据准备好后,发出中断申请,请求CPU中断它的程序,执行输入或输出(中断处理);处理完以后,CPU恢复执行主程序,外设也继续工作。而且有了中断功能,CPU可命令多个外设同时工作,这样就大大提高了CPU的利用率,也提高了输入、输出的速度。
引起中断的原因,或能发出中断申请的来源,称为中断源。通常中断源有以下几种。
为了满足上述各种情况下的中断要求,中断系统应具有如下功能。
由于引脚的限制,CPU的中断请求线的数量是有限的 。例如,8088只有一条可屏蔽硬件中断请求线(INTR)。最简单的情况当然是只有一个中断源,我们就从这个最简单的情况分析。
每一个中断源,要能发出中断请求信号, 且这个信号能一直保持到CPU响应这个中断请求后,才可清除中断请求 。 故要求每一个中断源有一个中断源请求触发器A ,如图所示。
图1 设置中断请求的电路
图2 具有中断屏蔽的接口电路
在CPU内部有一个中断允许触发器。只有当其为“1”时(即中断开放时),CPU才能响应中断;若其为“0”(即中断是关闭的),则即使INTR线上有中断请求,CPU也不响应。
这个触发器的状态可由STI和CLI指令改变。+ 当CPU复位时,中断允许触发器的输出为“0”,即关中断,所以必须用STI指令开中断 。+ 当中断响应后,CPU自动关中断,所以必须在中断服务程序中用STI指令开中断。
CPU在现行指令运行到最后一个机器周期的最后一个T状态时,才采样INTR线。
若发现有中断请求,则把内部的中断锁存器置“1”,下一个机器周期不进入取指周期,而进入中断周期。其时序流程如图3所示。
图3 中断时序流程图
当满足上述条件后,CPU响应中断,转入中断周期,CPU做以下几件事。
8088在CPU响应中断后,发出中断响应信号INTA的同时,内部自动地实现关中断。
CPU响应中断,封锁IP+1,且把IP和CS推入堆栈保留,以备中断处理完毕后,能返回主程序。
为了使中断处理程序不影响主程序的运行,故要把断点处有关的各个寄存器的内容和标志位的状态,推入堆栈保护起来。8088通过软件(即在中断服务程序中)把要用到的寄存器的内容用PUSH指令推入堆栈。
8088由中断源提供的中断矢量形成中断入口地址(即中断服务程序的起始地址)。在中断服务程序完成后,还要做下述的5、6两步工作。
在中断服务程序的最后,要开中断(以便CPU能响应新的中断请求)和安排一条返回指令,将堆栈内保存的IP和CS的值弹出,程序恢复到主程序中运行。
上述过程可用如图4所示的流程图表示。
图4 中断响应、服务及返回流程图
如前所述,实际的系统中,是有多个中断源的,但是,由于CPU引脚的限制,往往只有一条中断请求线。于是,当有多个外中断源同时请求时,CPU就要识别出哪些中断源有中断请求,辨别和比较它们的优先权(Priority),先响应优先权级别最高的中断请求。另外,当CPU处理中断时,也要能响应更高级的中断请求,而屏蔽掉同级或较低级的中断请求。
要判别和确定各个中断源的优先权可以用软件和硬件两种方法。
软件采用查询技术。当CPU响应中断后,就用软件查询以确定是哪些外设申请了中断,并判断它们的优先权。
把8个外设的中断请求触发器组合起来,作为一个端口,并赋以设备号,如图5所示,把各个外设的中断请求信号相“或”后,作为INTR信号,故任一外设有中断请求,都可向CPU送出INTR信号。
当CPU响应中断后,把中断寄存器的状态,作为一个外设读入CPU,逐位检测它们的状态,若有中断请求就转到相应的服务程序的入口。其流程如图6所示。
采用硬件编码器和比较器的优先权排队电路,如图7所示
图7 编码器和比较器的优先权排队电路
若有8个中断源,当任意一个有中断请求时,通过或门,即可有一个中断请求信号产生,能否送至CPU的中断请求线,还要受比较器的控制(若优先权失效信号为低电平,则与门2关闭)。
8条中断输入线的任一条,经过编码器可以产生三位二进制优先权编码A2A1A0,优先权最高的线的编码为111,优先权最低的线的编码为000。而且若有多个输入线同时输入,则编码器只输出优先权最高的编码。
正在进行中断处理的外设的优先权编码,通过CPU的数据总线,送至优先权寄存器,然后输出编码B2B1B0至比较器,以上过程是由软件实现的。
比较器比较编码A2A1A0与B2B1B0的大小,若AB”端输出低电平,封锁与门1,就不向CPU发出新的中断申请(即当CPU正在处理中断时,当有同级或低级的中断源申请中断时,优先权排队电路就屏蔽掉它们的请求);只有当A>B时,比较器输出端才为高电平,打开与门1,将中断请求信号送至CPU的INTR输入端,CPU就中断正在进行的中断处理程序,转去响应更高级的中断。
若CPU不再进行中断处理时(即在执行主程序),则优先权失效信号为高电平,当有任一种中断源请求中断时,都能通过与门2发出INTR信号。这样的优先权电路,如何才能转入优先权最高的外设的服务程序的入口呢?当外设的个数小于等于8时,则它们公用一个产生中断矢量的电路,根据比较器的编码A2A1A0,就能做到不同的编码转入不同的入口地址。
当多个输入有中断请求时,则由中断输入信号的“或”电路产生INTR信号,送至CPU。CPU执行完现行指令后,响应中断,发出中断响应信号。但究竟响应哪一个中断呢?或CPU是转向哪一个中断服务程序的入口呢?这要由图8所示的链式优先权排队电路确定。
当中断响应为高电平时,若F/F A有中断请求,则它的输出为高电平,于是与门A1输出为高电平,由它控制转至中断1的服务程序的入口,且门A2输出为低电平,因而使门B1、B2、C1、C2…所有下面各级门的输入和输出全为低电平,即屏蔽了以下的各级。
若第一级没有中断请求,即F/F A=0,则中断输出为低电平,但门A2的输出却为高电平,即把中断响应传递至中断请求2。若此时F/F B=1,则与门B1输出为高电平,控制转去执行中断2的服务程序;此时与门B2的输出为低电平,因而屏蔽了以下各级。而若F/F B=0,则与门B1输出为低电平,而与门B2输出为高电平,把中断响应传递至中断请求3……
图8 链式优先权排队电路
综上所述,在链式优先权排队电路中,
多级中断系统是指计算机系统中有相当多的中断源,根据各中断事件的轻重缓急而分成若干级别,每一中断级分配一个优先权。
一般来说,优先权高的中断级可以打断优先权低的中断服务程序,以程序嵌套方式进行工作。
如图9(a)所示,三级中断优先权高于二级,而二级中断优先权高于一级。
根据系统的配置不同,多级中断又可分为一维多级中断和二维多级中断,如图9(b)所示。
一维多级中断是指每一中断中只有一个中断源,而二维多级中断是指每一级中断中又有多个中断源。
图中虚线左边结构为一维多级中断,如果取掉虚线则成为二维多级中断结构。
对于多级中断,我们着重说明如下几点:
8088有两种类型的中断:由执行某些指令引起的软中断和 设备引起的硬中断 ,这两类中断均有中断类型码相对应。
执行下述指令时,将产生或可能产生中断。
当执行这些除法指令时,若除数为0或商溢出,则产生中断,称为0型中断。
当执行中断指令INT n时,则产生n型中断。
若在指令序列执行过程中,上条指令执行的结果使溢出标志位O=1,接着若执行的是INTO指令,则引起内部中断,称为4型中断;若溢出标志位O=0,该指令将不起作用。
当标志位T=1时,每执行一条指令,则引起一次中断,即指令为单步执行方式,这种方式常用于程序的调试。单步执行为1型中断。
8088有两种中断请求线:
非屏蔽中断NMI线和可屏蔽中断INTR线,在这两条线上产生中断请求信号而引起的中断称为硬中断。
(1)可屏蔽中断
出现在INTR线上的请求信号是电平触发的, 它的出现是异步的,在CPU内部由CLK的上升沿来同步 。在该线上的中断请求信号(高电平有效)必须保持到当前指令的结束。
在这条线上出现的中断请求,CPU是否响应要取决于标志位I的状态, + 若I=1,则CPU就响应,可以认为此时CPU处于中断状态;+ 若I=0,则CPU就不响应。
I位的状态,可以用指令STI使其置位(即开中断);也可用CLI指令使其复位(即关中断)。 要注意:+ 在系统复位以后,标志位I=0;此外任一种中断(内部中断、NMI、INTR)被响应后,I=0。所以 **必须在一定的时候用STI来开放中断** 。+ CPU是在**当前指令周期的最后一个T状态采样中断请求信号的,** 若发现有可屏蔽中断请求,且中断允许(I=1),则CPU进入中断响应周期。
(时钟周期,又称节拍周期,是处理器的最基本单位,晶振频率的倒数,也称T状态)
当NMI线上出现一个 由低向高上跳的高电平中断请求信号后(持续时间大于两个时钟周期) ,不管标志寄存器I位的状态如何,当前指令执行完成后,8088马上转入中断处理。
此种类型的中断有三种来源:+ 电源故障, + 系统板上随机存储器奇偶校验错, + 8087(协处理器)中断请求和I/O通道检查错。非屏蔽中断的优先权高于可屏蔽中断。
8088中有一个简单而又多功能的中断系统。上述的任何一种中断,CPU响应以后,都要保护现场(主要是标志位)和保护断点(现行的码段寄存器CS和指令指针IP),然后转入各自的中断服务程序。在8088中各种中断如何转入各自的中断服务程序呢?
8088在内存的前1KB(地址为00000H~003FFH)建立了一个中断向量表,可以容纳256个中断向量(或256个中断类型),每个中断向量占用4B。(这个应该是)
在这4B中,包含着这个中断向量(或这个中断类型)的服务程序的入口地址 ——前两个字节为服务程序的IP,后两个字节为服务程序的CS,如图10所示。(CS:IP)
其中前5个中断向量(或中断类型)由Intel专用,系统又保留了若干个中断向量,余下的就可以由用户自己使用,作为中断源的向量。
8088中各种中断的响应和处理过程是不相同的,但主要区别在于如何获取相应的中断类型码(向量号)。
对于硬件(外部)中断,CPU在当前指令周期的T状态采样中断请求信号,
C.PU在T1、T2、T3、T4这四个状态完成一个总线周期。在T1状态,把地址信息从地址线A19~A16,A15~A8和AD7~AD0上输出,且立即发出地址锁存信号ALE,把在A19~A16上出现的高4位地址和在AD15~AD0(8088则是AD7~AD0)上出现的地址,在外部地址锁存器上锁存。在T2状态,CPU发送读写等控制命令。在T3、T4状态,CPU发送或接收数据,并在T4状态结束此总线周期。当外部存储器或I/O端口的时序不能与CPU的时序相配合时,就需要插入TW周期。**因此,在CPU中设计了一条准备就绪READY输入线,即存储器或I/O端口输给CPU的状态线。**CPU在T3采样READY线,若为高电平,则在T3状态后进入T4状态。若存储器或I/O端口来不及在T4状态的前沿把数据准备好,则当CPU在T3状态采样时应使READY线为低电平,并在T3状态后插入一个等待状态TW。
对于软件中断,中断类型码也是自动形成的。对于INT n指令,则类型码即为指令中给定的n。8088在取得了类型码后的处理过程是一样的,其顺序为:
在中断服务程序中,通常要保护CPU内部寄存器的值(保护现场)及开中断(若允许中断嵌套的话)。
在中断服务程序执行完后,要恢复现状,最后执行中断返回指令IRET。
IRET指令按次序恢复断点处的IP和CS的值,恢复标志寄存器(相当于POP F)。
于是程序就恢复到断点处继续执行。8088的中断响应和处理过程可用如图11所示的流程图来表示。
在IBM PC/XT中有三种类型的中断。
包括被0除、单步执行、溢出和中断指令(包括断点中断)等 。这是由8088执行指令产生的中断。
在IBM PC/XT中若存储器的读/写奇偶校验错,或者是由8087(协处理器)的异常所产生的中断,都送至8088的NMI输入端要求处理。
在IBM PC/XT系统中,可能有多个外部设备中断请求信号,而8088 CPU的可屏蔽中断输入信号只有一个INTR。
为此,在IBM PC/XT系统中,采用中断控制器(8259)将外部设备中断请求信号扩充到8个。
IBM PC/XT系统中可屏蔽的中断源及其相应的类型码如表1所示。
表1 可屏蔽的中断源及其相应的类型码
8088 CPU最多能处理256种不同的中断,其中有5个保留为CPU专用;又有相当一部分是由磁盘操作系统DOS保留为系统用的。
所有已经保留的中断类型,用户就不能再使用了,但可使用的仍然有近200个中断,这对于绝大部分用户来说已经是足够了。
IBM PC/XT中保留的中断(所用的DOS的版本号不同会有一些不同)中,前5个中断类型是8088规定的专用中断。BIOS的中断类型号为0~1F,其功能如表2所示:
表2 IBM PC/XT中保留的BIOS中断
在这些类型的中断中,
中断类型号20~3F由DOS操作系统使用,用户程序也可以调用其中的20~27号中断。
这些中断功能安排如表3所示。
表3 IBM PC/XT中保留的DOS中断
40号以后的中断类型可由用户程序安排使用。
本章我们借助8088这个基础的中断控制器,让我们对中断的硬件电路有了基础的认知,这里我们来看两个当下非常常用和流行的中断控制管理器8259A、APIC。
当然ARM的GIC肯定也是会有的哦。
全部0条评论
快来发表一下你的评论吧 !