为了建立中断过程的整体概念,下面以外部中断为例,介绍中断前的初始化设置、中断请求的提出、中断响应、中断服务程序的执行以及中断返回等中断处理的全过程。
1.初始化设置
外部中断源一般指外部设备。当MCU采用中断方式与外部设备交换数据时,首先要对接口及中断控制寄存器等进行初始化设置,在程序中主要是完成下列操作。
1)关中断,即初始化过程不能被打断。
2)设置中断控制工作方式,包括中断源使能、屏蔽、标记等。
3)设置接口中其他有关部件的工作方式。
4)将中断服务程序的入口地址保存在某个指定的地方(例如中断向量表中),以便响应中断时实现程序的切换。
5)启动外部设备。
6)开中断,允许在程序执行过程中随时响应外设提出的中断请求。
2.中断请求
外设启动后正常运行,当满足中断触发条件时,外设便向MCU提出中断请求,要求为其进行服务。如该中断源未被屏蔽,经中断控制器判优后向CPU发送中断请求信号。
3.中断响应
CPU收到请求信号后,如果处于开中断状态且无更高级别的请求时,便于当前指令结束时进入中断响应周期。该周期是指CPU响应中断后,到转入服务程序入口这段时间,主要完成程序的切换。CPU响应中断后,一方面向中断控制器发“允许”信号,并查询中断源,另一方面CPU执行中断控制,完成下面一系列操作。
1)关中断,在本次中断响应过程中不再响应新的中断请求,以保证操作执行不受干扰。(www.xing528.com)
2)保存断点,一般CPU会将断点压入堆栈保存。该操作是保护当前程序被中断处的地址,通常该地址是程序计数器PC中的内容,也是中断结束后需返回的地址。
3)取中断向量,中断向量指的是中断服务程序的入口地址。CPU接收中断控制器送来的中断类型号,将其转换为该类型号对应的向量地址。CPU根据向量地址访问中断向量表,通过查找中断向量表取得相应的中断服务程序入口,转入中断服务程序。
4.中断服务程序的执行
对于不同类型的中断,其中断服务程序的基本结构大致相同。图6-3给出了一般中断服务程序流程,包含下面几个步骤。
1)保护现场,一般是将中断服务程序所要使用的有关寄存器的内容压入堆栈保存。因为服务程序的执行可能会改变这些寄存器原来的值,事先保存起来,便于以后恢复。
2)开中断,由于在中断响应阶段中已经关中断,因此在中断服务程序中保存现场状态后要开中断以允许中断嵌套。如果是单中断系统,则不设置开中断步骤。
3)进行中断处理,根据中断源的要求进行具体的服务操作。例如在MCU与外设之间传送数据或进行检测等,处理过程应尽量简短,使执行时间尽可能压缩到最小,以便尽快返回到被打断的程序中,保证各级嵌套程序能较快地得到执行。
4)发中断结束命令清除标记,中断处理完毕后需用命令清除中断控制寄存器中的当前服务标志。因为一旦有新的请求到来,中断控制器会将该请求与当前服务的中断事件进行优先级比较。如果当前服务已经结束但又未清除服务标志,则会屏蔽同级或低级的中断请求。
图6-3 中断服务程序流程
5)关中断并恢复现场,恢复现场与保护现场一样,不应受到干扰,因此从堆栈弹出原来所保存的现场信息之前应先关中断。当然,对单中断而言,由于在进入服务程序之后一直未开中断,所以此处不执行关中断操作。
6)开中断并返回断点,由于中断程序的插入是随机的,无法在返回原来程序之后再来开中断,因此必须在中断返回之前由中断服务程序执行开中断指令,然后再执行中断返回指令,从堆栈弹出返回地址便可返回到原来程序的断点处。当返回源程序后,由于CPU已经处于开中断状态,因此又可以响应新的中断请求。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。