中断程序设计思想

五、中断程序设计思想

中断系统是由硬件构成的,必须有相应的软件配合才能正确使用。设计中断程序需要弄清以下几个方面的问题。

1.中断程序设计的任务

每一个中断程序设计需要考虑许多问题,主要有以下几个任务:

(1)设置中断允许控制寄存器IE,允许或禁止相关中断源。

(2)设置中断优先级寄存器IP,分配所使用中断源的优先级。

(3)若是外部中断源,应设置中断触发方式,决定采用边沿触发方式还是电平触发方式。

以上三条一般放在初始化主程序中。例如,假设允许外部中断1中断,并设定它为高级中断,其他中断源为低级中断,采取边沿触发方式。在主程序中可使用如下指令:

SETB  EA

SETB  EX1

SETB  PX1

SETB  IT1

(4)编写中断服务程序,处理中断请求。

2.中断入口地址

中断入口地址和中断源具有一一对应关系,见表5-2。响应中断时,系统自动转入相应的中断入口地址,从入口地址开始执行中断服务程序,直到返回指令RETI为止。

3.采用中断时主程序结构

由于各个中断入口地址是固定的,而程序又必须从主程序起始地址0000 H执行,所以在0000H起始地址的几个字节中,要用无条件转移指令,跳转到主程序。另外,各中断入口地址之间只差8个字节。中断服务程序稍长就超过了8字节,如果将超过8字节的中断服务子程序直接放在中断入口地址处,那么就可能占用了其他的中断入口地址,影响了其他中断源的中断。因此,一般在中断进入后,需要利用一条无条件转移指令,把中断服务程序调转到远离其他中断入口的适当地址。以下为包含T0中断服务子程序的程序结构:

以下是中断服务程序的一些编程技巧:

(1)在中断服务程序入口处置一条无条件转移指令。

(2)软件保护现场,以免现场信息丢失。

1)保护现场和恢复现场前关中断,是为了防止此时有更高一级的中断进入,破坏现场。

2)保护现场和恢复现场后开中断,是为了下一次中断做准备,也为了允许有更高一级的中断进入。

(3)CPU响应完中断后,硬件自动清0中断请求标志,但串行口中断除外。

(4)程序中可以禁止高级中断。

(5)PUSH和POP应成对使用。

(6)以RETI结尾

【例5-3】现有外部中断1提出申请,且中断服务程序中有R0、R1、DPTR、累加器A需保护,当前工作寄存器为0区,试编写程序实现。

解:

编程中应注意以下问题:

(1)在0000H放一条跳转到主程序的跳转指令,这是因为89C51单片机复位后PC的内容为0000H,程序从0000H开始执行,紧接着0003H是中断程序入口地址,故在此中间只能插入一条转移指令。

(2)响应中断时,CPU先自动执行一条隐指令“LCALL 0013H”,而0013H(定时器1溢出中断入口地址)至001BH之间可利用的存储单元不够,故放一条无条件转移指令跳转至INT1。

(3)在中断服务程序的末尾,必须安排一条中断返回指令RETI,使程序自动返回主程序。

设计中断服务程序时,哪些功能应该放在中断程序中,哪些功能应该放在主程序中,这是一个很重要的问题。一般来说,中断服务程序应该做最少量的工作。尽量简化中断程序,把软件的主要代码放入主程序中,仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的中断服务程序。中断程序中放入的东西越多,它们之间越容易起冲突。