微型处理器的中断系统

中断的概念和意义

所谓中断,就是在一定条件下,CPU可以随时中断当前任务转向处理内部故障和外部设备请求服务的机制。在外部设备(接口)需要和CPU交换数据的时候,就会向CPU发出中断请求,如果满足中断条件,CPU就会响应外设的中断请求并转向执行中断处理程序。中断的实现,对于计算机系统有着重要的意义,它使得CPU与外界真正意义上的交互成为可能。

中断的类型

1) 内部中断
  内部中断是CPU执行指令出现错误而引发的中断或CPU执行INT n指令产生的中断。内部中断包括除法错中断(类型0)、单步中断(类型1)、断点中断(类型3)、溢出中断(类型4)和其它INT指令中断。5个专用中断除了非屏蔽中断(类型2)以外,其它4个专用中断都是属于内部中断。所有INT n指令中断都称作软件中断。

8086INT n指令提供了直接调用中断处理子程序的软件手段。这种通过中断指令来使CPU执行中断处理子程序的方法就是软件中断。软件中断属于内部中断。
  我们在前面已经提到,在5个专用中断中,除了非屏蔽中断,其余的4个中断都是内部中断。
  除法错中断INT 0,是当除数为0或者有符号数运算所得到的商超出规定的范围时产生的。这类中断既不是由外部硬件产生,也不是由软件指令产生,而是CPU自身产生的。
  单步中断INT 1,如果想以单步的方式调试程序,可以由调试程序来设置单步调试命令,将标志寄存器TF置为1,并用一个计数单元记录需要执行的单步中断的次数。当CPU测试到TF=1时,就进入单步中断。CPU每执行一条指令,响应一次中断,进入一次单步处理中断服务程序,在单步处理中断服务程序显示所有寄存器内容。单步执行程序直至计数单元减为0,调试程序将TF标志置为0为止。

断点中断INT 3,和单步中断类似,用于程序的调试。断点中断允许用户指定断点,当程序执行到断点时转入断点中断处理程序。断点中断处理程序显示断点处所有寄存器的状态。设置断点的过程,就是调试程序在用户程序指定的断点处用断点中断指令INT 3来代替用户程序的原有指令,同时将用户程序指令保存起来。当程序运行到断点时,便转向执行断点中断处理程序。在断点中断处理程序返回之前,再将用户指令还原。

溢出中断,当运算结果超出数据规定的范围时,就会产生溢出中断。溢出中断是由执行指令发生溢出设置的标志位引起的。

 

(2) 外部中断
  外部中断的中断源来自CPU外部,是由外部设备产生的,当外设需要即时和CPU进行数据交互时,请求CPU中断当前执行的程序。此时,由外设的中断请求电路向CPU发出中断请求。所以也把外部中断称为硬件中断。8086的外部中断有非屏蔽中断MNI和可屏蔽中断INTR。非屏蔽中断NMI为类型2的中断。可屏蔽中断的中断向量或类型码由请求中断的外设来提供。

8086具有两条中断请求引脚INTRNMI,用于传送外部设备送来的中断请求信号。引脚INTR上引发的中断,为可屏蔽中断,引脚NMI上引发的中断,为非屏蔽中断。
 可屏蔽中断INTR
  可屏蔽中断INTR受标志寄存器的中断标志位IF控制,当IF1时,表示允许中断。IF0时,可屏蔽中断的请求受到禁止。INTR要求中断请求信号为高电平,高电平需要保持到中断请求被响应。一旦采样到INTR信号有效,CPU执行完当前的指令,便响应可屏蔽中断INTR的请求。可屏蔽中断被响应以后,由外设(多数由中断控制器)提供中断类型。

  虽然,可屏蔽中断只有一根中断请求线,但是通过外部电路可以允许系统连接多个中断源。最常用的器件为可编程中断控制器。它管理多个可屏蔽中断的中断优先级,为中断源向CPU提供中断向量。
 非屏蔽中断NMI
  非屏蔽中断NMI不受中断允许标志IF的影响,是不可屏蔽的。NMI要求中断请求信号为脉冲上升沿,并要求上升沿之后保持2CLK的高电平。当CPU采样到NMI引脚上的中断请求时,产生类型号为2的中断。CPU执行完当前指令,便响应这个中断请求而进入相应的中断处理。在实际系统中,非屏蔽中断一般用来处理系统的重大故障,例如系统掉电等。

  在整个系统中一般只有一个非屏蔽中断

 

