·中断处理过程
一次中断处理过程通常要经过如下几个步骤完成,如图5.19所示。
图5.19 中断处理过程
(1)关中断,保证在此之后的一小段时间之内CPU不能响应新的中断请求;
(2)保存断点(PC的内容,也许还包括程序状态字的内容),这一定是用中断隐指令(纯硬件机制)实现的。还要保存被停下来的程序的其他现场信息,这可以用软件实现,即到中断服务程序的开始部分完成。断点和现场信息一般保存到堆栈中去,以便方便地支持中断嵌套;保存断点和现场信息一定要完整完成,这是中断处理完成后,保证被停下来的程序得以继续正常运行所必须的。
(3)判别中断源,找到中断服务程序的入口地址。
在多个中断源发出中断请求时,首先需要找出其中中断优先级最高的那个中断源。这可以采用硬件,也可以采用软件完成。
采用软件方案时,是用程序检查中断字的内容实现。全部的中断触发器构成中断寄存器,其内容称为中断字。当中断源数量很多时,中断字也就很长,为了管理方便,通常把所有中断按不同类别、性质取分为若干个中断优先级,每个中断优先级中安排多个中断源,在确定中断优先次序时,先查最高中断优先级,再到这一中断优先级中找出中断优先次序最高的中断源。实质上,就是按从高到低的次序关系到中断字中找出第一个遇到"1"状态。软件的办法查找速度比较慢,硬件开销小一些。
采用硬件方案时,一般选用串行链式排队法,需要有比较、判断中断的优先级的逻辑线路,如图5.20所示。
图5.20 串行链式排队线路
图中的逻辑结果,门7、门8、门9的输出有哪个为低电平,表明中断请求INTR1、INTR2、INTR3中哪个在排队线路中被选中。INTR1的输出为低电平的条件是:INTA*INTR1*INTRI,即这3个信号都为高电平,INTA是CPU送来读被选中的中断设备编码的信号(完成定时),高电平有效,INTR1为高电平表示该设备正在请求中断,INTRI为高电平表示没有比INTR1优先级更高的设备请求中断,此时INTR1中断请求就成为优先级最高的中断源,故在排队线路中被选中。INTR2的输出为低电平的条件是:INTA*INTR2*INTRI*/INTR1,/INTR1为高电平表示INTR1中断源没有请求中断,其他条件都满足,INTR2中断请求就成为优先级最高的中断源,才可以在排队线路中被选中。采用硬件查询方案,运行速度要快得多。
在确定了中断源之后,接下来需要找出对应于该中断源的中断服务程序的入口地址,并将给地址传送到程序计数器PC中。得到中断服务程序的入口地址,通常有两种办法。一是在中断总控程序中用专用的INTA指令接收中断设备编码,再用该设备编码到指定的内存区中找到中断服务程序的入口地址。另外一种是中断向量法,由每个中断源直接提供中断向量,用这一中中断向量为地址到中断向量表中取出中断服务程序的入口地址。中断向量表是由每个中断源的中断服务程序的入口地址组成的一张列表,通常被存放在内存中的指定的一片区域中。当中断服务程序的入口地址送入PC中之后,下一条将执行的指令已经是中断服务程序的第一条指令,即已经开始中断服务处理过程。
(4)接下来应执行一条开中断指令,以便尽快地进入可以响应更高级别中断请求的运行状态,在保证程序正确执行必需的逻辑关系的前提下,把从关中断到下一次开中断之间的时间间隔设计得越短越好。
(5)若有更高级别中断请求来到,则可以进入新的中断的响应过程,否则执行中断服务程序。
(6) 执行完中断服务程序,就要准备返回主程序,为此,执行关中断。
(7) 接下来恢复现场信息,恢复断点。
(8) 执行开中断。这里的关中断和开中断是为了保证能完整地恢复现场的操作。
(9)开中断之后,若有更高级别中断请求来到,则可以进入新的中断的响应过程,否则,返回断点进入主程序的执行过程。
|