前言
I2C虚拟项目涉及到了中断,为了更好地理解中断,去学习了计算机组织与结构的相关慕课,并做了整理。
一、中断的定义
程序中断:计算机在执行程序的过程中,当出现异常情况或特殊请求时,计算机停止现行程序的运行,转向对这些异常情况或特殊请求的处理,处理结束后再返回到现行程序的中断处,继续执行原程序,这就是中断。
中断的特点:中断程序消除了CPU原地踏步的情况(查询模式下),但是CPU在响应中断请求后,必须暂停现程序,转而去执行中断服务子程序,消耗了CPU资源,且中断处理过程是有开销的(CPU进入中断服务程序后首先要保护中断现场,然后在中断服务程序返回到主程序之前要恢复现场)。
中断源:引起中断的各种因素。
中断的种类:
可屏蔽中断:每一个中断源对应一个中断屏蔽位,一旦将中断屏蔽位设为真,也就是要屏蔽这个中断源,那么这个中断源再提出中断请求时,处理器都不会去响应它
不可屏蔽中断:中断源没有中断屏蔽位,只要通过相应的引脚(NMI)发出中断请求,那么CPU一定会响应中断。
二、中断系统需要解决的问题
1.各中断源如何向CPU提出请求?
每一个中断源对应中断请求标记触发器,发出中断请求时就会把触发器的输出置为1,这是中断源提出请求的唯一标志。
2.各中断源同时提出请求怎么办?
中断优先级的比较电路或者通过软件的方法作比较,选出优先级最高的中断然后去响应它。
3.CPU在什么条件、什么时间、以什么方式响应中断?
两个条件:
1.中断允许位为1:
在CPU内部有一个叫做程序状态字的寄存器(PSW),其中有两类信息,一种是控制位,通过设置控制位使得处理器工作在某种模式下。状态位能够实时反映当前指令运行的状态,根据状态判断当前程序的执行流程是否跳转,其中有一个控制位叫做中断允许位,这是一个中断总的开关,如果这个值为1,表示CPU可以接收外部的中断,为0表示不接收外部的中断。
2.中断源未被屏蔽:
对应于每一个中断源都有一个中断屏蔽位,如果屏蔽位为1,表示CPU要把这个中断源屏蔽掉,这时即使中断源提出中断请求,CPU也不会理会;只有屏蔽位为0,提出中断请求,CPU才会去响应这个中断。
响应时间:
CPU执行完当前指令以后才可以响应中断,指令执行过程中不会响应。
响应方式:
执行一条中断隐指令。计算机的每一个动作都是由指令控制的,但是在中断响应的过程中,计算机会做三件事(硬件关中断,保护断点,向中断服务程序的入口跳转),这三件事并没有一条指令去控制执行,所以看起来好像是在一条指令的控制下去做的,而实际上并没有这样一条指令,因此把它叫做中断隐指令。
4. 如何保护现场?
在中断服务程序当中,把中断服务程序运行过程中要用到的寄存器的值送到堆栈中。
5. 如何寻找入口地址?
软件/硬件方式。
6. 如何恢复现场,如何返回?
恢复现场:在中断服务程序返回之前,按照入栈的逆序,把堆栈顶端的若干个信息弹回到相应的寄存器中。
返回现场:中断隐指令前面做了中断断点的保护,现在把断点的值送给程序计数器,所以程序计数器就会指向刚才主程序中马上要执行而又没有执行到的指令的位置,所以接下来就会取那条指令并且执行,完成中断的返回。
7. 处理中断的过程中又出现新的中断怎么办?
涉及中断的嵌套。
三、中断接口电路
中断请求标记触发器
一个请求源对应一个INTR中断请求标记触发器,多个INTR组成中断请求标记寄存器。
中断请求标记触发器有两种存在形式,一是是分散在各个中断源的接口电路中,一种是集中在CPU的中断系统内
中断屏蔽触发器
每一个中断源也对应一个中断屏蔽触发器,多个中断屏蔽触发器组成中断屏蔽寄存器。最下面的D触发器(受设备本身控制),上面是一个与非门,一个非门,再上面是一个D触发器(时钟输入端来自CPU的中断查询信号,其会在当前指令执行完毕以后发出),右边是中断屏蔽触发器,MASK是1表示希望屏蔽掉当前的中断。
工作流程:如果设备发出中断请求,那么会被D触发器输出置为1,如果中断没有被屏蔽,那么MASK是0,那么屏蔽寄存器的输出是1,两个信号经过与非门是0,再经过非门是1,但这个1不会马上将INTR输出置1,因为需要等到时钟信号即来自CPU的中断查询信号到来,INTR才会被置为1,从而向CPU发出中断请求。
中断硬件排队器
以上硬件连接方式使得设备1、2、3、4的优先级按照降序排列,在上图的电路中,虽然设备2和3都有中断请求,但是由于2的优先级更高,最终是设备2向CPU发出中断请求;
另外,中断排队也可以由软件实现(通过轮询的方式)
中断向量地址形成部件
实质上是一个设备编码器,由硬件产生向量地址进而找到入口地址。比如排队器输出一串数字,从低位往高位数第12为为1,其余均为0,那么经过中断向量地址形成部件会输出向量地址1100,表示第12位为1,然后根据向量地址查找中断向量表,进而找到向量地址12对应的入口地址,最终跳转到入口地址进入打印机服务程序。
三、中断处理过程
1. Linux中断机制
上半部:“登记中断”,把下半部的任务安插到任务队列中,然后中断会返回(可以加快中断的响应过程);
下半部:由操作系统处理机调度来完成此部分任务,完成中断事件动作。
2. CPU响应中断的时间和条件
- 条件:
CPU允许中断:中断允许触发器EINT=1(开中断、关中断指令可以改变EINT);
相关中断的掩码(MASK)为0 - 时间:
每条指令执行结束(CPU发出中断查询信号,将INTR置1)
3. 中断响应的实现
通过中断隐指令完成
中断隐指令的作用:
a. 保护程序断点:发生中断的时候CPU在主程序里面执行到的那个位置的下一条指令的位置叫做断点,将其存于特定地址(比如0号地址),还可以放进堆栈中,还可以保存在特殊功能的寄存器;
b. 寻找服务程序入口地址,以便向中断服务程序跳转:
i) 硬件向量法:找到中断号,然后根据中断号去查找中断向量表,在中断向量表里面找到入口地址去运行;
ii) 软件查询法:把中断识别程序入口地址M送给程序计数器,也就是要运行中断识别程序,在识别程序里面判断到底是哪一个设备发出中断请求,并相应执行中断服务程序;
c. 硬件关中断:硬件会自动会把中断允许触发器置为0,因为进入中断服务程序中,首先要进行保护现场的工作,保护现场是不希望被打扰的,必须在中断关闭的状态下来进行,所以在进入中断服务程序之前先要硬件关中断。
I/O中断处理过程
首先CPU会通过地址线发出设备的地址,然后所有的接口都会连到地址线上,这些接口分别拿到地址之后都和自身地址相比较,以判断CPU找的是不是自己;假设CPU找的就是这个接口,那么设备选择电路经过判断知道找的是它,就会把SEL信号设为1,然后CPU发出设备启动命令,启动命令和SEL都是1,经过与非门输出0,这个0会改变D和B这两个触发器的输出值,会将D(DONE)触发器置为0,会把B(BUSY)触发器置为1,表示设备正忙,还没有完成工作,同时B触发器会去启动设备,然后设备就会去找一个数,然后通过接口传递给CPU,(设备工作是一个比较漫长的过程,与此同时,CPU可以继续执行原来的工作,因此CPU执行程序和设备准备数据可以同时进行,这也是中断的优势所在),当设备准备好数之后,设备通过数据线,把数据送给DBR,(虽然设备把数据送给了数据缓冲寄存器,但是CPU并不知道,因此设备向CPU发出中断请求),因此下一步是设备工作结束信号有效,由此会将D触发器输出置为1,把B触发器输出置为0,表示工作已经完成,设备已经不忙了;D触发器上面是中断请求触发器,由于不会屏蔽中断,因此MASK触发器输出为1(输出取反了),因此上面的与非门两个输入都是1,输出为0,通过非门后变为1,因此INTR输入为1,接下来CPU执行完当前指令后会发出中断查询信号,进而使得INTR的输入有效,输出被置为1,也就是向CPU发出中断请求,至此CPU知道有设别发出中断请求,但不知道是哪一个设备,所以还需要查询;另一方面,也可能有多个设备发出中断请求,因此需要排队;排队器接收来自高一级排队器的信号以及向低一级排队器发送信号,因此这个排队器可以对多个设备进行排队,排队之后信号进入编码器,它会将当前优先级最高的中断源的中断号找出来,但这个中断号不能马上发给CPU,因为中断请求之后需要等待CPU中断响应信号;所以当CPU发出中断响应信号后,该信号成为编码器的输出允许,进而中断号发送给CPU;接下来CPU得到中断号,就去查找中断向量表,然后找到当前优先级最高的中断源它的中断服务程序入口地址,然后去执行中断服务程序,中断服务程序会到当前接口把数据取走。
中断服务程序流程
CPU查找向量表,找到中断服务程序入口,然后执行中断服务程序。并依次执行:
1.保护现场:因为在执行中断服务程序的时候会用到CPU内部的寄存器,而在执行主程序的时候,这些寄存器也会被用到,如果之间去执行中断服务程序,这些寄存器中的值会被冲掉,将来在返回主程序的时候,这些值就没有了,进而导致主程序的执行错误,所以需要进行保护现场的工作,把当前中断服务程序中需要用到的寄存器的值保存到堆栈中,也就是使用push这种进栈指令对它们进行入栈处理;
2.中断服务:执行中断服务程序,在中断服务的最开始,可以视情形开中断,也就是如果在执行当前中断服务程序的过程中,允许有更高级别的中断到来,并且把当前中断打断,那么这样就可以开中断;如果希望中断服务程序不被打断,那么就不要开中断;
3.恢复现场:恢复现场需要在中断关闭的状态下工作,如果在中断服务中开了中断,那么在恢复现场前就要进行关中断,保证开关中断成对出现;恢复现场就是把刚才压入堆栈的值再弹回到响应的寄存器当中,那么在主程序看来,寄存器的值并没有被意外地改变。出栈也是通过出栈指令来完成逆序出栈,因为堆栈是后进先出的原理。
4.开中断:返回到主程序之前要保证中断的状态和进入到中断服务程序之前是一样的,在进入中断服务程序的时候通过中断隐指令实现了硬件关中断,所以返回之前要再开中断,保证CPU执行主程序的过程中中断都是打开的;
5.中断返回:通过中断返回指令完成,是把断点(中断返回地址)赋值给程序计数器PC,所以程序计数器会指向断点的位置,所以主程序就可以继续向下执行。
四、中断屏蔽技术
1. 中断屏蔽相关概念
- 中断屏蔽字:每一个中断源都对应一个中断屏蔽触发器,所有中断源的中断屏蔽触发器合在一起组成中断屏蔽寄存器,中断屏蔽字就是保存在中断屏蔽寄存器中的值。
- 中断屏蔽字的应用:通过修改中断屏蔽字来改变处理优先级,进而使得CPU按照我们期望的顺序来响应中断(处理优先级是指CPU实际对各中断源请求处理的优先次序,与之相似的响应优先级是指CPU响应各中断源请求的优先次序。它由硬件决定,程序员不可更改);
2. 新屏蔽字的设定
实际上在保护现场和置屏蔽字之间通过中断隐指令进行了关中断,所以是一个两开两关的过程;在保护现场和置屏蔽字以及恢复现场和恢复屏蔽字之间必须保证中断是关着的;
总结
一边学习项目一边补充基础知识,进而对项目的理解更深入一些。