中断响应过程与响应时间

四、中断响应过程与响应时间

在89C51内部,中断表现为CPU的微查询操作,89C51在每个机器周期的S6中查询中断源,并在下一个机器周期的S1中响应相应的中断,并进行中断处理。

中断处理过程可分为3个阶段:中断响应、中断处理和中断返回。由于各计算机系统的中断系统硬件结构不同,中断响应的方式也有所不同。89C51单片机的中断处理过程说明如下:

以某输出外设提出接收数据请求为例,当CPU执行主程序到第K条指令时,外设向CPU发送信号告知自己的数据寄存器已“空”,提出接收数据的请求(即中断请求)。CPU接到中断请求信号,在本条指令执行完后,中断主程序的执行并保存断点地址,然后转去准备向外设输出数据(即响应中断)。CPU向外设输出数据(中断服务)完毕,CPU返回到主程序的第K+1条指令处继续执行(即中断返回)。中断响应时,首先应在堆栈中保护主程序的断点地址(第K+1条指令的地址),以便执行中断返回RETI指令时,能将断点地址从堆栈中弹出到PC,正确返回。

由此可见,CPU执行的中断服务程序如同子程序一样,因此又被称作中断服务子程序。但两者的区别在于,子程序是用LCALL(或ACALL)指令来调用的,而中断服务子程序是通过中断请求实现的。所以,在中断服务子程序中也存在保护现场、恢复现场的问题。

1.中断响应的条件

单片机响应中断最基本的条件是中断源有请求,CPU开中断(即EA=1)且对应中断源没有被屏蔽(即对应中断源的中断允许位不为0)。这样,在每个机器周期的S5P2期间,对所有中断源按用户设置的优先级和内部规定的优先级进行顺序检测,并可在S6期间找到所有有效的中断请求。若有中断请求,且满足下列条件,则在下一个机器周期的S1期间响应中断,否则将丢弃中断采样的结果。

CPU响应中断的条件有:

(1)中断源发出中断请求。

(2)中断总允许位EA=1,即CPU开中断。

(3)该中断源的中断允许位为1,即中断没有被屏蔽。

(4)无同级或更高级中断正在被服务。

(5)当前的指令周期已经结束。

(6)若现行指令为RETI或者是访问IE或IP指令,则该指令及下一条要执行的指令执行完毕。

2.中断响应过程

89C51的CPU在每个机器周期的S5P2期间顺序采样各个中断源,在该机器周期S6期间按优先级顺序查询中断标志。如查询到某个中断标志为1,则将在接下来的机器周期S1期间按优先级顺序进行中断处理。中断系统通过硬件自动将相应的中断矢量地址(表5-2)装入PC,以便进入相应的中断服务程序。

89C51单片机的中断系统中有两个不可编程的“优先级生效”触发器。一个是“高优先级生效”触发器,用以指明正进行高级中断服务,并阻止其他一切低级中断请求;另一个是“低优先级生效”触发器,用以指明正进行低优先级中断服务,并阻止除高优先级以外的一切中断请求。89C51单片机一旦响应中断,首先置位相应的中断“优先级生效”触发器,然后由硬件执行一条长调用指令LCALL:把当前PC值压入堆栈,以保护断点,再将相应的中断服务程序的入口地址(即中断矢量)送入PC,于是CPU接着从中断服务程序的入口处开始执行。

有些中断请求标志会在CPU响应中断后自动被清除,如定时器溢出标志TF0、TF1和边沿触发方式下的外部中断标志IE0、IE1;而有些中断标志不会自动清除,只能由用户用软件清除,如串行口接收发送中断标志RI、TI;在电平触发方式下的外部中断标志IE0和IE1则是取决于引脚的电平,CPU无法直接干预,需在引脚外加硬件电路(如D触发器),使其自动撤销外部中断请求。

CPU执行中断服务程序之前,自动将程序计数器PC的内容(断点地址)压入堆栈保护起来(但不保护状态寄存器PSW、累加器A和其他寄存器的内容);然后将对应的中断矢量装入程序计数器PC,使程序转向该中断矢量地址单元中,以执行中断服务程序。

由于89C51系列单片机的两个相邻中断源中断服务程序入口地址相距只有8个单元,一般容纳不下中断服务程序,通常是在相应的中断服务程序入口地址中放一条长跳转指令LJMP,这样就可以转到64KB的任何可用区域了。若在2KB范围内转移,则可存放AJMP指令。

中断服务程序从入口地址开始执行,一直到返回指令RETI为止。RETI指令的操作:一方面告诉中断系统该中断服务程序已执行完毕;另一方面把原来压入堆栈保护的断点地址从栈顶弹出,装入程序计数器PC,使程序返回到被中断的程序断点处继续执行。

