中断与中断控制器8259A

中断概述

  • 中断(interrupt)是CPU对外设呼叫内部异常的一种响应

  • 中断分为硬件中断软件中断

  • 硬件中断也叫外部中断异步中断,它又分为两类:可屏蔽中断不可屏蔽中断

    • 可屏蔽中断是由外设通过CPU的INTR(可屏蔽中断请求信号)引脚,向CPU发出的中断请求。只有当中断允许标志IF为1时,可屏蔽中断才能进入。(eg:DMA传输结束,网络数据到达,打印缺纸)
    • 不可屏蔽中断是通过CPU的NMI(non maskable interrupt)引脚进入的,不受中断允许标志IF的影响,用来通知CPU发生了很严重的问题。(eg:电源掉电,总线奇偶位出错,总线超时)
  • 软件中断也叫异常内部中断同步中断内部不可屏蔽中断,软件中断时CPU根据某条指令或者标志寄存器中的某个标志而产生的。软件中断完全和硬件电路无关。典型的软件中断有:INT n指令中断、INTO(Interrupt if Overflow)指令中断、单步中断、除数为0中断

    • 异常的分类(软件中断的另一种分类)
    1. 故障(Fault):执行指令引起的异常,是可恢复的异常。如缺页异常,除数为0。断点为发生故障指令的地址(断点:异常处理程序结束后回到原来被中断的程序执行时的第一条指令)
    2. 自陷(Trap):预先有意安排的异常,用于在用户态调用操作系统内核程序,如单步跟踪,断点,系统调用等。断点为自陷指令下条指令地址
    3. 终止(Abort):无法恢复的异常。终止处理程序直接将进程终止,不再将控制返回给引发终止的应用程序。如控制器出错、存储校验错
  • 注意:除数为0异常既可以说是fault,也可以说是abort,具体取决于你的程序如何处理这个信号中断分类

8086/8088中断矢量设置

方法一

;设中断类型号为n,中断服务程序的名称为function,要求将function的地址置入中断矢量表中
;不考虑设置的新中断向量会覆盖中断向量表中原中断向量
;程序如下:

mov ax,0
mov es,ax					;es=0000H
mov di,n*4					;es:di=0000:n*4
mov ax,offset function		;function的偏移地址送到ax
cld							;方向标志位DF清零。串操作中使变址寄存器di的地址自增
stosw						;function的IP偏移地址送到了中断矢量表中,同时DI自增2
mov ax,seg function			;function的段地址送到ax
stosw						;function的CS段地址送到了中断矢量表中,同时DI自增2

方法二

DOS功能调用:

  • 设置中断矢量:DS:DX=中断服务程序入口地址,AL=中断类型号,AH=25H,用int 21H指令将中断服务程序入口地址置入到中断矢量表中
  • 取得中断矢量:AL=中断类型号,AH=35H,用int 21H指令将对应中断类型号的中断向量从中断矢量表中取出,送到ES:BX
;设中断类型号为n,中断服务程序的名称为function,要求将function的地址置入中断矢量表中
;考虑设置的新中断向量会覆盖中断向量表中原中断向量,此时就要保存原中断向量
;程序如下:

;第一步:取得原中断向量,并入栈保护
mov al,n;
mov ah,35h
int 21h
push es
push bx
;第二步:设置新中断向量
mov ax seg function
mov ds,ax
mov dx, offset function
mov al,n
mov ah,25h
int 21h
;第三步:执行完自定义设置的中断程序后,就可恢复原中断矢量
pop dx
pop ds
mov al,n
mov ah,25h
int 21h

可屏蔽中断的响应过程

CPU在执行每条指令的最后一个时钟周期会对INTR信号进行采样,如果CPU的中断允许标志IF为1,并且INTR信号又为高电平,那么CPU就会在执行完当前指令后,响应中断请求,执行一个中断处理子程序
对于8086/8088CPU来讲,具体来说要依次做下面几件事:

  1. 执行两个中断响应总线周期,利用 INTA ‾ \overline{\text{INTA}} INTA(interrupt acknowledge)引脚输出两个负脉冲。第一个负脉冲用来通知外设的接口CPU准备响应中断,现在该准备好中断类型号。第二个负脉冲被外设收到后,外设便往数据总线上放中断类型号。CPU从总线上读取中断类型码,将它左移两位后,成为中断向量的起始地址。
  2. 执行一个总线写周期,把标志寄存器的值入栈
  3. 标志寄存器的中断允许标志IF和单步标志TF置0。IF置0是为了禁止中断响应过程中其他可屏蔽中断进入。TF置0是为了避免CPU以单步方式执行中断处理子程序
  4. 执行一个总线写周期,将CS内容推入堆栈
  5. 执行一个总线写周期,将IP内容推入堆栈
  6. 执行一个总线读周期,读得中断处理子程序入口地址的偏移量送到IP寄存器中
  7. 执行一个总线读周期,读得中断处理子程序入口地址的段地址送到CS寄存器中

