中断程序的工作流程可以总结为以下几个步骤:
中断请求
中断源发出中断请求,请求CPU进行干预。中断请求可以来自外部设备或内部事件。
中断响应
CPU检测到中断请求后,如果系统开中断(IF=1),则自动取得中断服务子程序的入口地址,并执行中断服务子程序。对于外部中断,CPU会在执行当前指令的最后一个时钟周期查询INTR引脚,若查询到中断请求信号有效,则向发出中断请求的外设回送一个低电平有效的中断应答信号。
关闭中断
CPU响应中断后,会输出中断响应信号,并将状态标志寄存器FR或EFR的内容压入堆栈保护起来。然后将FR或EFR中的中断标志位IF与陷阱标志位TF清零,从而自动关闭外部硬件中断。这是为了保护中断现场,防止在处理中断时被新的中断打断。
保护断点
保护断点即将CS(代码段寄存器)和IP/EIP(指令指针寄存器)的当前内容压入堆栈保存,以便中断处理完毕后能返回被中断的原程序继续执行。这一过程也是由CPU自动完成的。
引出中断服务程序
引出中断服务程序即读取中断服务程序的入口地址,并送程序计数器PC,以便执行中断服务程序。对于向量中断和非向量中断,引出中断服务程序的方法有所不同。
执行中断服务程序
CPU执行中断服务程序,该程序会针对中断事件进行处理。在中断服务程序中,可能会进行硬件故障报警与处理、支持多道程序并发运行、支持实时处理功能等操作。
中断返回
中断服务程序执行完毕后,CPU需要恢复被中断的程序。通过执行中断返回指令IRET,系统自动将堆栈内保存的IP/EIP和CS值弹出,从而恢复主程序断点处的地址值,并恢复标志寄存器FR或EFR的内容,使CPU转到被中断的程序中继续执行。
恢复现场
在中断服务程序执行完毕后,CPU需要恢复中断前的现场,包括恢复寄存器中的数据,以便继续执行原来的程序。
重新开启中断
中断处理完毕后,CPU会重新开启中断,允许更高级的中断请求打断低级的中断服务程序。
通过以上步骤,中断程序能够有效地处理中断请求,并在处理完毕后返回到原来的程序继续执行,从而保证系统的稳定运行和高效处理多个任务。