由图5-24可见,中断的完整过程大致可分为中断请求(或称中断申请)、中断排队、中断响应、中断处理(或中断服务)、中断返回共5步。图5-26为MCS-51单片机整个中断过程流程框图。
图5-26 MCS-51单片机整个中断过程流程框图
下面就详细讨论一下MCS-51单片机中实施这5步的具体办法。
5.3.2.1 中断请求
单片机的中断源发出中断请求信号,单片机内部的中断控制系统在每个机器周期对引脚信号进行采样,根据采样的结果来设置中断请求标志位的状态,中断请求完成后,中断请求标志位被置位。
1.MCS-51的中断源
MCS-51单片机的中断源比较少,也比较简单。51子系列单片机有5个中断源,它们分别是2个外部中断源、2个定时器/计数器中断源及1个串行口中断源。它们都属于硬件中断源,单片机无软件中断源。
两个外部中断源是通过P3.2(即)、P3.3(即)两个引脚由片外输入,主要用于单片机外部扩展部件的中断申请,因此它们被称为外部的中断源。而定时器/计数器和串行口两种部件属于单片机内部资源,因此,它们的中断申请称为内部的中断源。
(1)外部中断源。
1)外部中断0的中断请求信号由引脚P3.2(即)输入。
2)外部中断1的中断请求信号由引脚P3.3(即)输入。
外部中断源的触发信号有两种方式:电平触发方式和脉冲下降沿触发方式。
(2)定时器/计数器中断源。
1)定时器/计数器中断0(T/C0)。用作计数器时,其计数信号由引脚P3.4定时/计数器溢出时申请中断(T0)输入;用作定时器时,其定时信号取自单片机内部的定时脉冲。
2)定时器/计数器中断1(T/C1)。用作计数器时,其计数信号由引脚P3.5定时/计数器溢出时申请中断(T1)输入;用作定时器时,其定时信号取自单片机内部的定时脉冲。
(3)串行口中断源。串行口中断源分为发送中断(TI)和接收中断(RI)两种。发送或接收一帧数据后申请中断。
2.中断请求标志
在程序设计过程中,可以通过查询定时器/计数器的控制寄存器(TCON)、串行口控制寄存器(SCON)中的中断请求标志位来判断中断请求来自哪个中断源。
(1)定时器/计数器的控制寄存器TCON。TCON为定时器/计数器的控制寄存器,字节地址为88H,可位寻址。它锁存外部中断0、1的中断标志及两个定时器/计数器的溢出中断标志。TCON中的中断请求标志位如表5-1所示。
1)IT0(TCON.0):外部中断0触发方式控制位。选择外部中断请求0为跳沿(边沿)触发方式还是电平触发方式:IT0=0,为低电平触发方式;IT0=1,为下跳沿(边沿)触发方式。可由软件置“1”或清“0”。
表5-1 TCON中的中断请求标志位
2)IE0(TCON.1):外部中断0请求标志位。IE0=0,无中断请求;IE0=1,外部中断0有中断请求。当CPU响应该中断,转向中断服务程序时,由硬件清“0”IE0(电平触发)。
3)IT1(TCON.2):外部中断1触发方式控制位。选择外部中断请求1为跳沿(边沿)触发方式还是电平触发方式,意义与IT0类似。IT1=0,为低电平触发方式;IT1=1,为下跳沿(边沿)触发方式。可由软件置“1”或清“0”。
4)IE1(TCON.3):外部中断1请求标志位,意义与IE0类似。IE1=0,无中断请求;IE1=1,外部中断1有中断请求。当CPU响应该中断,转向中断服务程序时,由硬件清“0”IE1(电平触发)。
5)TF0(TCON.5):定时器/计数器T/C0溢出中断请求标志位。T0启动计数后,从初值加“1”计数,直至计数器全满产生溢出时,由硬件置“1”TF0,向CPU申请中断,CPU响应TF0中断时,硬件自动清“0”TF0,TF0也可由软件清0。
6)TF1(TCON.7):定时器/计数器T/C1溢出中断请求标志位,功能和TF0类似。T1计数后,溢出时,由硬件置“1”TF1,向CPU申请中断,CPU响应TF1中断时,硬件自动清“0”TF1,TF1也可由软件清0。
7)TR0(TCON.4)、TR1(TCON.6):这2个位与中断无关,是用于定时器/计数器T/C0、T/C1的计数启动,后面将介绍。
(2)特殊功能寄存器SCON中的中断请求标志位。SCON为串行口控制寄存器,字节地址为98H,可位寻址。它锁存串行口的发送中断标志TI和接收中断标志RI。SCON中的中断请求标志位如表5-2所示。
表5-2 SCON中的中断请求标志位
1)TI(SCON.1):串行口发送中断标志位。当CPU将一个8位数据写入串行口发送缓冲区SBUF时,就启动发送。每发送完一个串行帧,由硬件自动置位TI。必须在中断服务程序中用软件对TI标志清“0”。
2)RI(SCON.0):串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件自动置位RI。必须在中断服务程序中用软件对RI标志清“0”。
3)其他各位:与中断无关,而与串行口控制有关,将在后面相关章节介绍。
当MCS-51复位后,TCON、SCON被清0,所有中断请求标志为0。
CPU在每个机器周期的S5P2期间,会自动查询上面各个中断申请标志位,若查到某标志位被置位,将启动中断机制,中断请求完成后,中断请求标志位一般可被自动复位。
(3)外部中断的触发方式选择。前面已述,外部中断有电平、跳沿两种触发方式。其中:
1)电平触发方式(低电平)。CPU在每个机器周期采样到的外部中断输入线的电平,若为低电平时,则置“1”中断请求标志IE0/IE1,若为高电平时,将中断请求标志IE0/IE1清零。在电平触发方式下,CPU响应中断时不能自动清除中断请求标志IE0/IE1,中断请求标志由外部中断线的状态决定,所以,在中断服务程序返回前,必须撤除外部中断请求输入引脚的低电平(即变为高电平),否则CPU返回主程序后会再次响应中断,这就出现了一次中断请求被多次中断响应的“中断重复响应”问题。此外,由于CPU在每个机器周期自动查询一次各个中断申请标志位,因此,引脚输入的负脉冲宽度至少保持1个机器周期。
电平触发方式适于外中断以低电平输入且中断服务程序能清除外部中断请求(即外部中断输入电平又变为高电平)的情况。
2)跳沿触发方式(下降沿)。当连续两个机器周期采样外部中断输入线的电平,若一个机器周期采样到外部中断输入为高,而下一个机器周期采样为低,也就是出现从高电平变为低电平的下降沿,则置“1”中断请求标志IE0/IE1,当CPU响应此中断请求时,该IE0/IE1标志能自动清除(清0)。这样不会丢失中断,但引脚的高、低电平应各自保持1个机器周期以上。
一般情况,定义边沿触发方式为宜。若外中断信号无法适用边沿触发方式,必须采用电平触发方式时,应在硬件电路上和中断服务程序中采取撤除中断请求信号的措施,后面将介绍具体办法。
3.中断允许控制
MCS-51系列单片机中断允许控制分成总开关、分开关两个层次来实施控制。只有总开关允许(开放)且对应于某个中断源的相应分开关也允许,此中断申请也处于中断允许(开放)状态,否则总开关关闭(屏蔽)或者对应于某个中断源的相应分开关关闭(屏蔽),那么,此中断申请也处于中断禁止(关闭、屏蔽)状态。如果这些控制功能主要是通过特殊功能寄存器IE相关位的软件设定来实现的。
CPU通过SFR中的中断允许寄存器(IE)来控制中断源的开放或屏蔽。IE的字节地址为A8 H,可位寻址。IE的各位功能如表5-3所示。
表5-3 中断允许寄存器IE
(1)EA(IE.7):总的开关中断控制位。如果EA=0,则所有中断请求均被禁止(屏蔽);如果EA=1,则CPU开放(允许)中断,但5个中断源的中断请求是否允许,还要由IE中的5个中断请求允许控制位决定。
(2)EX0(IE.0):外部中断0控制位。如果EX0=1,则允许外部中断0申请中断;如果EX0=0,则禁止外部中断0申请中断。
(3)ET0(IE.1):定时器/计数器0中断控制位。如果ET0=1,则允许定时器/计数器0申请中断;如果ET0=0,则禁止定时器/计数器0申请中断。
(4)EX1(IE.2):外部中断1控制位,意义与EX0类似。如果EX1=1,则允许外部中断1申请中断;如果EX1=0,则禁止外部中断1申请中断。
(5)ET1(IE.3):定时器/计数器1中断控制位,意义与ET0类似。如果ET1=1,则允许定时器/计数器1申请中断;如果ET1=0,则禁止定时器/计数器1申请中断。
(6)ES(IE.4):串行口中断控制位。如果ES=1,则允许串行口申请中断;如果ES=0,则禁止串行口申请中断。
MCS-51复位后,IE清0,所有中断请求被禁止。若使某一个中断源被允许中断,除了IE相应的位的被置“1”,还必须使EA位=1。改变IE的内容,可由位操作指令或字节操作指令来实现。
【例5-2】 若允许片内2个定时器/计数器中断,禁止其他中断源的中断请求,请在主程序中编写设置IE的相应程序段。
1)采用位操作指令。
CLR ES ;禁止串行口中断
CLR EX1;禁止外部中断1中断
CLR EX0;禁止外部中断0中断
SETB ET0;允许定时器/计数器T0中断
SETB ET1;允许定时器/计数器T1中断
SETB EA ;CPU开中断
2)采用字节操作指令。
MOV IE,#8AH 或者 MOV 0A8H,#8AH ;A8H为IE寄存器字节地址,8AH=10001010B
5.3.2.2 中断排队(中断优先级)
MCS-51单片机采用外部可设定的两级优先级和内部已设定好的5级优先级串行的优先级排队方式。其中外部可设定的两级中断优先级通过SFR中的中断优先级寄存器IP来编程每一中断请求源为高优先级中断或低优先级中断。
1.中断优先级的控制原则
MCS-51单片机对中断优先级的控制原则如下:
(1)CPU同时接收到多个中断请求时,首先按照外部设定的两级优先级,把多个中断请求分成高、低两个优先队列,并准备响应高优先级队列中的中断请求。
(2)CPU同时接收到同一优先级的请求中断时,则优先响应哪一个中断,取决于内部已设定好的5级优先级,这相当于在同一个优先级内,还存在另一个辅助优先级结构。此时CPU通过内部硬件顺序查询,按自然优先级(即内部已确定的优先级)确定应该响应哪一个中断请求。自然优先级顺序由高至低为如表5-4所示。由表可见,同一个优先级的条件下,外部中断0的中断优先权最高,串行口中断优先权最低。
(3)CPU不同时接收到中断请求时,正在进行的中断过程不能被新的同级或低优先级中断请求所中断。
表5-4 同级中断的自然优先级顺序
(4)CPU不同时接收到中断请求时,正在进行的低优先级中断服务程序只能被高优先级中断请求所中断,从而实现低、高两级中断嵌套。如图5-27所示。
图5-27 两级中断优先级嵌套
上面4条原则中,(1)(2)两条、(3)(4)两条分别针对同时来多个中断请求、不同时来多个中断请求的。为了实现以上优先原则,MCS-51的中断系统内部有两个对用户不透明的、不可寻址的“中断优先级状态触发器”。其中:一个用于指明某高优先级中断正在得到服务,所有后来的中断都被阻断。另一个用于指明已进入低优先级服务,所有同级的中断均被阻断,但不能阻断高优先级的中断。
2.中断优先级寄存器IP
MCS-51单片机有外部可设定的两级中断优先级,它可由软件编程设置中断优先级寄存器IP中的相应位的状态来控制。
IP在片内RAM中的字节地址为B8H,可位寻址。可位寻址。IP的各位功能如表5-5所示。
表5-5 中断优先级寄存器IP
(1)PX0(IP.0):外部中断0优先级控制位。若PX0=1,则外部中断0被设定为高优先级中断;若PX0=0,则外部中断0被设定为低优先级中断。
(2)PT0(IP.1):定时器/计数器0中断优先级控制位。若PT0=1,则定时器/计数器0被设定为高优先级中断;若PT0=0,则定时器/计数器0被设定为低优先级中断。
(3)PX1(IP.2):外部中断1优先级控制位,意义与PX0类似。若PX1=1,则外部中断1被设定为高优先级中断;若PX1=0,则外部中断1被设定为低优先级中断。
(4)PT1(IP.3):定时器/计数器1中断优先级控制位,意义与PT0类似。若PT1=1,则定时器/计数器1被设定为高优先级中断;若PT1=0,则定时器/计数器1被设定为低优先级中断。
(5)PS(IP.4):串行口中断优先级控制位。若PS=1,则串行口中断被设定为高优先级中断;若PS=0,则串行口中断被设定为低优先级中断。
当系统复位时后,IP的低5位全部清零,即将所有的中断源设置为低优先级中断。
【例5-3】 设置IP寄存器的初始值,使2个外中断请求为高优先级,其他中断请求为低优先级。
(1)采用位操作指令。
(2)采用字节操作指令。
MOV IP,#05H 或者 MOV 0B8H,#05H ;B8H为IP寄存器的字节地址,05H=00000101B
5.3.2.3 中断响应
中断响应是对中断源提出的中断请求的接受。CPU在中断查询(检测)中,当查询到有效的中断请求(中断标志为“1”)时,在满足中断响应条件下,紧接着进行中断响应。
1.中断响应的条件
一个中断请求被响应,需满足以下6个必要条件:
(1)IE寄存器中的中断总允许位EA=1,相当于CPU开放中断。(www.xing528.com)
(2)该中断源发出中断请求,即该中断源对应的中断请求标志为“1”。
(3)该中断源的中断允许位=1,对应的中断源允许中断,也即该中断没有被屏蔽。
(4)无同级或更高级中断正在被CPU响应并服务。
(5)当前正处于所执行指令的最后一个机器周期,也即当前的指令周期将结束。
(6)正在执行的指令不是RETI或者是访向IE、IP的指令,否则除了需要执行这些指令外,还必须再另外执行这些指令后面的一条指令后才能响应。
当CPU查询到有效的中断请求时,在满足上述条件时,紧接着就进行中断响应。
2.中断响应的阻断
中断响应是有条件的,遇到下列3种情况之一时,中断响应被封锁(阻断):
(1)当前CPU正在处理同级的或更高级的中断。
(2)当前的机器周期不是执行指令的最后一个机器周期,也就是正在执行的那条指令没有执行完。只有在当前指令执行完毕后,才能进行中断响应。
(3)正在执行的指令是RETI或对IE、IP的写操作指令。此时,只有在执行这些指令后,至少再执行一条指令后才会响应新的中断请求。
如果存在上述3种情况之一,CPU将丢弃中断查询结果,不对中断进行响应。
程序调试时的单步执行就是利用上面(3)的阻断原理,借助单片机的外部中断功能来实现的。所谓单步工作方式就是按一次键,CPU执行一条主程序的指令。
【例5-4】 下面就介绍一下实现单步执行的硬件与软件。
(1)首先,建立单步执行的外部控制电路。假设利用外部中断实现,以按键产生脉冲作为外部中断0的中断请求信号,经端输入,并把电路设计成不按键为低电平,按键时产生高电平,这样按一次键就产生一个正脉冲。如图5-28所示。
(2)然后,编写外部中断的中断服务程序。设置为电平触发方式(低电平有效)。图5-29单步执行的流程框图。
图5-28 单步执行的外部控制电路
图5-29 单步执行的流程框图
汇编语言参考程序为:
这样在没有按键的时候,,中断请求有效,单片机响应中断,但转入中断服务程序后,只能在它的JNB P3.2,$指令上“原地踏步”。只有按一次单步按键,产生下脉冲使,才能通过此指令而到下一条JB P3.2,$指令上去“原地踏步”。当正脉冲结束后,再结束JB P3.2,$指令通过RETI指令返回主程序。而根据上面的阻断原理(3)的中断机制,即从中断服务程序返回主程序后,至少要执行一条指令,然后才能再响应新的中断。为此单片机从上述中断0的中断服务程序返回主程序后,能且只能执行一条指令。这时已为低电平,外部中断0请求有效,单片机就再一次中断响应,并进入中断服务程序去踏步。从而实现了主程序的单步执行。
3.中断响应的操作过程
图5-30为中断响应与中断处理过程的流程图。
图5-30 中断响应和中断处理过程的流程图
(1)查询中断源。以确定有无中断请求以及是哪一个中断请求。首先,CPU仅对外部中断请求信号的引脚进行中断采样。接着,CPU在每个机器周期的S5P2采样,按优先级顺序对TCON和SCON中的中断请求标志位进行查询,即先查询高级中断后再查询低级中断,同级中断按“外中0→T0→外中1→T1→串行口”的顺序查询。在S6找到中断源,如果查询到有标志位为“1”,则表明有中断请求发生。由于中断请求是随机发生的,CPU无法预先得知,因此在程序执行过程中,中断查询要在指令执行的每个机器周期中不停地重复进行。
(2)置位两个“优先级生效触发器”的中断处理标志。当查找出来的中断源满足中断申请条件且没有被中断阻断条件阻止的情况,则将在下一个机器周期的S1状态开始响应最高中断请求。单片机一旦响应中断,首先对不可编程的“高优先级生效触发器”或“低优先级生效触发器”置位,指明已进行高优先级或低优先级的中断服务以阻止其他的中断请求或阻止除高优先级以外的全部其他中断请求。
(3)转入中断服务程序。执行一条硬件子程序调用(相当于LCALL addr16指令),它要做两个工作:
1)保护断点:断点地址的PC值压入堆栈(先送低8位,再送高8位)。
2)转去执行中断服务程序:把被响应的中断服务程序的入口地址装入PC并执行。单片机的各中断源服务程序的入口地址是固定的,如表5-6所示。由于5入口之间间隔仅8个字节,存放不下中断程序,所以一般加一条跳转指令AJMP或LJMP,跳转到真正的中断程序。
表5-6 中断入口地址表
续表
由上述过程可知,单片机响应中断后,只保护断点而不保护现场(如标志位寄存器PSW的内容),且不能自动清除串行口中断请求标志(TI和RI),也无法清除低电平触发的外中断申请信号,所有这些应在用户编制中断处理程序时予以考虑。
4.外部中断的响应时间
中断响应时间是指从中断响应有效(标志位置1)到转向其中断服务程序的入口地址所需的时间。在一个单一中断的系统里,MCS-51单片机对外部中断请求的响应的时间在3~8个机器周期之间。
(1)在一个单一中断的系统里,外部中断的最短的响应时间为3个机器周期:
1)外部硬件执行中断请求标志位IE0/IE1查询占1个机器周期。
2)“子程序调用指令LCALL”转到相应的中断服务程序入口,需2个机器周期。
(2)在一个单一中断的系统里,外部中断响应的最长的响应时间为8个机器周期:
1)发生在CPU进行中断标志查询时,刚好是开始执行RETI或是访问IE或IP的指令,则需把当前指令执行完再继续执行一条指令后,才能响应中断,最长需2个机器周期。
2)接着再执行一条指令,按最长指令(乘法指令MUL和除法指令DIV)来算,最长需4个机器周期。
3)加上硬件“子程序调用指令LCALL”的执行,需要2个机器周期。
(3)如果已经在处理同级或更高级中断,外部中断请求的响应时间取决于正在执行的中断服务程序的处理时间,这种情况下,响应时间就无法计算了。
5.中断请求的撤销
在CPU响应中断后,应撤销该中断请求,否则会引起再次中断,也即出现“重复响应”问题。
(1)定时器中断请求的撤销:在CPU响应中断后,由中断机构硬件自动撤销中断请求标志TF0和TF1。
(2)边沿(跳沿)触发的外部中断请求撤销:脉冲信号过后就消失了,在响应中断后由中断机构硬件自动撤销中断请求标志IE0和IE1。
(3)电平触发的外部中断请求撤销:CPU响应中断后,必须立即撤除引脚上的低电平触发信号,才能由硬件自动撤销中断请求标志IE0和IE1。
此方式除了标志位清“0”之外,还需设法在中断响应后把中断请求信号引脚从低电平强制改变为高电平,如图5-31所示。图中,采用D触发器锁存外来的中断请求低电平,并通过D触发器的输出端Q接到。因此,增加的D触发器不影响中断请求。
中断响应后,利用D触发器的直接置位端(端)接MCS-51的P1.0端。因此,只要P1.0端输出一个负脉冲就可以使D触发器置“1”,从而撤销了低电平的中断请求信号。所需的负脉冲可在中断服务程序中增加下面3条指令来得到:
ORL P1,#01H或SETB P1.0 ;P1.0为“1”,即P1.0为高电平
ANL P1,#0FEH或CLR P1.0 ;P1.0为“0”,即P1.0为低电平
ORL P1,#01H或SETB P1.0 ;P1.0为“1”,即P1.0为高电平
图5-31 电平触发外部中断请求的撤销电路
因此,电平方式的外部中断请求信号的完全撤销,是通过软、硬件相结合的方法来实现的。
(4)串行口中断请求的撤销:CPU响中断后,CPU无法知道是接收中断还是发送中断,还需测试RI和TI两个中断标志位的状态,以判定是接收操作还是发送操作,然后才能清除RI和TI。因此,中断请求标志RI和TI不会被自动撤销,需要用软件来撤销,这在编写串行中断服务程序时应加以注意。清除TI和RI的指令为:
CLR TI ;清TI标志位,即TI=0
CLR RI ;清RI标志位,即TI=0
5.3.2.4 中断处理
1.中断服务的流程
中断处理应根据任务的具体要求,来编写中断处理部分的程序。中断服务程序的基本流程如图5-30所示。图中,中断服务是中断服务程序的主体,它完成相应的中断服务操作,在编写中断服务程序时,要注意保护现场/恢复现场、关中断/开中断两个问题。
(1)现场保护和现场恢复。现场是指中断发生时单片机中某些工作寄存器R0~R7、特殊功能寄存器(如A、B、PSW、DPTR等)、存储器单元中的数据或状态标志。为使中断服务子程序的执行不破坏这些数据或状态,因此要送入堆栈保存起来,这就是现场保护。现场保护一定要位于中断处理程序的前面。
中断处理结束后,在返回主程序前,则需要把保存的现场内容从堆栈中弹出恢复原有内容,这就是现场恢复。现场恢复一定要位于中断处理的后面。
堆栈操作指令供现场保护和现场恢复使用的。要保护哪些内容,应根据具体情况来定。
(2)关中断和开中断。现场保护前和现场恢复前关中断,是为防止此时有高一级的中断进入,避免现场被破坏。在保护和恢复现场时可关闭CPU中断,以免造成混乱。
在现场保护和现场恢复之后的开中断是为下一次的中断做好准备,也为了允许有更高级的中断进入。这样,中断处理可以被打断,但原来的现场保护和现场恢复不允许更改,除了现场保护和现场恢复的片刻外,仍然保持着中断嵌套的功能。
但有时候,一个重要的中断,必须执行完毕,不允许被其他的中断嵌套。可在现场保护前先关闭总中断开关位,待中断处理完毕后再开总中断开关位。这样,需把图中的“中断处理”步骤前后的“开中断”和“关中断”去掉。
在保护和恢复现场时,为了不使现场数据遭到破坏或造成混乱,一般规定此时CPU不再响应新的中断请求。因此,在编写中断服务程序时,要注意在保护现场前关中断,在保护现场后若允许高优先级中断,则应开中断。同样,在恢复现场前也应先关中断,恢复之后再开中断。
2.中断服务程序的设计
(1)中断服务程序设计的基本任务。
1)设置中断允许控制寄存器IE。
2)设置中断优先级寄存器IP。
3)若为外中断,设定外部中断是采用电平触发还是跳沿触发。
4)编写中断服务程序,处理中断请求。
前3条的中断系统初始化一般放在主程序的初始化程序段中。
(2)采用中断时的主程序结构。常用的主程序结构为:
【例5-5】 根据图5-30的中断服务程序流程,编出中断服务程序。假设保护现场只需将PSW和A的内容压入堆栈中保护。典型的中断服务程序为:
几点说明:
(1)各中断源的中断入口地址之间只相隔8个字节,容纳不下普通的中断服务程序,因此,在中断入口地址单元通常存放一条LJMP或AJMP无条件转移指令,可将中断服务程序转至存储器的其他任何空间。
(2)现场保护仅涉及PSW和A的内容,如还有其他需保护的内容,只需要在相应的位置再加几条PUSH和POP指令即可。
(3)“中断处理程序段”,应根据任务的具体要求来编写。
(4)如果本中断服务程序不允许被其他的中断所中断。可将“中断处理程序段”前后的“SETB EA”和“CLR EA”两条指令去掉。
(5)若要在执行当前中断程序时禁止其他更高优先级中断,需先用软件关闭CPU中断,或用软件禁止相应高优先级的中断,在中断返回前再开放中断。
(6)中断服务程序的最后一条指令必须是返回指令RETI。
5.3.2.5 中断返回
中断服务子程序最后一条指令必须是中断返回指令RETI。RETI指令表示中断服务程序的结束。RETI指令完成下面两个操作。
1.清除中断服务标志
清除中断响应时所置位的不可寻址的“优先级生效触发器”,从而开放同级中断,以便允许同级中断源请求中断。
2.恢复断点地址
由栈顶弹出断点地址送程序计数器PC,从而实现从子程序返回主程序的断点处,并重新执行主程序。
实际上,子程序返回主程序的指令RET只做第2项操作,因此,中断返回指令RETI不能用RET代替。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。