arm中断向量表中,只有一个IRQ向量地址,占4字节(另外还有一个FIQ向量地址),可是arm支持多个外部中断源,一个中断发生后,arm如何根据这一个向量地址找到相应的中断服务程序?这里要区分中断是向量中断还是非向量中断。
一个中断源对应一个中断号,对于不同的外部中断源根据处理方式不同分为向量中断和非向量中断。
向量中断:当中断为向量中断时,arm直接跳转到预先提供的中断服务程序执行,这种处理方式响应速度快。
非向量中断:当中断为非向量中断时,无论是什么外部中断源发出的中断,arm将跳到指定的一段程序执行(称为中断解析程序),在解析程序里,通过判断相应的中断状态寄存器找到对应的中断源,跳转到相应的中断执行程序。有点类似软件中断的处理方式,但是软中断(SWI)与非向量中断不同,它的入口是0x0000,0008。进入软中断后,系统变为管理模式。而非向量中断入口是0x0000,0018。它引导系统进入fiq/irq模式。这种处理方式简单,但是要通过软件查询来判断具体的中断服务程序,所有延迟时间较长。
如何设置:
系统在初始化的时候需要进行中断初始化,设置中断源是向量中断还是非向量中断。设置方式举例如下:
VICIntSelect = 0x00000000; //所有中断都是IRQ
VICVectCntl0 = 0x20 | 15; //将15号中断EINT1设置为向量中断,并且使用优先级0
VICVectAddr0 = (uint32EINT1_Exception; //EINT1中断服务程序地址
VICDefVectAddr = (uint32Default_Entry; //其他的非向量中断默认的处理地址,其他非向量中断都会进入Default_Entry进行处理,在Default_Entry中获得具体的中断号再进行具体处理
VICIntEnable = 0x00018000; //使能EINT1和EINT2