第7章中断技术2011-107中断技术7.1中断的基本概念什么是中断?与生活场景的比较正在看书电话铃响接电话继续看书执行程序事件发生事件处理继续执行程序中断处理中断请求及响应实际场景计算机中断返回中断的定义CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(称为中断服务程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断。INTIRET中断服务程序主程序×发生事件中断源定义:引起CPU中断的事件——中断源。例如:外设—请求输入输出数据,报告故障等事件—掉电、硬件故障、软件错误、非法操作、定时时间到等中断源分类:外部中断、内部中断内部中断:CPU内部执行程序(INTn等)时自身产生的中断外部中断:CPU以外的设备、部件产生的中断8086/8088的外部中断信号:INTR、NMIINTR——可屏蔽中断请求,高电平有效,受IF标志的控制。IF=1时,执行完当前指令后CPU对它作出响应。NMI——非屏蔽中断请求,上升沿有效,任何时候(要结束当前指令)CPU都要响应此中断请求信号。计算机中要引入中断的原因?提高数据传输率;避免了CPU不断检测外设状态的过程,提高了CPU的利用率(并行操作)。实现对特殊事件的实时响应(实时处理/故障处理)。如多任务系统操作系统中:缺页中断设备中断各类异常实时时钟,…等中断过程五个步骤:中断请求中断判优/排队(有时还要进行中断源识别)中断响应中断服务/处理中断返回请求排队响应服务/处理返回IRET硬/软INTn主程序中断服务程序以下以外部中断为主介绍这五个步骤。1)中断请求外设接口(中断源)发出中断请求信号,送到CPU的INTR或NMI引脚;中断请求信号类型:边沿请求,电平请求例如,NMI为边沿请求,INTR为电平请求中断请求信号应保持到中断被处理为止(防止重复响应);CPU响应中断后,中断请求信号应及时撤销。在8086/8088系统中,外设的中断要经过8259A可编程中断控制器(PIC)的排队判优后向CPU发出:(I/O接口)→PIC(8259)→CPU2.1)中断源识别计算机中的中断源有很多,CPU必须识别是哪一个设备产生中断。识别中断源有两个方法:软件查询。将中断信号从数据总线读入,用程序进行判别。硬件法(中断矢量法)。由中断源提供中断类型号n,CPU根据类型确定中断源。(8086/8088即采用此种方法)2)中断判优多个中断源产生中断,CPU首先为谁服务?——中断优先级排队问题。中断优先级控制要处理两种情况:对同时产生的中断:应首先处理优先级别较高的中断;若优先级别相同,则按先来先服务的原则FIFO处理;对非同时产生的中断:低优先级别的中断处理程序允许被高优先级别的中断源所中断——即允许中断嵌套。中断优先级的控制方法:硬件判优——链式判优、并行判优(中断向量法)软件判优——顺序查询中断请求,先查询的先服务(即先查询的优先级别高)通常将中断判优与中断源识别合并在一起进行处理。x86系统中,这项任务由PIC(8259)和CPU(8086/8088)共同完成。用软件确定中断优先权软件判优的特点查询方法的优点是:(1)询问的次序即是优先权的次序。显然,最先询问的,优先权的级别最高。(2)省硬件。不需要有判断与确定优先权的硬件排队电路。但随之而来的缺点是:由询问转至相应的服务程序入口的时间长,尤其是在中断源较多的情况下。硬件优先权排队电路1.中断优先权编码电路正在进行中断处理的外设的优先权编码8个新中断源8个中任一个有中断请求时,通过“或”门,即可有一个中断请求信号产生硬件编码器和比较器的优先权排队电路若有8个中断源,当任一个有中断请求时,通过“或”门,即可有一个中断请求信号产生,但它能否送至CPU的中断请求线,还要受比较器的控制(若优先权失效信号为低电平,则与门2关闭)。8条中断输入线的任一条,经过编码器可以产生三位二进制优先权编码A2A1A0,优先权最高的线的编码为111,优先权最低的线的编码为000。而且若有多个输入线同时输入,则编码器只输出优先权最高的编码。正在进行中断处理的外设的优先权编码,通过CPU的数据总线,送至优先权寄存器,然后输出编码B2B1B0至比较器,以上过程是由软件实现的。比较器比较编码A2A1A0与B2B1B0的大小,若A≤B,则“A>B”端输出低电平,封锁与门1,就不向CPU发出新的中断申请(即当CPU正在处理中断时,当有同级或低级的中断源申请中断时,优先权排队线路就屏蔽它们的请求);只有当A>B时,比较器输出端才为高电平,打开与门1,将中断请求信号送至CPU的INTR输入端,CPU就中断正在进行的中断处理程序,转去响应更高级的中断。若CPU不在进行中断处理时(即在执行主程序),则优先权失效信号为高电平,当有任一中断源请求中断时,都能通过与门2,发出INTR信号。这样的优先权电路,如何能做到转入优先权最高的外设的服务程序的入口呢?当外设的个数≤8时,则它们公用一个产生中断矢量的电路,它有三位由比较器的编码A2A1A0供给,就能做到不同的编码转入不同的入口地址。INTAinCPUINTAINTR外设1外设2外设接口1菊花链逻辑电路外设接口2外设3外设接口3≥1菊花链逻辑电路菊花链逻辑电路┇IREQIREQIREQ中断确认链式判优电路原理图INTAinINTAin中断确认中断确认中断控制器2.雏菊花环式或称为链式优先权排队电路E菊花链逻辑电路INTAinIREQINTR&=1≥1INTAoutDB三态门中断向量码nE外设接口中断确认菊花链逻辑电路3)中断响应在每条指令的最后一个时钟周期,CPU检测INTR或NMI信号。若以下中断响应条件成立,则CPU响应中断:当前指令执行完。有中断请求发出且没有被屏蔽掉(中断请求可送到CPU的INTR或NMI)。对INTR(了解:还应满足以下特殊条件:•当前指令是STI和IRET,则下条指令也要执行完。•当前指令带有LOCK、REP等指令前缀时,则把它们看成一个整体,要求完整地执行完;)对INTR,CPU应处于开中断状态,即IF=1;当前没有复位(RESET)和保持(HOLD)信号。若NMI和INTR同时发生,则首先响应NMI。3)中断响应(续)CPU中断响应时,要做下述几项工作:对INTR,向中断源发出INTA中断响应信号;自动关中断,即IF=TF=0(关可屏蔽中断和单步中断);断点保护,包括CS、IP和FLAGS。主要是保证中断结束后能返回被中断的程序----PUSHCS/IP/FLAGS获得中断服务程序首地址(入口)---JMPCS’:IP’如何得到中断处理程序的首地址?•固定入口法----MCS-51单片机中•中断向量法——常用,如:X86中4)中断处理(中断服务)中断服务子程序特点为”远”过程(类型为FAR或far)要用IRET指令返回---POPFLAGS/IP/CS中断服务子程序要做的工作保护现场(PUSHreg’s)开中断IF=1(STI)---允许中断嵌套进行中断处理---用户根据中断处理任务编写恢复现场(POPreg’s)中断返回(IRET)中断返回IRET主程序中断服务程序保护现场PUSH开中断STI中断处理恢复现场POP关中断CLI开中断STI现场断点中断嵌套5)中断返回执行中断返回指令IRETIRET指令将使CPU把堆栈内保存的断点信息弹出到IP、CS和FLAGS中,保证被中断的程序从断点处能够继续往下执行。---相当于POPIP/CS/FLAGSIPLIPHCSLCSHFLAGLFLAGHSPIPLIPHCSLCSHFLAGLFLAGHSPIPCSFLAG进入中断服务程序时中断返回后7.28088/8086的中断系统8088/8086系统的中断源1内部中断除法溢出:类型号0,执行除法指令时,若发现除数为0或商大于目的操作数所能表达的范围时产生。单步中断:类型号1,TF=1时产生(当前指令需执行完)。断点中断:类型号3,这是一个软件中断,即INT3指令。一般用于程序调试,在断点中断服务程序中,可显示有关寄存器、存储单元等内容,以便程序员分析到断点为止程序是否正确。溢出中断:类型号4,这是一个软件中断,即INTO指令。若算术指令的执行结果发生举出(OF=1),则执行指令后立即产生一个中断类型码为4的中断。软件中断:即INTn指令,类型号n(0-255)。由用户自定义,也可以用来模拟任何类型的中断。单步中断---1型中断CPU每执行完一条指令都会检查陷阱标志TF的状态。若TF=1,则CPU就产生中断类型1的中断,使CPU转向单步中断的处理程序。单步中断可用于程序的调试,使CPU一次执行一条指令,从而能够逐条地观察程序运行情况。注意:(1)所有类型的中断在其处理过程中,CPU会自动地把状态标志压入堆栈,然后清除TF和IF。因此,当CPU进入单步中断处理程序时,就不再处于单步工作方式,而以正常方式工作。只有在单步处理结束时,从堆栈中弹出原来的标志,才使CPU又回到单步方式;(2)8086/8088指令系统中无设置或清除TF标志指令,但可通过其他方式对TF置位或复位。PUSHFPHSHFPOPAXPOPAXORAX,0100H;置位TFANDAX,0FEFFH;复位TFPUSHAXPUSHAXPOPFPOPFODITSZAPC1502467891011FLAGS2外部中断与中断有关的控制线为:NMI和INTR、INTA非屏蔽中断NMI:类型号2,不可用软件屏蔽,CPU必须响应它。可屏蔽中断INTR:类型号n由PIC(8259)提供。IF=1时CPU才能响应,CPU响应信号为INTA。NMIINTR中断逻辑软件中断指令溢出中断除法错单步中断非屏蔽中断请求中断控制器8259APIC8086/8088CPU内部逻辑断点中断8086/8088中断源类型可屏蔽中断请求n43012n内部/软件中断请求中断请求\排队\屏蔽INTA内部排队中断开关外部/硬件中断请求DB中断指令INTn软件硬件(n=0~255)中断源的识别8088/8086系统采用中断类型码n来识别不同的中断源。每个中断源都有一个与它相对应的中断类型码n。溢出、断点、除法溢出、单步、非屏蔽中断的类型码为固定值(4、3、0、1、2)软件中断的类型码由指令INTn给出(n)可屏蔽中断的类型码由PIC(8259)给出(n)CPU响应INTR中断时,会产生两个中断响应总线周期INTA,要求PIC8259在第2个中断响应总线周期把中断类型码n放到数据总线上,供CPU读入。中断向量表(IVT)存放各类中断的中断服务程序的入口地址CS:IP(段CS和偏移IP)——中断向量表的地址位于内存的00000H~003FFH,大小为1KB,共256个中断向量(中断向量表)每个中断向量占用4Bytes,低字为段内偏移IP,高字为段基址CS根据中断类型号n获得中断服务程序入口的方法:(n为中断类型号)中断向量在IVT中的存放地址=4×n(中断向量地址)中断向量表的初始化初始化——将中断服务程序的入口地址放入向量表例:中断类型码n为48H的中断处理子程序的名字为int48h,编写程序段将该中断处理子程序的入口地址(中断向量)放入中断向量表。高8位低8位中断向量表的初始化方法1:利用传送指令:CLIPUSHDSMOVAX,0;也可XORAX,AXMOVDS,AXMOVSI,48H*4MOVAX,OFFSETint48hMOV[SI],AXMOVAX,SEGint48hMOV[SI+2],AXPOPDSSTIRETIInt48h48H*4方法2:采用DOS功能调用“INT21H”中的AH=25H来装入中断向量:MOVAX,N;中断类型号MOVAH,25H;设置中断向量MOVDX,SEG_INTRMOVDS,DX;DS指向中断程序段址MOVDX,OFF