中断服务程序的设计要考虑以下几个因素。
1 中断程序入口及安排
由表4-6可见,两相邻中断服务程序的入口地址之间只相距8B,而一般服务程序长度都会超过8B,这样就必须在中断入口地址处安排一条跳转指令,将程序转移到别的存储空间,以避免和下一个中断地址相冲突。程序结构如下:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0
ORG 000BH
LJMP T0
…
ORG 0030H
MAIN:…;主程序
…
INT0:…;外部中断0处理程序
…
RETI
T0:;T0中断处理程序
…
RETI
…(www.xing528.com)
2 现场保护和工作寄存器分区
中断服务程序中要使用与主程序有关的寄存器,因此CPU在中断之前要保护这些寄存器的内容,即要“保护现场”,而在中断返回时又要使它们恢复原值,即“恢复现场”。同时为了避免中断程序与主程序中所用的工作寄存器R0~R7冲突,一般将主程序和不同的中断源之间使用不同的寄存器组,故常用的中断服务程序结构如下:
SERV:PUSH PSW;保护程序状态字和中断子程序前所选的寄存器组
PUSH ACC;保护累加器A
PUSH B;保护寄存器B
PUSH DPL;保护数据指针低字节
PUSH DPH;保护数据指针高字节
SETB RS0;选择寄存器组1
CLR RS1
…;中断处理程序
POP DPH;恢复现场
POP DPL
POP B
POP ACC
POP PSW
RETI;中断返回
要注意PUSH和POP指令必须成对使用。否则,可能会使保存在堆栈中的数据丢失,或使中断不能正确返回。此外,只有在中断程序中要使用的寄存器内容才需要加以保护。
3 高优先级中断源的中断禁止(如有需要)
单片机具有两级中断优先级,可实现两级中断嵌套。高优先级的中断请求可以中断低优先级的中断处理。但是,对于某些不允许被中断的服务程序来说,也可以在CPU响应中断后用CLR指令(或其他指令)对IE寄存器某些位清0来禁止相应高优先级中断源的中断。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。