ARM7TDMI内核具有两个中断输入,分别为IRQ中断和FIQ中断。中断向量控制器不是ARM设计的,ARM只提供以上两个中断输入接口,中断向量控制器是由各个厂商根据自己的实际情况设计的。下面介绍的是lpc2000系列的中断向量控制器。
中断向量控制器的作用是允许哪些中断源可以产生中断、可以产生哪类中断、产生中断后执行哪段服务程序。
允许中断源产生中断由寄存器VICIntEnable和VICIntEnClr控制,前者使能中断,后者禁止中断。VICIntEnable寄存器中每一位控制着一个中断源,各中断源的位置与中断源列表所示相同。向某位写入1时,允许对应的中断源产生中断。(这一部分中的寄存器操作和此寄存器相类似,后面不再叙述)VICIntSelect为选择IRQ或FIQ寄存器。相应位写0为IRQ,写1为FIQ。
中断输入请求可以在VIC中被设置为以下三类:
1、FIQ中断:具有最高优先级;
使用时最好至多设置一个中断源为FIQ,因为设置多个FIQ中断,在发生中断后要在程序中查找中断源,降低了效率。
2、向量IRQ中断:具有中等优先级;
VIC最多支持32个向量IRQ中断,这些中断被分为32个优先级,并且为每个优先级指定一个服务程序入口地址。在发生向量IRQ中断后,相应优先级的服务程序入口地址被装入向量地址寄存器VICVectAddr中,通过一条ARM指令即可跳转到相应的服务程序入口处,所以向量IRQ中断具有较快的中断响应。
3、非向量IRQ中断:具有最低优先级;
任何中断源都可以设置为非向量IRQ中断。它与向量IRQ中断的区别在于前者不能为每个非向量IRQ中断源设置服务程序地址,而是所有的非向量IRQ中断都共用一个相同的服务程序入口地址。当有多个中断源被设置为非向量IRQ中断时,需要在用户程序中识别中断源,并分别作出处理。所以非向量IRQ中断响应延时相对较长。
向量IRQ中断相关寄存器。 VICVectCntl0~15和VICVectAddr0~15两类寄存器与向量IRQ中断设置有关,前者为中断源分配向量IRQ中断的优先级,后者为该中断优先级设置服务程序入口地址。寄存器名称最后的数字同时也代表该寄存器控制的向量IRQ中断的优先级,数值越小优先级越高。注意:如果将同一个中断源分配给多个使能的向量IRQ中断,那么该中断源发生中断时,会使用最高优先级(最低编号)的寄存器设置。
在发生向量IRQ中断后,VIC能将对应中断的服务程序地址存入VICVectAddr寄存器中。如果为非向量中断,将把VICDefVectAddr寄存器的值存入该寄存器。在异常向量表的IRQ异常入口处放置一条指令,将VICVectAddr寄存器的内容装入程序计数器(PC),就可以跳转到当前中断的服务函数。 这样的设计可以减小中断响应延时。
文章评论(0条评论)
登录后参与讨论