5.3.2 中断返回
CPU响应中断时,首先保存断点,然后将中断向量装入程序计数器PC,转到中断服务程序的入口地址,执行完中断服务程序后,从中断返回。CPU响应中断时,同时还要设置相应的中断优先级状态寄存器。当中断返回时,也要清除相应的中断优先级状态寄存器,从而实现中断优先级及中断嵌套。
1.保存断点
CPU执行中断服务程序之前,自动将程序计数器PC的内容(即断点地址)压入堆栈保护起来。
2.取中断向量
80C51单片机有5个中断源,对应5个中断向量地址。各中断源及对应的中断向量地址如表5-2所示。
表5-2 中断源及对应的中断向量地址
取中断向量是指CPU将对应的中断向量地址装入程序计数器PC,使程序转向该中断向量单元,从该中断向量所指向的ROM单元继续执行,此单元中往往存放一条无条件转移指令LJMP,使程序转去执行中断服务程序。这样,中断服务程序便可灵活地安排在程序存储器的任何位置。
3.执行中断服务程序及中断返回
中断服务程序首先要保护现场,然后进行中断处理、恢复现场和中断返回。
保护现场:将中断服务程序所使用的有关寄存器的内容压入堆栈保存起来。因为,中断服务程序的执行可能会改变这些寄存器原有的内容。
中断处理:根据中断源的要求,进行具体的服务操作。
恢复现场:将压栈的内容再弹出,恢复到有关寄存器,恢复发生中断时断点处寄存器的内容,使原程序能够正确地继续执行。
中断返回:由一条中断返回指令RETI来完成。中断返回指令RETI将堆栈中保护的断点地址弹出,赋值给程序计数器PC,这样便可从中断服务程序返回到原有程序的断点处,继续执行原来的程序。原来的程序称为主程序;中断服务程序称为中断服务子程序。
4.清除响应中断后各中断标志位
CPU在响应中断后,会自动清除一些中断标志位。它能自动清除定时器/计数器溢出中断标志位TF0和TF1,以及下降沿触发下的外部中断标志位IE0和IE1。但是串行口的发送、接收中断标志TI和RI在中断响应后不会自动清除,只能由用户用软件清除。对于电平触发方式下的外部中断标志位IE0和IE1,CPU无法直接干预,需要在引脚处外加硬件电路(如D触发器),使其撤销外部中断请求。