中断标志在CPU时钟的上升沿被采样,如果一个标志被置起,那么CPU捕获到后中断系统调用一个
长转移指令(LCALL)调用其中断服务程序,但由硬件产生的LCALL会被下列任何条件阻止:
1. 同级或更高级的优先级中断在运行中。
2. 当前的周期不是执行中指令的最后一个周期。换言之,正在执行的指令完成前,任何中断请求
都得不到响应。
3. 正在执行的是一条 RETI 或者访问专用寄存器 IE/IE1 或是 IP0/IP1/IP2/IP3 的指令。换言之,在
RETI 或者读写 IE/IE1 或是 IP0/IP1/IP2/IP3 之后,不会马上响应中断请求,而至少在执行一条其它指
令之后才会响应。
中断服务程序ISR完成和该中断相应的一些操作。ISR以RETI(中断返回)指令结束,将PC值从栈
中取回,并恢复原来的中断设置,之后从主程序的断点处继续执行。
当某中断被响应时,被装载到程序计数器PC中的数值称为中断向量,是该中断源相对应的中断服
务程序的起始地址。各中断源服务程序的入口地址(即中断向量)明细可参照中断汇总。
由于中断向量入口地址位于程序存储器的开始部分,所以主程序的第1条指令通常为跳转指令,越
过中断向量区(LJMP MAIN)。
需要注意的是,不能用RET指令代替RETI指令,RET指令虽然也能控制PC返回到原来中断的地方,
但RET指令没有清零中断优先级状态触发器的功能,中断控制系统会认为中断仍在进行,其后果是与此
同级或低级的中断请求将不被响应。
若用户在中断服务程序中进行了入栈操作,则在RETI指令执行前应进行相应的出栈操作,即在中
断服务程序中PUSH指令与POP指令必须成对使用,否则不能正确返回。 |