一、中断系统概述 ?
1、引起中断的各种因素
(1)人为设置的中断
这种中断一般称为自愿中断,因为它是程序中人为设置的,故一旦机器执行这种人为中断,便自愿停止现行程序而转入中断处理。
(2)程序性事故
如定点溢出、浮点溢出、操作码不能识别、除法中出现“非法”等,这些都属于由程序设计不周而引起的中断。
(3)硬件故障
如插件接触不良,通风不良、磁表面损坏、电源掉电等,这些都属寸硬发备故障。
(4)I/O设备
I/O设备被启动以后,一旦准备就绪,便向CPU发出中断请求。
(5)外部事件
用户通过键盘来中断现行程序属于外部事件中断。
通常将能引起中断的各个因素称为中断源。
中断源可分为两大类:
一类为不可屏蔽中断,这类中断CPU不能禁止,如电源掉电;
另一类为可屏蔽中断,对可屏蔽中断源的请求,CPU可根据该中断源是否被屏蔽来确定是否给予响应。若未屏蔽则能响应;若已被屏蔽,则CPU不能响应。
2、中断系统需要解决的问题列举
(1) 各中断源 如何 向 CPU 提出请求 ?
(2) 各中断源 同时 提出 请求 怎么办 ?
(5) 如何 寻找入口地址 ?
(4) 如何 保护现场 ?
(3) CPU 什么 条件、什么 时间、以什么 方式响应中断 ?
(6) 如何 恢复现场,如何 返回 ?
(7) 处理中断的过程中又 出现新的中断 怎么办 ?
要解决上.述7个问题,只有在中断系统中配置相应的硬件和软件,才能完成中断处理任务。 ?
?
二、中断请求标记和中断判优逻辑??
中断请求标记
给每一个中断源设置一个触发器,用这个触发器来标记这个中断源是否提出了中断请求,一个中断源对应一个中断请求标志触发器,同理多个中断源就对应多个触发器,组成一个下图的中断请求标记寄存器
中断判优逻辑
如果有多个中断源发出中断请求,应该优先响应哪一个?------响应对系统影响最大最重要的
任何一个中断系统,在任一时刻,只能响应一个中断源的请求。当某一时刻多个中断源提出中断请求时,中断系统必须按其优先顺序予以响应,这称为中断判优。
各中断源的优先顺序是根据该中断源若得不到及时响应,致使机器工作出错的严重程度而定的。
中断判优可用硬件实现,也可用软件实现。
(1)硬件排队
硬件排队又可分为两种。
1、链式排队器,对应中断请求触发器分散在各个接口电路中的情况,每一个接口电路中都设有一个非门和一个与非门,它们犹如链条一样串接起来。
2、排队器设在CPU内,当最高优先级的中断源有请求时INTR1=1,就可封住比它优先级低的中断源的请求,如下图
如果INTR1有中断请求,那么后面优先级低的都不能有中断请求,
INTR1输入? INTP1输出
顺序:先对中断源的优先级排序---->设计排队器---->中断源排列好以响应
(2)软件排队
软件排队是通过编写查询程序实现的。程序按中断源的优先等级,从高至低逐级查询各中断源是否有中断请求,这样就可以保证CPU首先响应级别高的中断源的请求。
?
?三、中断服务程序入口地址的寻找
1、硬件向量法
用硬件的方法形成中断向量地址从而去寻找中断地址
下图是排队器的输出,在输出的众多线中,只有一根是高低频1,其余都是低电频0,即使优先级低的有中断请求,也会被优先级最高的那位屏蔽掉,这个输出指出了目前所有申请中断的中断源中哪个优先级最高,就可以根据最高优先级去执行指出的中断服务
中断服务程序的入口地址有两种办法给出
1、中断向量地址的存储单元中存放一条跳转指令,CPU响应中断时,只要将向量地址送至PC,执行这条指令,便可无条件转向打印机服务程序的入口地址200。
2、给出向量地址表,该表设在存储器内,那么存储单元的地址为向量地址,存储单元的地址为入口地址。只要访问向量地址所指示的存储单元,便可获得入口地址。
硬件向量法寻找入口地址速度快
2、软件查询法
用软件寻找中断服务程序入口地址的方法称为软件查询法。当查到某一中断源有中断请求时,接着安排一条转移指令,直接指向此中断源的中断服务程序入口地址,机器便能自动进入中断处理。
这种方法不涉及硬件设备,但查询时间较长。
如果想改变中断服务的优先级,就可以调整查询的次序 ,更灵活? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
四、中断响应
不是每个中断都一定会被执行,需要条件才可以: 1、响应中断的条件
当EINT=1,且有中断请求(即中断请求标记触发器INTR=1)时,CPU可以响应中断。
2、响应中断的时间
指令执行周期结束时刻由CPU发查询信号
之所以CPU在指令的执行周期后进入中断周期,是因为CPU在执行周期的结束时,统一向所有中断源发出中断查询信号,只有此时CPU才能获知哪个中断源有请求。
可在指令执行过程中设置若干个查询断点,CPU在每个“查询断点”时刻均发中断查询信号,以便发现有中断请求,CPU便可及时响应。
CPU的查询信号送到每一个中断源中的中断触发器,驱动触发器的输出端置为1,然后把中断请求信号发送到排队器
?3、中断隐指令
(1)保护程序断点
因为中断服务结束后,程序要返回到断点继续执行,断点的保护有两种方法,第一种方法是将断点存在特定地址(0号地址)中,第二种方法是断点进栈
也就是说它可以存在存储器的特定单元内,也可以存入堆栈。
(2)寻找中断服务程序的入口地址
由于中断周期结束后进入下条指令(即中断服务程序的第一条指令)的取指周期,因此在中断周期内必须设法找到中断服务程序的入口地址。
有两种方法寻找入口地址:
在中断周期内,将向量地址送至PC(对应硬件向量法),这个向量地址中包含了中断服务程序的入口地址或是一条跳转指令,使CPU执行下一条无条件转移执行,转至中断服务程序入口地址。 在中断周期内,将软件查询入口地址的程序(又称中断识别程序)首地址M送至PC,使CPU执行中断识别程序,找到入口地址(对应软件查询法)
(3)关中断
关中断避免在单重中断的机器中或执行中断服务的过程中出现新的中断源
在多重中断的机器中采用关中断也是有利于保存程序断点,保护程序现场的作用
简单来说,关中断就是将中断允许触发器的值置为0
CPU进入中断周期,意味着CPU响应了某个中断源的请求,为了确保CPU响应后所需做的一系列操作不至于又受到新的中断请求的干扰,在中断周期内必须自动关中断,以禁止CPU再次响应中断请求。
INT 中断标记触发器:当前有中断请求
EINT 中断允许触发器:在当前时间CPU是否响应新的中断请求
什么时候可以响应中断??
当EINT的输出为“1”且有中断请求时,并且下图的排球器输出的这么多信号中至少要有一个信号等于1,也就是说,当二者都为1时,才表示确实有中断请求提出并且要响应中断,那么通过s接口将INT也置为1,当INT变为1时,紧接着EINT就要马上变为0,然后将排队器输出的结果送给向量地址形成部件,这个向量地址再送给PC
【当进入中断周期时,INT为“1”状态,触发器原端输出有一个正跳变,经反相后产生一个负跳变,使EINT置“0”,即关中断。】
以下三个操作都是在中断周期内由一条中断隐指令完成的。
中断隐指令:即在机器指令系统中没有的指令,它是CPU 在中断周期内由硬件自动完成的一条指令。
五、保护现场和恢复现场
?
保护现场:应该包括保护程序断点和保护CPU内部各寄存器内容的现场两个方面。程序断点的现场由中断隐指令完成,各寄存器内的现场可在中断服务程序中由用户(或系统)用机器指令编程实现。
恢复现场:是指在中断返回前,必须将寄存器的内容回复到中断处理前的状态,这部分工作也由中断服务程序完成。 ?
保护现场就是把寄存器的内容保存到堆栈中,使用PUSH指令压入栈完成
其他服务程序包括比如中断服务程序中剩余的一些部分
恢复现场就是再把寄存器的内容弹出栈中,使用POP指令完成
六、多重中断
如果在执行中断服务程序的过程中,出现了更重要的,需要及时处理的新事件,怎么办呢? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ---------------------使用多重中断
1、多重中断:CPU执行中断的过程中,出现了比当前中断优先级更高更重要的中断指令,CPU就会暂停中断当前这个指令,然后去响应新的更重要的中断指令,?假如又出现了更高更重要的中断指令,那么它会再一次暂停当前的中断去响应新的中断,然后再依次返回
如下图,产生了三次中断,有三个程序断点
?2.实现多重中断的条件
1、提前设置开中断指令【EINT提前被打开】
多重中断“开中断”指令的位置前于单重中断,从而保证了多重中断允许出现中断嵌套。
2、优先级别高的中断源才有权中断优先级别低的中断源 ?
过程简单描述:
比如如下四个中断程序优先级按降序排列好,主程序发出两个中断请求B、C,因为B高于C,所以执行B的中断,执行完后B返回,返回到主程序时C还是在的,再继续响应C的中断,C正在执行的时候跑出来一个D,由于D优先级更低所以CPU此时不会理会D,等C执行完后才会执行D,在执行D的时候跑出来一个A,由于A的优先级高于D,所以程序会马上暂停D,去响应A的请求,而当A执行完后才会回去D继续执行刚才D未执行的部分,最终返回主程序
3、中断屏蔽技术
就是通过设置中断屏蔽字来改变中断服务的优先级,从而提高系统设计
其中,中断屏蔽字的设置通过设置中断屏蔽触发器来完成
(1)屏蔽触发器的作用
INTR中断请求寄存器,MASK中断屏蔽触发器,D是完成触发器(表示设备已完成工作),它会向CPU提出中断请求,前提当这个请求没被屏蔽掉时就可以【即MASK的Q=0时】
如果Q=1,表示被屏蔽掉了,那么无论如何INTR的输出都会是0,不会有中断提出
当Q=0时,没有屏蔽,且D的输出端与MASK的输出端都为1就可以在CPU查询的机制下提出中断请求,那么INTR输出端就会变为1,
还有一种方式,将排队器与中断屏蔽触发器结合使用
每一个MASK执行一个中断请求,每一个中断请求对应一个中断屏蔽字,字的长度和中断源的长度相等,每一个MASKi对应了中断屏蔽字中的一位
总结:屏蔽触发器的作用就是使某一个中断源无法向CPU提出中断请求,也不能参加中断优先级的排队
(2)屏蔽字
对应每个中断请求触发器就有一个屏蔽触发器,将所有屏蔽触发器组合在一起,便构成一个屏蔽寄存器,屏蔽寄存器的内容称为屏蔽字。屏蔽字与中断源的优先级别是一一对应的。
在中断服务程序中设置适当的屏蔽字,能起到对优先级别不同的中断源的屏蔽作用。
每一个中断源对应一个屏蔽字,如下图
在优先级最高的中断程序中,1-16号中断源都为1,都会被屏蔽
(3)屏蔽技术可以改变处理优先等级(屏蔽字不能改变)
响应优先级是由硬件完成的,所以不能被改变
而处理优先级可以改变,通过重新设置屏蔽字完成,如下图
响应优先级顺序ABCD定了不能变,但如果我们重新设置屏蔽字,可以使得优先级变为ADCB(简单来说1越多越不容易被打断等级越高)
左图是没修改前的顺序:ABCD
右图是修改后的:A的优先级最高A先执行,其他程序都不能打断它,当A执行完返回主程序,主程序此时为【0,0,0,0】(初始都是全0),然后继续开始执行中断,按顺序来到了B,B执行到一半,CD也来发出请求,B一看自己的优先级不如C高,于是CPU暂停B开始执行C,C执行一会发现还有D在请求,而且D比自己优先级高,于是再次暂停开始执行D,等D执行完再依次返回到C->B->主程序
?
?
(4)屏蔽技术的其他作用
屏蔽技术还能给程序控制带来更大的灵活性
?
(5)新屏蔽字的设置
?
?4、多重中断的断点保护
中断系统对断点的保存都是在中断周期内由中断隐指令实现的,对用户是透明的。
断点可以保存在堆栈中,由于堆栈先进后出的特点,出栈时按相反顺序便可准确返回到程序的间断处。
断点也可保存在特定的存储单元内,例如约定一律将程序断点存至主存的0号地址单元内。在中断服务程序中的开中断指令之前,必须先将0地址单元的内容转存至其他地址单元中,才能真正保存每一个断点。
但是有一个问题!!
如果我们每次都将断点存入0地址,假如发生了三次中断,就会有三个断点k+1,l+1,m+1,那么后一个中断0地址就会冲掉前一个0地址,那么至少两个断点内容会丢失,那么如何保证断点不丢失呢???
?
程序断点存入0地址的断点保护
假如进行一个加法运算:
首先有一个断点内容存入0地址,SERVE是中断服务程序入口,将ACC寄存器内容保存在SAVE中保护现场,然后LDA进行取数操作,将地址为0的内存单元中的数【实际上就是断点】取出来也放入ACC寄存器,STA操作将断点保存在RETURN单元中,然后进行开中断操作,再恢复现场,即将SAVE中的内容再送回ACC中,然后JMP跳转指令跳到RETURN中刚才保存的那个地址上
一定注意设置屏蔽字要在开中断之前,且在JMP前要恢复屏蔽字
?
|