程序控制方式的数据传送分为无条件传送、查询传送和中断传送,这类传送方式的特点是以CPU为中心,由CPU控制,通过预先编制好的输入或输出程序实现数据传送。这种传送方式的数据传送速度较低,传送时要经过CPU内部的寄存器,同时数据的输入/输出的响应也较慢。
5.2.1.1 无条件传送方式(也称同步传送方式或立即传送方式)
此方式是一种最简单的I/O控制方式,它有点类似于CPU与存储器之间的数据传送,即CPU总是认为外设在任何时刻都是处于“准备好”的就绪状态。因此,这种传送方式中不需要交换状态信息,只需在程序中加入访问外设的指令,CPU就可随时无条件地读写I/O端口,实现数据的传送。
图5-5为无条件传送接口示意图。在无条件传送方式下,CPU和外设端口之间也要有接口电路。一般在输出端口上会有一个输出锁存器,CPU将要输出的信息存入输出锁存器,外设从锁存器读取信息;在输入端口上会有一个输入缓冲器,在不做输入操作的时候,缓冲器处于高阻状态,CPU实际上和输入的外设没有连接。需要做输入操作时,地址译码器的输出使缓冲器正常工作,输入设备的信息就可以通过缓冲器读入到CPU。
使用前提:CPU与外设进行数据传送时,必须保证外设已准备好,这就要求外设的动作时间是固定或者已知的。
实现方法:CPU不查询外设工作状态,与外设速度的匹配通过在软件上延时完成,在程序中直接用I/O指令,完成与外设的数据传送。
特点:软件及接口硬件十分简单,但只适用于简单外设,适应范围较窄。
适用场合:适用于总是处于准备好状态的简单外设。例如,开关/按键/按钮、发光器件(如发光二极管、LED数码管、灯泡等)、继电器和步进电机等。这些简单外设的操作时间是固定或已知的。
【例5-1】 图5-6是8031和一组开关和一个LED显示器的接口。从开关读入一个BCD码,并将读入的值在显示器上显示。输入缓冲器的地址是8000H,输出锁存器的地址是8002 H。请写出相应的接口程序。
4个开关有16个状态,其中0000~1001对应于数字0~9的BCD码。如果输入是1010~1111非法BCD码,则属于错误输入,显示字母“E”。对于正确输入,应先转换为7段显示码,再从输出口输出。BCD码到7段显示码(共阳极)的转换用查表来完成。在两次输入/输出操作之间加上适当的延迟,以保证稳定的显示输出,这也是在这种应用模式下可以使用无条件传送方式的必要条件。
图5-6 例5-1的简化电路
相应的参考程序段为:
5.2.1.2 查询传送方式(也称条件传送方式或异步传送方式)
在不能采用无条件传送的场合,CPU可以通过不断查询外设状态,实现与外设的速度匹配问题。它是一种CPU主动、外设被动的I/O操作方式。为了保证数据传送的正确性,在传送数据之前,CPU首先要查询外设是否处于准备好的状态,以确定是否可以进行数据传输。对于输入操作,需要知道外设是否已把要输入的数据准备好;对于输出操作,则要知道外设是否已把上一次计算机输出的数据处理完毕。只有通过查询确信外设确实已处于“准备好”的状态(即传输条件满足时),CPU才能发出访问外设I/O端口的指令,实现数据的交换,否则CPU等待直到条件满足。对多个外设的情况,则CPU按一定顺序依次查询(轮询)。先查询的外设将优先进行数据交换。
在查询传送时,从硬件来说,外设应该能送出反映其工作状态的状态信息。接口电路则要用专门的端口来保存和传送状态信息。此外,数据端口当然也是不能少的。在查询输入时,当外设把数据准备好时,应使状态置于“准备好”,CPU在输入前,先查询状态,发现外设已“准备好”时,执行输入操作。输入操作之后,状态信息应立即自动改为“没准备好”,以防止计算机马上再进行下一次输入,出现传送的错误。当外设又把下一个数据准备好后,再使状态信息恢复“准备好”。然后重复以上的过程。在输出操作时,情况类似。接口电路也至少需要有两个端口:状态端口和数据端口,以分别传送状态和数据信息。因此,采用查询方式的接口电路除了具备数据端口之外,还应该具备状态端口。
状态信息一般只需要1位二进制码,所以在接口中只用一个D触发器就可用来保存和产生状态信息。数据仍需要一个锁存器来保存。但具体的接口电路采用什么形式要和外设所产生的信息相联系,不能一概而论。此外,两个端口往往需要两个译码电路的输出来产生地址选通信号。因此,查询式传送所需要的硬件比无条件传送复杂一些,另外,它还要求外设能提供状态信息。
从软件来看,首先查询状态,如果没有准备好,则继续查询,直到外设准备好以后再传送数据,待到下一次数据传送时则重复以上过程。具体的步骤为:
(1)CPU向接口发命令,要求进行数据传输。
(2)CPU从状态端口读取状态字,并根据约定的状态字格式判断外设是否已就绪。
(3)若外设未准备好,重复步骤(2),直至就绪。
(4)CPU执行输入/输出指令,读/写数据端口。
(5)使状态字复位,为下次数据传输做好准备。
在查询过程中,CPU实际处于等待状态。对于动作时间固定的外设,等待也可以不采用循环等待,而用软件插入固定延时的方法来完成,此时硬件连接上可能会简单一些。图5-7为查询方式程序的一般流程图。
图5-7 查询方式流程图
查询传送方式工作流程包括两个基本工作环节:
(1)查询环节。主要通过读取状态寄存器的标志位来检查外设是否“就绪”。寻址状态口,读取状态寄存器的标志位,若不就绪就继续查询,直至就绪。
(2)传送环节。当上一环节完成后,将对数据口实现寻址,并通过输入指令从数据端口输入数据,或通过输出指令从数据端口输出数据。
实现方法:在与外设进行传送数据前,CPU先查询外设状态,当外设准备好后,再才执行I/O指令,实现数据传送。
使用前提:CPU在与外设交换数据前必须询问外设状态——“你准备好没有?”。对外设的要求:应提供设备状态信息。对接口的要求:需要提供状态端口。
特点:避免了无条件传送对端口的“盲读”、“盲写”,能够保证输入/输出数据的正确性,数据传送的可靠性高;适用面宽,可用于多种外设和CPU的数据传送;接口的硬件相对简单,接口的软件也比较简单。但由于需要有一个查询状态的等待过程,特别是在连续进行数据传送时,由于外设工作速度比CPU慢得多,所以CPU在完成一次数据传送后要等待很长的时间(与数据传送相比),才能进行下一次的传送,而在查询等待过程中,CPU不能进行其他操作。因此,CPU工作效率低,数据传送的实时性差,I/O响应速度慢。
适用场合:由于需先查询状态后传送数据,数据传送速度较慢,适用于简单、慢速的或实时性要求不高的外设。
查询传送方式的说明如下。
1.输入方式
图5-8为查询输入接口电路,图5-9为查询输入的端口信息及程序流程框图。当输入设备的数据已经准备好后,一方面将数据送入8位锁存器,另一方面对D触发器触发,使状态信息标志位D0为1。当CPU要求外设输入信息时,先检查状态信息。若数据已经准备好,则输入相应数据,并使状态信息清“0”。否则,等待数据准备“就绪”。图中的①、②、③、④表示动作顺序。
图5-8 查询输入接口电路
图5-9 查询输入的端口信息及程序流程框图
查询输入的参考程序为:
2.输出方式
图5-10为查询输出接口电路,图5-11为查询输出的输出信息及程序流程框图。当输出设备将数据输出后,会发出一个ACK信号,使D触发器翻转为0。CPU查询到这个状态信息BUSY后,执行输出指令,将新的输出数据发送到数据总线上,同时把数据口地址发送到地址总线上。由地址译码器产生的译码信号和相“与”后,发出选通信号,将输出数据送至8位锁存器。同时,将D触发器置为1,并通知外设进行数据输出操作。图中的①、②、③、④、⑤、⑥表示动作顺序。
图5-10 查询输出接口电路
图5-11 查询输出的端口信息及程序流程框图
查询输出的参考程序为:
3.优先级问题
当CPU需对多个外设进行查询时,就出现了所谓的优先级问题,即究竟先为哪个设备服务。一般来讲,在这种情况下都是采用轮流查询的方式来解决,如图5-12所示。这时的优先级是很明显的,即先查询的设备具有较高的优先级。但这种优先级管理方式,也存在着一个问题,即某设备的优先级是变化的,如当为设备B服务以后,这时即使A已准备好,它也不理睬,而是继续查询C,直至X,也就是说A的优先地位并不巩固(即不能保证随时处于优先)。为了保证A随时具有较高的优先级,可采用加标志的方法,当CPU为B服务完以后,先查询A是否准备好,若此时发现A已准备好,立即转向对A的查询服务,而不是为C设备服务。
图5-12 多个外设查询传送方式的程序流程框图
5.2.1.3 中断传送方式(简称中断方式或称中断)
1.中断方式的概述
(1)计算机中引入中断的原因。尽管查询传送方式能解决快速的CPU与慢速的外设的速度匹配,但CPU要用去大量时间进行外设状态的查询工作,而真正用于数据传送时间却很短,因此,CPU工作效率很低,数据传送的实时性差。为了提高数据传输率,并避免CPU不断检测外设状态的过程,提高CPU的利用率,实现对特殊事件的实时响应和处理,现代计算机中都引入中断传送方式。
与查询传送方式下CPU主动而外设被动完全不同,中断传送方式是CPU被动而外设主动的I/O操作方式。在中断传送方式下,CPU无需循环查询外设状态,CPU执行着本身的主程序(如数学运算等),外设在需要进行数据传送时,才主动向CPU提出使用请求,若CPU接受其请求,CPU就会响应之,CPU会暂时中断正在进行的工作,并转而为外设提供相应的服务,服务完毕后再返回去做被中断的工作。即CPU在没有外设请求时可以去做更重要的事情,有请求时才去传输数据,这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,完全消除了CPU在查询方式中的等待过程,使其工作效率得以大大地提高。
由于CPU工作速度很快,传送数据所花费的时间很短。对外设来讲,似乎是对CPU发出数据交换的申请后,CPU马上就实现了数据传输,没有一点耽搁。对于主程序来讲,虽然中断了一个瞬间,由于时间很短,也不会有什么影响和不便。
(2)中断的定义。中断实际上是一种效率比查询方式更高的CPU与外设之间数据传送方式。具体来讲,中断就是指CPU在正常执行主程序的过程中,由于系统中出现某些急需处理的异常情况或特殊请求(内部/外部事件或由程序预先安排的),引起CPU暂时中断当前主程序的运行而转去对随机发生的更紧迫的事件进行处理(即执行为内部/外部事件或预先安排的事件服务的子程序),待处理完毕后(中断服务子程序执行完成后),CPU又自动返回到主程序的暂停处(断点)继续执行原来的主程序,这一过程称为中断。或者说,中断就是CPU在执行当前程序的过程中因意外事件插入了另一段程序的运行。图5-13为中断过程的示意图。
假设中断是由外设引起的,当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号(发出中断请求时间是随机的),CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行预先设计好的、能够进行相应的输入/输出操作的(中断服务)子程序,待输入/输出操作执行完毕之后CPU即返回继续执行原来被中断的主程序。
中断传送方式输入的接口电路如图5-14所示。当输入装置输入一个数据后,发选通信号,把数据存入8位锁存器,并使1位的D触发器置“1”,表示I/O设备已经准备好。D触发器的输出经与门后去申请中断。CPU接受了中断的请求INTR后,等现行指令执行完毕,即暂停正在执行的程序,并发出中断响应信号,在信号的作用下,中断控制器(如Intel 8259A)把属于I/O设备的中断矢量送上系统数据总线DB让CPU读取,CPU根据中断矢量可得中断服务程序入口地址,进而转入中断服务程序输入数据,同时清除中断请求标志。当中断处理完毕后,CPU返回被中断的程序继续执行。图中的①、②、③、④、⑤、⑥、⑦表示动作顺序。
图5-13 中断过程的示意图
图5-14 中断传送方式的输入接口电路
(3)中断的日常事例。下面通过一个日常事例来帮助读者对中断概念的正确理解。
1)你正在上机调试一段程序。
2)有你的长途电话。
3)将光标定位到调试的当前位置,起身接听电话。
4)电话谈话中间,有人来通知你一项重要事宜。
5)请来电话者稍等,将重要事宜问清楚。
6)继续听电话。
7)电话完毕后,继续调试程序。
在此事件中,“你”就相当于计算机的CPU,调试的程序相当于CPU正在处理的程序和数据,而“有长途电话”和“重要事宜的通知”则是中断源。从调试程序到接听电话,从电话打断到重要事宜的通知均是一次中断,从整体而言,长途电话和重要事宜的通知则是一次中断的嵌套。
(4)中断技术能实现的功能。计算机系统引入中断机制后,较大地提高了CPU的工作效率,并使系统具有了分时操作、实时处理和故障处理等功能。
1)分时操作(并行处理)。计算机配上中断系统后,CPU就可以分时执行多个用户的程序和多道作业,使每个用户认为它正在独占系统。此外,CPU可控制多个外设同时工作,并可及时得到服务处理,使各个外设一直处于有效工作状态,实现并行处理,从而大大提高主机的使用效率。例如,一台高速计算机可以接几十个终端,每个终端用户都觉得CPU只为他单独服务,所有的终端可“同时”投入使用。但实际上,这种多用户服务并不真是在同一时间进行的,而仅是因为计算机工作速度极快,各个用户的中断申请总有一定的时间差别,而在这种细小的时间先后中,CPU已很充裕地完成了对各个用户的服务。所以,实际上是一种时间复用的服务方式。如果CPU接的外设太多,则用户仍会有等待的感觉。
2)实时处理。当计算机用于实时控制时,计算机在现场测试和控制、网络通信、人机对话时都会具有强烈的实时性,中断技术能确保对实时信号的处理。实时控制系统要求计算机为它们的服务是随机发生的,且时间性很强,要求及时发现并进行自动处理,实现实时处理。
3)故障处理。计算机运行过程中,往往会出现一些故障,如电源掉电、存储器读出出错、运算溢出,还有非法指令、存储器超量装载、信息校验出错等等。尽管故障出现的概率较小,但是一旦出现故障将使整个系统瘫痪。有了中断系统后,当出现上述情况时,CPU就转去执行故障处理程序而不必停机。中断系统能在故障出现时发出中断信号,调用相应的处理程序,将故障的危害降低到最低程度,并请求系统管理员排除故障。
(5)中断传送方式的特点。CPU和外设大部分时间处在并行工作状态,只在CPU响应外设的中断申请后,进入数据传送的过程,避免了CPU反复低效率的查询,大大提高了CPU的工作效率。对外设的请求能作出实时响应,并可用于故障处理。但中断处理过程比较复杂,外设应具有必要的联络(握手)信号(如READY等),实现中断系统的硬件电路和和软件编制都比较复杂。此外,中断方式的I/O操作还是由CPU控制,此时每传输一个数据,往往就要做一次中断处理,当I/O设备很多时,CPU可能完全陷入I/O处理中,甚至由于中断次数的急剧增加会造成CPU无法响应中断和出现数据丢失现象。
(6)适用场合。适于实时、快速、复杂的外设,且适用于CPU任务繁忙而数据传送不太频繁的系统中。但不适用于大量、高速频繁数据交换,此时应采用DMA等其他方式。
2.中断处理的完整过程
完整的中断工作过程应该包括5个步骤,即中断申请/请求、中断判优/排队(有时还要进行中断源识别)、中断响应、中断服务/处理(有时还要进行中断嵌套)和中断返回。图5-15为中断响应的整个过程示意图。
图5-15 中断响应的整个过程示意图
能够实现中断处理功能的部件称为中断系统(或称中断机构);能够向CPU发出中断请求的源称为中断源;中断源向CPU提出的处理请求,称为中断请求(或中断申请);CPU同意处理该请求称为中断响应;处理中断请求的程序称为中断服务(子)程序,而正在执行中断服务程序的处理中断过程称为中断处理(或中断服务);当CPU执行完中断服务子程序,返回断点继续执行被中断的程序,称为中断返回。另外,由于一般中断源有多个,而它们又有不同的优先级别,因此,当它们同时申请中断时,需要进行排队,从中选出优先级最高的中断,这称为中断排队;而当它们不同时申请中断时,可能会发生正在处理的中断被新的更高级别所中断的情况,这称为中断嵌套。
下面详细讨论中断处理过程的5个步骤。
(1)中断请求(也称中断申请)。
1)中断源。引起中断事件发生的原因或发出中断请求的来源,称为中断源。一般中断源有下面几种:
a.外部设备请求中断。一般的外部设备(如键盘、打印机、A/D转换器等)在完成自身的操作后,向CPU发出中断请求,要求CPU为它服务。
b.故障强迫中断。计算机在一些关键部位都设有故障自动检测装置(如运算溢出、存储器读出出错、外部设备故障、电源掉电以及其他报警信号等)。当这些装置出现某些故障,相关报警部件会向CPU发出中断请求,以便使CPU转去执行故障处理程序来解决故障。
c.实时时钟请求中断。在控制中常遇到定时检测和控制,为此常采用一个外部时钟电路(可编程)控制其时间间隔。需要定时时,CPU发命令使时钟电路开始工作,一旦到达规定的时间,时钟电路发出中断请求,由CPU转去完成检测和控制等工作。
d.软件中断源。在程序中向CPU发出中断指令(如8086 CPU为INT指令),可迫使CPU转去执行某个特定的中断服务程序,而中断服务程序执行完后,CPU又回到原程序中继续执行中断指令后面的指令。
e.为调试而设置的中断源。系统提供的单步中断、断点中断,可以使被调试程序在执行一条指令或执行到某个特定位置处时自动产生中断,从而便于程序员检查中间结果,寻找错误所在。
2)中断类型。按中断产生的方式,中断可分为自愿中断和强迫中断。即为:
a.自愿中断,即通过自陷指令引起的中断,或称软件中断,例如程序自愿中断。(www.xing528.com)
b.强迫中断,是一种随机发生的实时中断,例如外部设备请求中断、故障强迫中断、实时时钟请求中断、数据通道中断等。
按引起中断事件所处的地点,中断可分为内部中断和外部中断。即为:
a.外部中断(也称外部硬件实时中断)它由来自CPU外部事件,并通过CPU的某一引脚上的信号引起(例如,I/O外部设备或其他处理机等)。它以完全随机的方式中断现行程序,而转向另一处理程序。外部中断有下面2种来源:
(a)非屏蔽中断。通过不可屏蔽中断请求引脚输入的中断请求信号称作不可屏蔽中断请求,对于这种中断请求,不能被屏蔽,CPU必须响应。通常用于系统故障或实时时钟等引起的中断。
(b)可屏蔽中断。通过可屏蔽中断请求引脚输入的中断请求信号称作可屏蔽中断请求,对于这种中断请求,能被屏蔽掉,CPU可响应,也可不响应,具体取决于相应的屏蔽寄存器的状态。通常用于各种外设要求数据传送引起的中断。
因此,利用外部中断,CPU可以实时响应外部设备的数据传送请求,能够及时处理外部随机出现的意外或是紧急事件。
b.内部中断(也称软件指令中断或软件中断)。它来自CPU内部的中断事件,这些事件都是特定事件,一旦发生,CPU即调用预定的中断服务程序去处理。内部中断主要有下面3种来源:
(a)软件中断。执行软件中断指令时,会产生软件中断。例如,在8086 CPU系统中,INT指令会产生一个类型为n的中断,以便让CPU执行n号中断的中断服务程序。
(b)错误中断。由于CPU运算产生的某些错误(如除数为0的中断、溢出中断等)而引起。例如,在8086 CPU系统中,当执行除法指令时,如果除数为0或商数超过了最大值,CPU会自动产生类型为0的除法错误中断;如果运算产生溢出,标志寄存器中溢出标志位置1,在执行了INTO指令后,将产生类型为4的溢出中断。
(c)调试中断。由调试程序的需要而设置的单步中断、断点中断。例如,在8086 CPU系统中,当标志寄存器的标志位TF置1时,8086 CPU处于单步工作方式,此时CPU每执行完一条指令,自动产生类型为1的单步中断,直到将TF置0为止;执行断点指令INT 3将引起类型为3的断点中断。
利用内部中断,CPU为用户提供了发现、调试并解决程序执行异常情况的有效途径。
3)中断源的识别。由于计算机系统中存在许多中断源,当中断请求发生且CPU响应此中断时,CPU首先必须识别出是哪一个中断源引起的请求中断。只有知道了中断源,CPU才能转入到对应于该中断源的中断服务程序,并为其提供中断服务。
为了标记中断源,人们给系统中的每个中断源指定了一个唯一的编号,称为中断类型号。CPU识别请求中断来源的过程称为中断源的识别。实际上,CPU对中断源的识别就是获取当前中断源的中断类型号。
CPU在响应中断时,要执行该中断源对应的中断服务程序,那么CPU如何知道这段程序在哪儿呢?CPU一般通过查找中断矢量表来得知。中断服务程序的入口地址叫做中断矢量,而将全部中断矢量集中在一张表中,即中断矢量表。中断矢量表一般放置在内存的固定位置上。这张表中存放着所有中断服务程序的入口地址,而且根据中断类型号从小到大依次排列。8086 CPU就采用这种中断向量法来得到中断处理程序的首地址;而MCS-51单片机则采用更为简单的固定入口地址法。
中断源的识别有两个方法:
a.软件查询法。利用程序来查询设备的请求中断状态,从而确认出应该服务的设备号,并转入相应设备号的中断服务程序。
b.硬件法。CPU可识别出硬件排队电路中优先的设备,并取回占有优先权的设备的中断类型号(或设备地址编码),由此CPU识别出中断源,并转入相应的中断服务程序。
由于中断源识别与中断优先权排队两个过程的处理方法相同,因此,计算机中常把它们合并起来处理。
(2)中断排队(也称中断优先级排队或中断判优)。
1)中断优先级(也称优先权)的定义。在实际计算机系统中,常常遇到多个中断源同时请求中断的情况,而CPU在某一时刻只能做一项工作,因此,此时CPU必须确定首先为哪一个中断源服务以及服务的次序。解决的方法是用中断优先排队的处理方法,即根据中断源要求的轻重缓急(如紧迫性、实时性等),排好中断处理的优先次序,即优先级(也称优先权)。这样,同时有多个中断请求到来时,CPU先响应优先级最高的中断请求,在处理完优先权最高的中断请求后,再去响应其他较低优先级的中断请求。另外,当CPU正在处理中断时,也可能要响应更高级的中断请求,并屏蔽同级或较低级的中断请求。这些都需要分清各中断源的优先权。
中断源的优先权是根据它们的重要性事先规定好的。微机中一般规定优先级别为:内部中断(除单步中断以外)最高,外部不可屏蔽中断次之,可屏蔽中断再次之,单步中断最低。这样,不同级别的中断同时申请时,CPU根据级别高低依次决定响应顺序。
2)中断优先级控制要处理的情况。中断优先级控制要处理两种情况:
a.中断排队。对同时产生的中断,应首先处理优先级别较高的中断,若优先级别相同,则按先来先服务的原则处理。
b.中断嵌套。对非同时产生的中断,低优先级别的中断处理程序允许被高优先级别的中断源所中断,这就是所谓的中断嵌套。
下面先讨论同时来中断的中断排队,而不同时来中断的中断嵌套放在中断过程的第4步中断服务中再讨论。
3)中断优先级的控制方法。由于有的微处理器可有两条或更多的外部中断请求线,而且已经安排好中断的优先级,而有的微处理器仅只有1条外部中断请求线。凡是遇到外部中断源的数目多于CPU的外部中断请求线的情况时,就需要用户根据轻重缓急,采取适当的方法来安排中断优先级。
中断的优先级的控制方法有软件排队(也称软件判优或软件查询)、硬件排队(也称硬件判优)两种方法。另外,前面已述,通常将中断判优与中断源识别合并在一起进行处理。
a.软件排队。CPU响应中断后,在中断服务程序中用查询的方法判定外设的中断请求。查询的顺序反映了各个中断源的优先权的高低。显然,最先查询的外设,其优先权级别最高。
这种方法只需有简单的硬件电路,如图5-16所示电路。图中各中断源的优先权不是由硬件电路安排,而是由软件安排的。图中若干个外设的中断请求信号相“或”后,送至CPU的中断接收引脚INTR。这样,只要至少有任一台外设有中断请求,都可以向CPU发中断请求,CPU便可响应中断。在中断服务子程序前可安排一段优先级的查询程序,即CPU读取外设中断请求状态端口,然后根据预先确定的优先级级别逐位检测各外设的状态,若有中断请求就转到相应的处理程序入口。查询的前后顺序就给出了设备的优先级,其流程如图5-17所示。
图5-16 软件排队的电路
图5-17 软件排队的流程图
软件排队的优点:电路很简单,不需要有判断与确定优先权的硬件排队电路;修改优先级方便灵活,只要改变程序中的查询次序即可。软件排队的缺点:查询需要耗费时间,由询问转至相应的服务程序入口的时间长,尤其是在中断源较多的情况下,会影响中断响应的实时性。
b.硬件排队。它是指利用专门的硬件电路或中断控制器对系统中各中断源的优先权进行安排。根据采用硬件电路的不同,它又可分为菊花链式(也称雏菊花环式或链式或简单硬件)、优先权编码器(也称优先级编码器)、中断控制集成芯片(也称可编程的中断控制器)等3种硬件排队。
(a)链式硬件排队电路。此法将所有的设备连成一条链,靠近CPU的设备优先级最高,越远的设备优先级别越低,则发出中断响应信号,若级别高的设备发出了中断请求,在它接到中断响应信号的同时,封锁其后的较低级设备使得它们的中断请求不能响应,只有等它的中断服务结束以后才开放,允许为低级的设备服务。
链式优先权排队电路是一种简单的中断优先权硬件排队电路,如图5-18所示。采用该方法时,每个外设对应的接口上连接一个逻辑电路,这些逻辑电路构成一个链,称为菊花链,由该菊花链来控制中断响应信号的通路。当一个外设有中断请求时,CPU如果允许中断,则会发出信号。如果链条前端的外设没有发出中断请求信号,那么这级中断逻辑电路就会允许中断响应信号原封不动地往后传递,一直传到发出中断请求的外设;如果某一外设发出了中断请求,那么本级的中断逻辑电路就对后面的中断逻辑电路实现阻塞,使信号不再传到后面的外设。因而菊花链电路各个外设的中断优先权就由其在链中的位置决定,处于菊花链前端的比处于后端的优先级高。当某一外设收到中断响应信号后,就控制有关电路送出中断类型码,从而执行相应的中断服务程序。
图5-18 链式优先权的排队电路
当多个外设同时发出中断请求信号时,根据电路分析可知,处于链头的外设先得到中断响应,而排在菊花链中较后位置的外设就收不到中断响应信号,因而暂时不会被处理。若CPU正执行某个中断处理子程序,又有级别较高的外设提出中断请求,由于菊花链电路中级别低的外设不能封锁级别高的外设得到中断响应信号,故可响应该中断请求,从而发生中断嵌套现象。
(b)采用优先权的编码电路。此法采用优先权的编码电路来实现中断排队,图5-19为中断优先权编码电路。
若有8个中断源,当任一个有中断请求时,通过“或”门,即可有一个中断请求信号产生,但它能否送至CPU的中断请求线,还要受比较器的控制(若优先权失效信号为低电平,则与门2关闭)。
图5-19 中断优先权编码的排队电路
8条中断输入线的任一条,经过编码器可以产生3位二进制优先权编码A 2 A 1 A 0,优先权最高的线的编码为111,优先权最低的线的编码为000。而且若有多个输入线同时输入,则编码器只输出优先权最高的编码。正在进行中断处理的外设的优先权编码,通过CPU的数据总线DB,送至优先权寄存器,然后输出编码B2 B1 B0至比较器,以上过程是由软件实现的。
比较器比较编码A2 A1 A0与B2 B1 B0的大小,若A≤B,则“A>B”端输出低电平,封锁与门1,就不向CPU发出新的中断申请(即当CPU正在处理中断时,当有同级或低级的中断源申请中断时,优先权排队线路就屏蔽它们的请求);只有当A>B时,比较器输出端才为高电平,打开与门1,将中断请求信号送至CPU的INTR输入端,CPU就中断正在进行的中断处理程序,转去响应更高级的中断。
若CPU不在进行中断处理时(即在执行主程序),则优先权失效信号为高电平,当有任一中断源请求中断时,都能通过与门2,发出INTR信号。这样的优先权电路,如何能做到转入优先权最高的外设的服务程序的入口呢?当外设的个数≤8时,则它们公用一个产生中断矢量的电路,它有3位由比较器的编码A 2 A 1 A 0供给,就能做到不同的编码转入不同的入口地址。
4)中断控制集成芯片。中断控制集成芯片是专用于系统内可屏蔽硬件中断的控制,并管理系统的外部中断请求的芯片。图5-20为采用可编程的中断控制器芯片(如Intel8259A)的排队电路。
图5-20 中断控制集成芯片的排队电路
采用可编程中断控制器是当前微型计算机系统中解决中断优先权管理的常用方法。通常,中断控制器包括下列部件:中断优先权管理电路、中断请求锁存器、中断类型寄存器、当前中断服务寄存器以及中断屏蔽寄存器等。其中,中断优先权管理电路用来对所处理的各个中断源进行优先权判断,并根据具体情况预先设置优先权。实际上,中断控制器也可以认为是一种接口,外设提出的中断请求经该环节处理后,再决定是否向CPU传送,CPU接受中断请求后的中断响应信号也送给该环节处理,以便得到相应的中断类型码。
硬件判优的优点是查询速度快,它依靠硬件电路实现了优先权判断,无需软件按查询方式判断,响应中断速度很快。它的缺点是硬件电路复杂,且不能随意改变中断优先级别。
(3)中断响应。
1)中断响应的条件。中断可被响应的条件一般有:①中断源发出中断请求信号,并使中断请求触发器置位;②中断请求信号没有被中断屏蔽触发器屏蔽掉(即中断屏蔽触发器清零),也就是中断请求信号能顺利地发出去;③该中断请求是当作同时多个申请中断中优先权最高的中断请求信号,它能顺利地通过中断排队被选出来,也就是当前CPU未处理更高级中断;④CPU内部开放中断,也就是CPU本身允许被中断;⑤由于CPU在每条指令的最后一个时钟周期时检测是否有中断请求信号,因此,必须等待CPU现行指令执行完后,都会去响应检测到的中断请求;⑥可能还需其他的条件,如8086CPU中,对可屏蔽中断INTR,还应满足以下特殊条件:若当前指令是STI和IRET,则此指令下一条指令也要执行完;若当前指令带有LOCK、REP等指令前缀时,则把它们看成一个整体,要求完整地执行完;若非屏蔽中断NMI和可屏蔽中断INTR同时发生,则首先响应非屏蔽中断NMI;当前没有复位(RESET)和保持(HOLD)信号。
2)断点和现场的保护与恢复。中断响应时,一般首先都需保护断点和保护现场。①断点(也称断点地址)指CPU执行的现行主程序被中断的下一条待执行的指令的所在地址。它也是中断返回时的指令指针之值;②现场指中断发生前主程序的运行状态,它包括CPU执行主程序时所用到的相关寄存器、存储单元和标志位等。
为了保证中断处理结束后能返回主程序时,能继续正确地执行原来的主程序,中断系统必须能在中断发生时保护断点和保护现场,并在中断结束返回主程序时能恢复断点和恢复现场。
在中断响应过程中,断点的保护主要由硬件电路自动实现。它将断点压入堆栈,再将中断服务程序的入口地址送入程序计数器PC,使程序转向中断服务程序,即为中断源的请求服务。
现场保护的方法可以有:①通过堆栈推入指令PUSH;②通过寄存器区的切换(如单片机的4个区R0~R7);③通过微机内部存储器单元暂存。现场保护一定要位于中断服务程序的前面。
在结束中断服务程序返回断点处之前要恢复现场,与保护现场的方法相对应;而恢复断点是通过中断服务程序的最后一条中断返回指令RETI来实现,该指令会将压入堆栈中的断点弹出到程序计数器PC中,使CPU回到被中断的主程序继续执行。
3)中断响应过程。当某一外设需要CPU服务时,该中断源向CPU发出中断请求,CPU能决定是否响应该中断请求。若中断响应条件成立,则CPU允许响应该中断请求,并可能向该中断源发出中断响应信号,CPU在现行的指令执行完后,会把中断断点处的PC地址(即下一条将执行的指令地址)自动压入堆栈保留起来(相当于执行堆栈压入指令PUSH),而中断现场的各个寄存器的内容和标志位的状态,则需要用户通过堆栈压入指令PUSH(或其他办法)保存起来,这就是上面所说的保护断点和保护现场。然后跳转到需要处理的中断源的服务程序入口(即中断服务程序的首地址),同时自动清除中断请求触发器,自动关闭中断。
那么,CPU是如何得到中断处理程序的首地址?不同的微机可能得到首地址的方法不一样。例如,由于8086CPU可以有256种不同的中断源,它采用前面介绍过的中断向量法得到首地址;而由于MCS-51单片机仅有5个(51子系列)或6/7个(52子系列)中断源,它采用固定入口法,即5/6/7个中断源的入口地址是固定不变的。
图5-21 中断处理的过程
(4)中断处理(也称中断服务)。
1)中断处理的过程。中断处理的过程就是CPU运行中断服务程序的过程,这一步骤对所有中断源都一样。所谓中断服务程序,就是为实现中断源所期望达到的功能而编写的处理程序。中断服务程序一般由保护断点和现场、开中断、中断服务、关中断、恢复现场、中断返回6部分组成,图5-21为中断处理的过程。其中保护断点是CPU自动完成的,用户无需编程,而保护现场需要用户编程来完成,保护现场的原因是有些寄存器可能在主程序被打断时存放有用的内容,为了保证返回后不破坏主程序在断点处的状态,应将有关寄存器的内容保存起来。恢复现场是指中断服务程序完成后,把原先保存起来的现场寄存器内容恢复到CPU相应的寄存器中。有了保护现场和恢复现场的操作,就可保证在返回断点后,正确无误地继续执行原先被打断的程序。中断服务部分是整个中断服务程序的核心,其代码完成与中断任务相关的数据处理。中断服务程序的最后部分是一条中断返回指令RETI,实际上它就是做恢复断点工作。图5-21中的开中断和关中断这两步主要是为了允许中断嵌套,如果不允许中断嵌套,则可省去这两步。
2)对中断的控制。微机具有多级(或称多重)中断功能(也即中断嵌套),为了不至于在保护现场或恢复现场时,由于CPU响应其他中断请求,而使现场破坏。一般规定,在保护和恢复现场时,CPU不响应外界的中断请求,即关中断。因此,在编写程序时,应在保护现场和恢复现场之前,关闭CPU中断;在保护现场和恢复现场之后,再根据需要使CPU开中断。
对于重要中断,不允许被其他中断所嵌套。除了设置中断优先级外,还可以采用关中断的方法,彻底屏蔽其他中断请求,待中断处理完之后再打开中断系统。
3)中断嵌套(或称多重中断)。当CPU执行优先级较低的中断服务程序时,若有更高级别的新中断源发出请求,且新中断源满足响应条件,CPU允许响应优先级比它高的中断源请求中断,而挂起正在处理的较低优先级中断,这就是中断嵌套或称多重中断。此时,CPU将暂时中断正在进行着的级别较低的中断服务程序,优先为级别高的中断服务。待优先级高的中断服务结束后,再返回到刚才被中断的较低优先级的那一级,继续为它进行中断服务。
需要注意的是:低级(或同级)中断源不能中断高级(或同级)的中断处理。某些计算机的中断系统可能对中断嵌套的层数有一定限制。
多重中断流程的编程与单级中断的编程的主要区别有:①加入屏蔽本级(或称同级)和低级中断请求的环节。这是为了防止在进行中断处理时,不致受到来自本级和低级中断的干扰,并允许优先级比它高的中断源进行中断;②在进行中断服务之前,要开中断。因为如果中断仍然处于禁止状态,则将阻碍较高级中断的中断请求和响应,所以必须在保护现场、屏蔽本级及低级中断完成之后,开中断以便允许进行中断嵌套;③中断服务程序结束之后,为了使恢复现场过程不致受到任何中断请求的干扰,必须安排并执行关中断指令,将中断关闭,才能恢复现场;④恢复现场后,应该安排并执行开中断指令,重新开中断,以便允许任何其他等待着的中断请求有可能被CPU响应。应当指出,只有在执行了紧跟在开中断指令后面的一条指令以后,CPU才重新开中断。一般紧跟在开中断指令后的是返回指令RETI,它将把原来被中断的服务程序的断点地址弹回PC(即恢复断点),然后CPU才能开中断,响应新的中断请求。
上面提到了“中断屏蔽”,所谓“中断屏蔽”就是在某些情况下CPU不对已发出的中断请求作出响应或处理,就称为该中断请求被“屏蔽”掉了。中断屏蔽可能发生在下面两种情况下:①中断系统设置了中断屏蔽标志(或中断允许标志),以屏蔽某些中断源的请求,这需要用户根据情况,通过指令来置位或复位中断屏蔽标志;②当系统在处理优先级别较高的中断请求时,不会理睬新来的级别较低或同级的中断请求,中断系统一般会自动屏蔽低级或同级中断,一般无需用户专门编程。
如果一个系统中有3个中断源,优先权的安排为:中断1为最低,中断2次之,中断3为最高,则中断嵌套示意图如图5-22所示。
图5-22 中断嵌套示意图
(5)中断返回。中断处理完毕,除恢复现场(即恢复被保留下来的各个寄存器和标志位的状态)外,最后还需恢复断点(即恢复被中断的程序的下一条指令PC值),使CPU返回断点,并从断点处继续执行被中断的程序。恢复断点一般采用执行中断返回指令RETI来实现,RETI指令将使CPU把保存在堆栈内的断点地址弹出到指令计数器PC中,相当于执行堆栈弹出指令POP。
3.中断过程与主程序调用子程序过程的比较
表面上看,中断过程与主程序调用子程序过程有相似之处,但实质上,两个过程有根本的区别。正是由于它们表面上相似,很容易使学生把两者混淆起来,特别是把中断也看作子程序,那就大错特错了。下面就把这两个过程做详细的比较。
(1)两者的定义和作用。实际上,中断过程与主程序调用子程序过程属于完全不同的概念。其中:调用子程序过程相对比较容易掌握。子程序是微机基本程序结构中的一种,基本程序结构包括顺序(简单)、分支(判断)、循环、子程序和查表5种。子程序是一组可以公用的指令序列,只要给出子程序的入口地址就能从主程序转入子程序。子程序在功能上具有相对的独立性,在执行主程序的过程中往往被多次调用,甚至被不同的程序所调用。一般微机首先执行主程序,碰到调用指令就转去执行子程序,子程序执行完后,返回指令就返回主程序断点(即调用指令的下一条指令),继续执行没有处理完的主程序,这一过程叫做(主程序)调用子程序过程。子程序结构可简化程序,防止重复书写错误,并可节省内存空间。计算机中经常把常用的各种通用的程序段编成子程序,提供给用户使用。
中断是计算机CPU与外设I/O交换数据的一种方式,除此方式外,还有无条件、条件(查询)、存储器直接存取DMA和I/O通道4种方式。由于无条件不可靠、条件效率低、DMA和I/O通道两方式硬件复杂,而中断方式的CPU效率高,因此一般大多采用中断方式。当计算机正在执行某一(主)程序时,收到中断请求,如果中断响应条件成立,计算机就把正在执行的程序暂停一下,去响应处理这一请求,执行中断服务程序,处理完服务程序后,中断返回指令使计算机返回原来还没有执行完的程序断点处继续执行,这一过程称为中断过程。有了中断,计算机才能具有并行处理、实时处理和故障处理等重要功能。
(2)两者的相同点。尽管中断与调用子程序两过程属于完全不同的概念,但它们有一定的相似之处。
1)调用过程相似。两者都需要保护断点(即下一条指令地址)、跳至子程序或中断服务程序、保护现场、子程序或中断处理、恢复现场、恢复断点(即返回主程序)。两者都是中断当前正在执行的程序,转去执行子程序或中断服务程序。两者都是由硬件自动地把断点地址压入堆栈,然后通过软件完成现场保护。两者执行完子程序或中断服务程序后,都要通过软件完成现场恢复,并通过执行返回指令,重新返回到断点处,继续往下执行程序。
2)嵌套方式相似。两者都可实现嵌套,即正在执行的子程序再调另一子程序或正在处理的中断程序又被另一新中断请求所中断,嵌套可为多级。
(3)两者的不同点。中断过程与调用子程序过程相似点仅是表面的,从本质上讲两者是完全不一样的。两者的根本区别主要表现在服务时间、服务对象等多个方面。
1)服务时间不同。调用子程序过程发生的时间是已知和固定的,即用户在主程序中安排了调用指令(CALL)时,当执行到该指令时才会发生主程序调用子程序,因此调用指令所在位置是已知和固定的;而中断过程发生的时间一般是随机的,CPU在执行某一主程序时收到中断源提出的中断申请时,就发生中断过程,而中断申请一般是硬件电路产生,申请提出时间是随机的(除软中断发生时间是固定的外),也可以说,调用子程序是程序设计者事先安排的,而执行中断服务程序是由系统工作环境随机决定的。
2)服务对象不同。子程序是完全为主程序服务的,两者属于主从关系,主程序需要子程序时就去调用子程序,并把调用结果带回主程序继续执行;而中断服务程序与主程序两者一般是无关的,不存在谁为谁服务的问题,两者是平行关系。
3)系统结构不同。主程序调用子程序过程完全属于软件处理过程,不需要专门的硬件电路。而中断处理系统是一个软、硬件结合系统,需要专门的硬件电路才能完成中断处理的过程。
4)入口地址不同。子程序入口地址是由主程序的调用指令设定;而中断响应后由固定的中断矢量地址得到中断服务程序的入口地址。
5)响应时间不同。主程序调用子程序响应时间是固定的且可估算;而中断响应是受多控的,其响应时间会受一些因素影响,其响应时间一般难以估算。
6)同时调用的个数不同。不存在主程序同时调用多个子程序的情况,因此子程序不需要进行优先级排队;而不同的中断源可能同时提出服务请求,需要通过优先级排队选出最高级中断请求来调用响应之。
7)不同时调用的重数不同。子程序嵌套是在程序中事先安排好的,子程序嵌套可实现若干级,一般无次序限制,其嵌套的最多级数是由计算机内存开辟的堆栈大小限制;而中断嵌套是随机发生的,中断嵌套级数主要由中断优先级数来决定,中断嵌套只允许高优先级“中断”低优先级,一般优先级数不会很大。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。