注:如果是不可屏蔽中断或者软件中断,则跳过第1步,从第2步开始按次序执行到第7步。因为从NMI引脚进入的中断请求只能有一个,它必定对应中断类型2。至于软件中断,中断指令本身就为CPU提供了中断类型号

经过上述步骤后,CPU就开始执行中断处理子程序了。除去所处理的特定功能外,所有中断处理子程序都有着相同的结构模式,具体如下:

  1. 保护现场,将需要保护的寄存器的值入栈
  2. 一般情况下,设置中断允许标志IF=1来开放中断,允许优先级更高的中断请求进入
  3. 中断处理的具体内容,不同中断处理子程序处理的内容不同
  4. 执行一系列出栈指令,使各寄存器恢复进入中断处理时的值
  5. 执行中断返回指令, 中断返回指令使堆栈中保存的断点值和标志值分别装入到IP、CS和标志寄存器

中断控制器8259A

功能:在有多个中断源的系统中,像个管家般帮CPU接收外部的中断请求,并进行优先级控制和判断,选中当前优先级最高的中断请求,再将此请求送到CPU的INTR端
当CPU响应中断并进入中断处理子程序后,中断控制器仍管理着外部的中断请求,当某个外部中断请求的优先级高于当前正在处理的中断时,中断控制器会让此中断通过而到达CPU的INTR端,从而实现中断的嵌套,反之,对级别较低的中断则禁止
下图是中断控制器8259A内部的简要结构
8259A

  • IRR(interrupt request register)——中断请求寄存器
  • PR(priority resolver)——优先权电路
  • ISR(interrupt request register)——中断服务寄存器

8259A有7个可编程的8位寄存器,可分为两组
第一组4个,用来存放初始化命令字ICW(initialization command word),分别称为ICW1—ICW4。初始化命令字往往是计算机系统启动时初始化程序设置的,一旦设定,一般在系统工作过程中不再改变。
第二组3个,用来存放操作命令字OCW(operation command word),分别称为OCW1—OCW3。操作命令字是由应用程序设定的,用来对中断处理过程作动态控制,操作命令字可被多次设置。

8259A工作原理

  1. 中断请求寄存器IRR记录当前外部的中断请求,IRR有8位,分别和引脚IR7—IR0相对应,哪个引脚来了中断请求,IRR寄存器中对应位就置1,即对此中断请求作锁存
  2. 此后,逻辑电路根据中断屏蔽寄存器IMR中对应位决定是否让此请求通过。如果IMR对应位为1,则表示此中断受到屏蔽,不能进入中断优先级裁决电路。反之,就进入。
  3. 中断优先级裁决电路把新的中断请求和当前正在处理的中断作比较,从而决定哪一个优先级更高。中断服务寄存器ISR存放现在正在处理的中断请求。如果优先级裁决电路判断出新进入的中断优先级更高,它就会通过相应的逻辑电路使8259A输出端INT为1,即向CPU发出一个中断请求
  4. 如果CPU中断允许标志为1,那么CPU执行完当前指令后,就可响应中断。这时,CPU从 INTA ‾ \overline{\text{INTA}} INTA端往8259A回应两个负脉冲
  5. 第一个负脉冲到达时,8259A完成如下三个动作:①使IRR锁存功能失效。IR7—IR0线上的中断信号不再接收。直到第二个负脉冲到达,才又使IRR锁存功能有效②使当前中断服务寄存器ISR中相应位置1,以便为中断优先级裁决电路提供判据③使IRR寄存器中相应位(即接收中断请求时置1的位)清0
  6. 第二个负脉冲到达时,8259A完成如下两个动作:①将中断类型寄存器ICW2的内容送数据总线D7—D0,将次作为中断类型号②如果ICW4寄存器中中断自动结束位为1,则将当前中断服务寄存器ISR的相应位清0

8259A工作方式