屏蔽中断和非屏蔽中断的响应条件。
  非屏蔽中断:只要非屏蔽中断请求信号有效,产生上跳边沿,并且在上升沿之后维持两个时钟周期的高电平,CPU执行完当前指令后,无条件响应。
  可屏蔽中断:可屏蔽中断请求信号有效,为高电平,并且保持到CPU响应时一直为有效电平,此外,标志寄存器IF=1CPU执行完当前指令后便响应可屏蔽中断请求。中断向量由中断控制器提供。

中断的操作

1) 中断的请求与响应
  中断的过程,即中断请求与响应的过程。8086的中断类型分为外部中断和内部中断。内部中断的中断过程相对简单,可以看成是外部中断过程的一部分,因此,我们以INTR中断为例,着重就外部中断的请求与响应做一个分析。

  中断源发出中断请求以后,如果中断请求信号符合要求,即INTR为高电平且保持足够长时间,同时如果CPU的中断允许标志IF=1,则在CPU执行完当前指令,便进入中断响应周期。CPU是在每条指令的最后一拍,检测INTR信号的。
  CPU响应中断以后,通过INTA管脚连续发出两个负脉冲信号,表示进入中断响应周期。第一个负脉冲用来通知外设,CPU响应了中断请求。第二个负脉冲则用来读取中断向量,在此即中断类型。再通过中断类型查找中断向量表,得到中断入口地址,转入相应的中断服务程序

2) 中断向量和中断向量表
  中断向量,就是中断处理程序的入口地址,每个中断类型对应一个中断向量。在8086系统中,将内存低地址段的03FFH区域保留,用来存放中断向量,我们称这段区域为中断向量表。在中断向量表里,每个中断向量占4个存储单元。其中,前两个单元存放中断处理程序入口地址的偏移量IP,低位在前,高位在后。后2个单元存放中断处理程序入口地址的段地址CS,同样也是低位在前,高位在后(参见图2-25)。CPU根据中断类型码,将其值乘以4,便得到存放中断向量的入口地址。

3) 中断响应流程

微型处理器的中断系统_第1张图片

INTR管脚上收到一个高电平中断请求信号,并且中断允许标志IF1时,CPU就会在当前指令执行完以后,开始响应这个中断请求

a)CPUINTA#管脚上发两个负脉冲,外设接口接到第二个负脉冲后,立即往数据线上给CPU发去中断类型码,CPU从数据总线上读取中断类型码,并存入内部暂存器;
b)
将标志寄存器的值压入堆栈,以便在返回主程序时恢复;
c)
将标志寄存器的单步标志TF和中断允许标志IF清零;
d)
将当前指令地址推入堆栈,保护断点;

e) 根据前面得到的中断类型码,查找中断向量表,找到相应的中断处理程序入口,按中断处理程序入口地址更新CSIP内容;
  a ~ e步是CPU硬件完成的中断响应过程,对用户是透明的。这一过程是不允许被中断的,因此在进入中断响应周期以后,由CPU硬件将IFTF等标志寄存器的内容压入堆栈以后,将IFTF清零。为了能使单步功能在中断服务程序里实现,CPU内部设计了TEMP寄存器,在Flag压入堆栈、TF清零之前,在TEMP中保存TF的副本。
f)
再次检测是否有NMI中断请求,如果有请求,进入NM1响应周期,否则,执行中断处理程序;检测TEMP的状态,如果TEMP1,表示本次进入中断响应周期之前,TF状态为1,因此执行本次中断服务程序之前,进入单步中断响应周期,否则,执行中断处理程序;
g)
执行中断处理程序;

h) 中断处理程序执行完以后,由中断返回指令从堆栈弹出主程序指令指针IP和代码段寄存器CS,然后弹出标志寄存器的内容,并返回到原程序的断点处继续执行原来的程序

你可能感兴趣的:(微机原理与应用,任务,编程,测试,存储,c)