转-向量中断与非向量中断

向量中断与非向量中断的区别
     向量中断就是不同的中断有不同的入口地址,非向量中断就只有一个入口地址,进去了再判断中断标志来识别具体是哪个中断。向量中断实时性好,非向量中断简单
     向量中断控制器VIC具有32个中断请求输入,可将其编程分为3类,FIQ,向量IRQ和非向量IRQ。
     FIQ(fast interrpt request)快速中断请求要求具有最高优先级。如果分配给FIQ的请求多于一个,VIC将中断请求相或后向ARM处理器产生FIQ信号。当只有一个中断被分配为FIQ时可实现最短的FIQ等待,但如果分配给IFIQ级的中断多于1个,FIQ服务程序需要读取FIQ状态寄存器来识别产生中断请求的FIQ中断源!向量IRQ具有中等优先级。该级别可分别32个请求中断的16个。32个请求种的任意一个都可分配到16个向量IRQ slot中的任意一个,其中slot0具有最高优先级非向量IRQ的优先级最低

向量中断 非向量中断 
     向量者,矢量也,即指方向,门路。
     向量中断------由硬件提供中断服务程序入口地址;
     非向量中断------由软件件提供中断服务程序入口地址;
 
     向量中断模式用于RESET、NMI、异常处理。当向量中断产生时,控制器直接将PC赋值,如跳到0x0000000d处,而在0x0000000d地址处通常放置ISR服务程序地址LDR PC, =ISR_HANDLER。
     非向量中断模式,有一个寄存器标识位,跳转到统一的函数地址,此函数通过判别寄存器标识位和优先级关系进行中断处理。向量中断模式是当CPU读取位于0x18处的IRQ中断指令的时候,系统自动读取对应于该中断源确定地址上的指令取代0x18处的指令,通过跳转指令系统就直接跳转到对应地址函数中,节省了中断处理时间提高了中断处理速度。例如 ADC 中断的向量地址为0xC0,则在0xC0处放如下代码:ldr PC,=HandlerADC 当ADC中断产生的时候系统会自动跳转到HandlerADC函数中处理中断。 
      非向量中断模式处理方式是一种传统的中断处理方法,当系统产生中断的时候,系统将INTPND寄存器中对应标志位置位,然后跳转到位于0x18处的统一中断函数中;该函数通过读取INTPND寄存器中对应标志位来判断中断源,并根据优先级关系再跳到对应中断源的处理代码中处理中断。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shi_869160/archive/2010/09/16/5888321.aspx

 

 

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 =(uint32)EINT1_Exception;    //EINT1中断服务程序地址
    VICDefVectAddr =(uint32)Default_Entry;    //其他的非向量中断默认的处理地址,其他非向量中断都会进入Default_Entry进行处理,在Default_Entry中获得具体的中断号再进行具体处理
    VICIntEnable = 0x00018000;    //使能EINT1和EINT2
    由于在管理向量中断的VICVectCntl0~15和VICVectAddr0~15中只设置了EINT1,故EINT2中断发生时,要进入非向量中断处理程序Default_Entry。

系统处理过程

arm接收到中断信号后,IRQ系统根据预先设置的寄存器的值判别是向量中断还是非向量中断,如果是向量中断,则把对应的VICVectAddrN中的地址复制到VICVectAddr,如果是非向量中断,则把VICDefVectAddr 中的值复制到VICVectAddr,接着PC指针跳转到向量表中的IRQ向量地址0x18处,此处放置了一个跳转指令,跳到VICVectAddr中的地址处进行处理。中断返回时,必须将VICVectAddr赋值为0;

 

FIQ没有向量和非向量之分,所以如果系统只有一个FIQ,则这个中断处理速度会很快,如果有多个FIQ则需要象IRQ的非向量中断一样,在处理程序中查询FIQ的状态寄存器。

本文出处为找到。

posted @ 2013-03-07 09:58  SuperTramp  阅读(616)  评论(0)    收藏  举报