从中断请求发生到中断被响应,再转向执行中断服务程序去完成中断所要求的操作,是一个完整的中断处理过程。下面介绍80C51单片机的中断响应过程。
1.外部中断请求采样
只有外部中断请求才有采样问题,因为它们来自单片机芯片的外部,而且是随机的,只有通过采样才能知道是否有中断请求信号到来。
采样是在每个机器周期的S5P2(第5状态第2拍节)对芯片引脚INT0(P3.2)和INT1(P3.3)进行的,根据采样结果来设置定时器控制寄存器TCON外部中断标志位的状态,从而把外部中断请求锁定在这个寄存器中。对于电平方式的外部中断请求,采样到低电平即为有效的中断请求,应把IE0(或IE1)置1;对于脉冲方式的外部中断请求,若两个相邻机器周期的采样结果为先高电平后低电平,则为有效的中断请求信号,应把IE0(或IE1)置1。
2.中断查询
因为中断发生是随机的,无法事先预知,所以必须主动检测,这一过程称为中断查询。中断查询是查看是否有中断请求发生并确定是来自哪一个中断源的中断请求。中断查询操作是由CPU逐个检测定时器控制寄存器TCON和串行控制寄存器SCON中各中断标志位的状态而实现的,因为所有中断请求最终都要汇集到这两个寄存器中。其中,外部中断的中断请求是通过采样得到的;而定时中断和串行中断的中断请求就发生在芯片内部,若有中断发生就通过硬件把相应的标志位直接置位。
80C51单片机是在每一个机器周期的最后一个状态S6进行中断查询,查询按优先级顺序进行。具体为先高级中断后低级中断,同级中断按“外部中断0→定时器0中断→外部中断1→定时器1中断→串行中断”的顺序进行。如果查询到有标志位为1,则表明有中断请求发生,接着就从相邻的下一个机器周期的S1状态开始进行中断响应。
中断请求汇集及查询如图5-1所示。由于中断请求是随机发生的,是CPU无法预知的,因此,在程序执行过程中,中断查询要在指令执行的每个机器周期进行一遍。
3.中断响应
中断响应就是接受中断源提出的中断请求。在一次中断查询之后,当发现有中断请求时,紧接着就进行中断响应。
中断响应的主要内容是由硬件自动生成一条长调用指令,指令格式为“LCALL addr16”。这里的addr16就是程序存储器中断区中相应中断的入口地址,在80C51单片机中,这些入口地址已由系统设定。例如,对于外部中断0的响应,产生的长调用指令为“LCALL 0003H”。(www.xing528.com)
生成LCALL指令后,紧接着由CPU执行。首先将程序计数器PC的内容压入堆栈以保护断点,再将中断入口地址装入PC,使程序执行转向相应的中断入口地址。
中断响应是有条件的,并不是查询到的中断请求都能立即响应。当存在下列情况之一时,中断响应将被封锁:
1)CPU正处在为一个同级或高级的中断服务中。因为当一个中断被响应时,要把对应的优先级触发器置位,即封锁了低级和同级中断的响应。
2)查询中断请求的机器周期不是当前指令的最后一个机器周期。作此限制的目的在于使当前指令执行完毕后,才能进行中断响应,以确保指令的完整执行。
3)当前指令是返回指令(RET,RETI)或访问IE、IP的指令。因为80C51中断系统规定,在执行完这些指令之后,还应再继续执行一条指令,然后才能响应中断。
80C51对中断查询的结果不作记忆,由于上述这些原因而被拖延的查询结果将不复存在。其后将按新的查询结果进行中断响应。
4.中断响应的快慢
如果中断查询的机器周期恰好是指令的最后一个机器周期,则最快只需3个机器周期就可以转向中断服务程序的入口。其中,查询占1个机器周期,在这个机器周期结束后中断即被响应,生成LCALL指令。执行这条长调用指令需要2个机器周期。
实际上中断响应不一定这么顺利,下面看一个中断响应最慢的情况。如果中断查询刚好是开始执行RET、RETI或访问IE、IP的指令,则需把当前指令执行完再继续执行一条指令后,才能进行中断响应。这些指令中最长执行时间需2个机器周期。而如果接着再执行的指令恰好是MUL(乘)或DIV(除)指令,则又需4个机器周期。再加上执行长调用指令LCALL所需的2个机器周期,从而形成了8个机器周期的最长响应时间。
一般情况下,中断响应时间的长短无需考虑,只有在精确定时的应用场合才认真对待中断响应时间,以保证定时的精确控制。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。