中断屏蔽技术
Posted PacosonSWJTU
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中断屏蔽技术相关的知识,希望对你有一定的参考价值。
【README】
本文转自bilibili《计算机组成原理(哈工大刘宏伟)》的视频讲解,非常棒,墙裂推荐;
【1】中断屏蔽
1,中断屏蔽的意思是,在中断1的服务程序执行过程中,不允许被其他中断打扰;
2,按理,对于不同中断源,它有中断响应优先级,但这个是硬件决定的,无法修改;而如果要修改各个中断的优先级(即是否可以被打扰),可以通过中断屏蔽寄存器(人工设置该寄存器的值)来实现;这是提出中断屏蔽技术的原因所在;
3,中断屏蔽的具体原理是: 每个中断源都有一个中断屏蔽字(如16个bit); 当该中断被响应或执行该中断的服务请求时,对应中断源的屏蔽字设置到中断屏蔽寄存器;在中断响应时,cpu会根据屏蔽寄存器的值来判断是否响应该中断;
【1.1】屏蔽技术介绍
1 中断屏蔽技术
- 1.1 通过设置中断屏蔽字来改变中断服务优先级,从而提高系统设计和响应的灵活性;
- 1.2 中断屏蔽字是通过中断屏蔽触发器来设置的;INTR 是中断请求寄存器;MASK 是中断屏蔽触发器(MASK=0,非门输出1时表示未屏蔽);
2 如何提出中断请求?
- 触发器D在完成后,提出中断请求,能够提出中断的条件是,这个中断源没有被屏蔽掉;
3 右图第2种方式实现中断屏蔽
- 中断屏蔽字的长度等于中断源的个数,屏蔽字的每个bit对应到每个mask的取值上;
- 若maski等于1,则表示第i个中断源的中断请求不会被响应(或被屏蔽);当然也无法提出中断请求;
中断屏蔽触发器的作用是 屏蔽某个中断源发出中断请求,也不能参加中断请求优先级的排队;
【1.2】中断屏蔽字
屏蔽触发器对应的值是屏蔽字;
如,16个中断源,每个中断源都对应一个屏蔽字;
每个屏蔽字表示当中断源的中断服务程序在执行过程中,是否允许其他中断源提出中断请求
进入到排队器进行排队(即是否允许其他中断源提出中断请求);对应的bit位为1表示屏蔽,0表示不屏蔽;
如:1号中断源的中断服务程序在执行过程中,无论是1号还是2.。。。16号中断源提出的中断请求都不会进入中断排队器中排队(即1号中断源屏蔽其他中断源的中断请求);
但2号中断服务程序的执行过程中,允许1号中断源提出中断请求并被1号打断;
【2】 屏蔽技术可以改变中断处理优先级
【2.1】中断响应优先级与处理优先级
1,中断优先级分为响应优先级,处理优先级;
- 响应优先级,属于中断硬件给定,无法修改;
- 处理优先级,可以通过屏蔽技术进行修改;
2,处理优先级是可以改变的,通过重置屏蔽字,让低优先级的中断无法进入排队器排队;通过中断屏蔽字让某一个中断源的处理优先级被提高;
【例】在执行C的中断服务程序的过程中,对应的中断屏蔽字(中断屏蔽寄存器)被设置为0110,只有A或D的中断请求可以进入中断排队器中排队;
【2.2】例子,屏蔽技术修改中断处理优先级
响应优先级为 A B C D,降序排列, 无法修改;处理优先级修改为, A D C B,降序排列;
【例子】加入屏蔽技术后的多中断处理步骤
- 步骤1:ABCD同时提出中断服务请求,因为主程序屏蔽字(即中断屏蔽寄存器)为0000(不会屏蔽任何中断),所以4个中断都会进入排队器;
- 步骤2:又A的响应优先级最高,所以cpu先响应A,转而执行A的中断服务程序;在执行A中断服务程序过程中,因A的屏蔽字为1111,故它会把中断屏蔽字设置为1111,这会屏蔽其他中断源(ABCD)的中断请求;
- 步骤3:A的中断服务程序执行后,返回主程序,这时主程序屏蔽字是0000,所以中断屏蔽字寄存器为0000; 即主程序随时可以被打断,DCB都可以进入中断排队器进行排队;
- 步骤4:又B的响应优先级最高,所以先响应B,执行B的中断服务程序;又B的中断屏蔽字为0100,所以B允许被CD中断源打断;
- 步骤5:在执行B的中断服务程序过程中,CD均可以提出中断请求,并进入中断排队器排队;
- 步骤6:又C的响应优先级高于D,所以先响应C,转而执行C的中断服务程序(C中断B);响应C后, C的中断屏蔽字设置到中断屏蔽字寄存器,即0110;那么C的中断服务程序可以被AD中断源打断;
- 步骤7:在执行C的中断服务程序过程中,D提出中断请求,进入排队器进行排队;又D的处理优先级高于C,所以中断C,转而执行D(D中断C);
- 步骤8:执行D完成后,回到C的中断服务程序的断点,继续执行C,因为D中断的是C(中断谁就返回谁);
- 步骤9: C执行完成后,再返回到B,因为C中断的是B;
- 步骤10:B执行完成后,整个执行就结束了;
【3】新屏蔽字的设置
新屏蔽字的设置步骤:
序号 | 步骤 | 描述 |
1 | 保护现场 | Push指令,把要用到的寄存器的值保存起来,以便从中断恢复后使用; |
2 | 置屏蔽字 | 设置中断屏蔽字; |
3 | 开中断 | 提前开中断,目的是实现多重中断;设置EINT=1 |
4 | 执行中断服务程序 | |
5 | 关中断 | 因为恢复现场,恢复中断屏蔽字的过程不能被打断;设置EINT=0 |
6 | 恢复现场 | 把之前被保护的现场数据从内存恢复到寄存器; |
7 | 恢复中断屏蔽字 | 把中断屏蔽寄存器的值设置为主程序的屏蔽字(0000),允许被任何中断打断; |
8 | 开中断 | 允许中断;设置EINT=1 |
9 | 中断返回 | 从中断中恢复到主程序; |
以上是关于中断屏蔽技术的主要内容,如果未能解决你的问题,请参考以下文章