本系列文章是学习了网课《哈尔滨工业大学–计算机组成原理》之后,用以梳理思路而整理的听课笔记及相关思维拓展。本文涉及到的观点均为个人观点,如有不同意见,欢迎在评论区讨论。
目录
- 中断系统
- 中断请求标记和中断判优逻辑
- 中断服务程序入口地址的寻找
- 中断响应
- 保护现场和恢复现场
- 中断屏蔽技术
- 多重中断
- 实现多重中断的条件
- 屏蔽技术
中断系统
除了前面讲到的中断方式实现CPU和IO设备交换信息;当计算机发生意外事件时,也会进入中断以进行处理;或者说在机器的运行过程中,需要处理其中的运算结果,也需要中断,等等。
为了处理异常情况、实时控制等等,提出了中断的概念。
一般有哪些类型的中断:
1、人为设置的中断,在程序中人为设置,当出发某个条件之后,停止现行程序而转入中断处理。
2、程序性事故,定点溢出、浮点溢出、操作码不能识别等等,由于程序设置不当而引起的中断。
3、硬件故障,插件接触不良、通风不良、电源掉电等,硬件设备故障。
4、IO设备,IO设备被启动之后,准备就绪,向CPU发出中断请求。
5、外部事件,比如用户通过键盘来中断现行程序属于外部事件。
中断系统需要解决的问题:
1、各中断源如何向CPU提出中断请求
2、当多个中断源同时提出中断请求时,如何确定响应的顺序
3、CPU在什么条件、什么时候、什么方式来响应中断
4、CPU响应中断后如何保护现场
5、CPU响应中断后,如何停止原程序的执行而转入中断服务程序的入口地址
6、中断服务结束之后,CPU如何恢复现场,如何返回到原程序的间断处
7、在中断中又产生中断,该如何处理
中断请求标记和中断判优逻辑
中断请求标记寄存器列出了各种类型的中断,当标记变成1的时候,表明对应的中断源提出了中断请求。
可以看到,中断请求触发器越多,计算机的处理中断的能力越强。
在同一时刻可能接收到多个中断源的请求,但是一个中断系统在任一时刻,只能响应一个中断源的请求。中断系统必须对多个中断源请求进行判断、排序,根据若不响应该中断,将会对计算机造成损坏的严重程度进行排序。有两种排队方式:
1、硬件排队
下图中,按照中断优先级的高低进行排队,优先级高的设备产生中断请求之后,会封住其它低优先级的设备产生的中断请求。
2、软件排队
通过程序编写,从高到低查询。
中断服务程序入口地址的寻找
确定中断的响应优先级之后,也就是确定了响应哪一个中断,之后就需要去寻找中断源对应的中断程序了。有两种方式:
1、硬件查询法,上述的中断判优之后,会产生一个中断向量,这个中断向量相当于确定了中断源之后,产生的一个输出结果。这个中断向量会引导我们找到中断服务程序的入口地址。
向量地址可以放一条无条件转移指令,比如中断之后,将12H送至PC,PC执行会直接跳转到中断服务函数中;
或者12H中放中断程序的地址,将这个地址传入PC,再去执行。
在单片机中经常可以看到这个中断向量表。具体是上面两种方式中的哪一个,我还没研究过。
2、软件查询法
用软件方式一个一个查询,从优先级高的向低的查,当查到某一中断源有请求时,安排一条转移指令,直接指向该中断源的中断服务程序入口地址,机器自动进入中断处理。
中断响应
CPU不是一有中断即可相应的,它是定时查询。
中断系统中有一个允许中断触发器EINT,当EINT为1时,有中断请求,CPU可以响应;当EINT为0时,CPU不响应中断。
一般来说,定时查询在CPU指令执行周期结束之后,指令执行周期接收后,若有中断,CPU则进入中断周期;若无中断,则进入下一条指令的取指周期。
如果说计算机中经常指令周期执行时间很长,CPU会安排查询断点定时发送查询信号。
当CPU响应中断后,进入中断周期,在这个过程中,CPU会自动完成一系列操作,不需要人为控制。
你也控制不了,这一系列操作没有对应的指令,由硬件自动完成,一般称之为中断隐指令。
自动操作,具体如下:
1、保护程序断点,即将当前PC内容保存起来,方式不限,存储器也好,堆栈也好。
2、寻找中断服务程序的入口地址,有两种方式,硬件向量法和软件查询法
3、关中断,为了确保响应了一个中断源之后,后续操作不会被干扰,在中断周期内需要先关中断,防止CPU在中断周期内一直响应中断。
保护现场和恢复现场
中断现场需要:保护程序断点、保护CPU内部各寄存器内容的现场。
程序断点由中断隐指令完成,寄存器的现场可以由用户实现。
恢复现场由中断服务程序完成。
中断屏蔽技术
多重中断
当CPU在执行某个中断服务程序时,又有另外一个中断源提出了新的中断请求;但是这个CPU又响应了这个中断请求,暂停了目前的中断服务程序,转而去执行新的中断服务程序,称之为多重中断。
若CPU执行一个中断时,对其它的中断不做响应,称之为单重中断。
实现多重中断的条件
1、提前开中断
上面讲到中断周期,硬件自动操作中断隐指令的时候,会关中断,此时不允许CPU响应新的中断请求;所以要想实现多重中断,需要在中断周期之后,中断程序保护完现场之后,开启中断,这样在执行中断服务程序的时候,才可以响应新的中断。
2、优先级别高的中断源可以中断其它中断优先级别低的中断源
优先级别:A > B > C > D
先出现的是,B和C,先响应B,再去执行C
B执行完之后,接着去执行C,这是产生了D,但是级别比C低,不响应,C执行完之后 ,再去执行D
此时又出现了A,A级别高于D,响应A,执行完成A之后,再接着执行D
屏蔽技术
1、屏蔽触发器和屏蔽字
排队器中,每个中断源加入屏蔽触发器MASK,当MASK = 1时,该中断源无法产生中断请求(INTP = 0);当MASK = 0时,该中断源才可以产生中断请求。
下面的屏蔽字对应于MASK。
比如说1级中断源被响应了,那我就设置一个1级屏蔽字,会屏蔽所有的中断源。
比如我4级中断源被响应了,那我设置一个4级屏蔽字,1-3位是0,没有被屏蔽,表明依然可以被1-3优先级的中断源打断,但是比4低的中断源全部被屏蔽了,无法被低优先级的中断源打断。
2、屏蔽技术改变优先等级
优先级包含响应优先级和处理优先级。
响应优先级是CPU响应各中断源请求的优先次序,这种次序是硬件线路决定的,不便于改动。
处理优先级是CPU实际对中断源请求的处理次序,可以采用屏蔽技术改变,如果不采用屏蔽技术,处理的次序就是响应的次序。
下面是一个采用屏蔽技术的例子:
原屏蔽字:处理顺序(屏蔽字的级别)为A> B > C > D,现改为A> D > C > B
响应优先级为A> B > C > D
现在ABCD同时提出中断请求
先按照中断级别的高低,去处理A,A的屏蔽字是1111,屏蔽所有中断源,所以A响应之后,并执行完成回到主程序
B的响应优先级高于C、D,所以B被响应,但是B的屏蔽字为0100,可以被A、C、D打断,这时又C和D两个中断请求,但是C的响应优先级高于D,所以C被响应
C被响应之后,其屏蔽字为0110,可以被A和D打断,这时A执行完,D还在发中断请求,所以C又被D打断,D被响应
D被响应之后,设置屏蔽字0111,可以被A打断,但是A执行完成了,所以D可以安安心心的执行,直到执行完成D,返回到C
C执行完成之后,返回到B,最终B执行完成,返回到主程序。
3、屏蔽技术的应用
中断屏蔽技术可以给程序控制带来灵活性,当出现程序不想要的问题而停机时,可以设置屏蔽字,屏蔽该中断,使得机器继续运行,