CPU响应中断后,由硬件自动执行如下的功能操作:

(1)根据中断请求源的优先级高低,对相应的优先级状态触发器置1。

(2)保护断点,即把程序计数器PC的内容压入堆栈保存。

(3)清除内部硬件中断请求标志位(IE0、IE1、TF0、TF1)。

(4)把被响应的中断服务程序入口地址送入PC,从而转去执行相应的中断服务程序。各中断源的中断服务程序入口地址(中断矢量)见表5-2。

表5-2 中断服务程序入口地址

3.中断响应时间

所谓中断响应时间是指CPU从检测到中断请求信号到转入中断服务程序入口所需要的机器周期数。CPU在不同情况下对中断响应的时间是不同的。现以外部中断为例说明中断响应的最短时间。

以CPU响应外部中断为例,在每个机器周期的S5P2期间,引脚的电平被锁存到TCON的IE0和IE1标志位,CPU在下一个机器周期才会查询中断标志。这时,如果满足中断响应条件,下一条要执行的动作将是硬件长调用指令LCALL,使程序转至中断源对应的矢量地址入口。长调用指令本身要花费2个机器周期。这样,从外部中断请求有效到开始执行中断服务程序的第一条指令,中间要隔3个机器周期,这是最短的响应时间。

如果遇到中断受阻的情况,则中断响应时间会更长一些。例如,一个同级或高优先级的中断正在进行,则附加的等待时间将取决于正在进行的中断服务程序。如果正在执行的指令还没有进行到最后一个机器周期,则附加的等待时间为1~3个机器周期。因为一条指令的最长执行时间为4个机器周期(MUL和DIV指令)。如果正在执行的是RETI指令或者是读/写IE或IP的指令,则附加的时间在5个机器周期之内(完成正在执行的指令需要1个机器周期,下一条指令所需的最长时间为4个机器周期)。

若系统中只有一个中断源,则响应时间为3~8个机器周期。

4.中断处理

CPU响应中断后即转至中断服务程序的入口处,执行中断服务程序。从中断服务程序的第一条指令开始到返回指令为止,这个过程称为中断处理或中断服务。不同中断源服务的内容及要求各不相同,其处理过程也就有所区别。一般情况下,中断处理包括两部分内容:一是保护现场;二是为中断源服务。

保护现场的目的是为了确保现场信息不被破坏,这样,在响应完中断后能够恢复中断前的状态。由于中断事件是随机的,中断发生时,CPU或许有一些重要的数据或状态保存在某些寄存器中,如工作寄存器、PSW、A等。CPU执行中断程序时,往往会对这些寄存器进行修改,这样,中断返回后,就不能恢复这些寄存器的状态了。因此,执行中断服务之前,必须先保护现场,即把中断服务程序中使用的寄存器的内容保护起来,通常的做法是把寄存器的内容压入堆栈。在中断结束、执行RETI指令前,再恢复现场,即把堆栈的内容返回到对应的寄存器中。

中断源服务应针对中断源的具体要求进行相应的编程处理。

用户在编写中断服务程序时,应注意以下几点:

(1)各中断源的入口地址之间只相隔8个单元,一般的中断服务程序是容纳不下的,因而最常用的方法是在中断入口地址单元处存放一条无条件转移指令,转至存储器其他的任何空间。

(2)若在执行当前中断程序时禁止更高优先级中断,则应用指令关闭CPU中断或屏蔽更高级中断源的中断,在中断返回前再开放中断。

(3)在保护现场和恢复现场时,为了不使现场信息受到破坏或造成混乱,一般应关闭CPU中断,使CPU暂不响应新的中断请求。这样,在编写中断服务程序时,应注意在保护现场之前要关闭中断,在保护现场之后若允许高优先级中断嵌套,则应开中断。同样,在恢复现场之前应关闭中断,恢复之后再开中断。

5.中断返回

当某一中断源发出中断请求时,CPU决定是否响应这个中断请求。若响应此中断请求,则CPU必须在现行指令执行完后,把断点地址即现行PC值压入堆栈中保护起来(保护断点)。当中断处理完后,再将压入堆栈的断点地址弹到PC中(恢复断点),程序返回到原断点处继续运行。

在中断服务程序中,最后一条指令必须为中断返回指令RETI。CPU执行此指令时,一方面清除中断响应时所置位的“优先级生效”触发器;另一方面从当前栈顶弹出断点地址送入程序计数器PC,从而返回主程序。若用户在中断服务程序中进行了压栈操作,则在RETI指令执行前应进行相应的出栈操作,使栈顶指针SP与保护断点后的值相同。即在中断服务程序中,PUSH指令与POP指令必须成对使用,否则不能正确返回断点。