1.设置优先级的方式

(1)全嵌套方式

在全嵌套方式中,从IR0进入的中断优先级最高,从IR7进入的中断优先级最低。相对应的,中断服务寄存器ISR中IR7—IR0这8位从左到右优先级从低到高,这就是中断优先级裁决电路的裁决依据。对8259A进行初始化后,如果不再写入任何操作命令字,8259A就处于全嵌套工作方式

(2)特殊全嵌套方式

与全嵌套方式只有一个差别:可以响应同级中断请求。而在全嵌套方式中,只有当更高级的中断请求来到时,才会进行嵌套,当同级中断请求来到时,不会进行响应。

(3)优先级自动循环方式

中断服务寄存器ISR中IR7—IR0优先级排序是在发生变化的。某个端口的中断请求受到服务后,它的优先级自动降为最低。比如处理完IR4后,IR4就是最低优先级,IR5就是最高优先级,然后依次为IR6、IR7、IR0、IR1……注意:一开始的最低优先级是IR7

(4)优先级特殊循环方式

与优先级自动循环方式只有一个差别:一开始的最低优先级是编程确定的。

2.屏蔽中断源的方式

(1)普通屏蔽方式

8259A的每个中断请求输入端,都可通过设置IMR的对应屏蔽位(置1表示屏蔽)而被屏蔽,从而使对应的中断请求不能从8259A送到CPU

(2)特殊屏蔽方式

仅屏蔽当前正在处理的这级中断本身,允许高级或低级的中断进入。需先通过OCW3使8259A工作于特殊屏蔽方式,再用OCW1使本级中断的屏蔽寄存器的相应位置1,仅屏蔽本身。例如:系统处于特殊屏蔽方式,正在处理IR3中断,又用OCW3命令屏蔽掉IR3中断,则使IM3=1,IS3=0,这时,IR0—IR2和IR4—IR7中断均可进入

3.结束中断处理的方式

当一个中断请求得到响应时,8259A会在中断服务寄存器ISR将相应位置1,这是为了给中断裁决电路提供依据,当中断处理程序结束时,必须使ISR中相应位清0,否则中断裁决电路的判据就不正确。而使ISn位清0的动作就是中断结束处理

(1)自动结束中断方式

场景:只能用于系统中只有一片8259A且多个中断不会嵌套的情况
设置方法:对8259A初始化时,使初始化命令字ICW4的AEOI位置1
当第二个中断响应脉冲 INTA ‾ \overline{\text{INTA}} INTA送到8259A后,8259A就会自动将当前中断服务寄存器中的对应位ISn置0,这样,尽管系统还正在进行着中断服务,但对8259A来说,当前中断服务寄存器中却没有对应位做指示,所以,就好像已经结束了中断服务一样

(2)一般结束中断方式

场景:用在全嵌套方式的情况下
设置方法:在程序中往8259A的偶地址口输出一个操作命令字OCW2,并使得OCW2中EOI=1,SL=0,R=0即可。此时CPU就会用输出指令,往8259A发出一般中断结束命令,8259A收到命令后就会把当前中断服务寄存器中最高的非零IS位置0。因为在全嵌套方式中,最高的非零IS位对应了最后一次被响应和被处理的中断,也就是当前正在处理的中断,所以,最高的非零IS位的复位相当于结束了当前正在处理的中断

(3)特殊的中断结束方式

场景:非全嵌套方式
非全嵌套方式下,中断服务寄存器ISR无法确定当前正在处理哪级中断。此时,就要发一条特殊的中断结束命令,这个命令指出了要将中断服务寄存器中的哪位置0
设置方法:也是通过OCW2操作命令字来发送

4.连接系统总线的方式

通过初始化命令字ICW4设置

(1)缓冲方式

8259A通过总线驱动器连接数据总线

(2)非缓冲方式

8259A直接与数据总线相连

5.引入中断请求的方式

通过初始化命令字ICW1设置

(1)边沿触发方式

8259A将中断请求输入端出现上升沿作为中断请求信号

(2)电平触发方式

8259A将中断请求输入端出现的高电平作为中断请求信号

(3)中断查询方式

8259A不使用INT信号端向CPU发中断请求信号,CPU要使用软件查询来确认中断源,从而对设备进行中断服务。查询,是通过往8259A偶地址口发送操作命令字OCW3来实现的,接着,还要用输入指令从偶地址口读取8259A的查询字

  • 32
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值