ARM11---中断---向量中断控制器(VIC)---结合s3c6410


  2527人阅读  评论(2)  收藏  举报
c signal interface 手机

今天看了看ARM1176手册关于中断的那部分,感觉挺有意思的。记下来!

 

(一)、首先说一下PL192向量中断控制器

          一个中断控制器是用来处理多个中断源的外围设备,通常包含以下几个特性:

          1.为每个中断源分配一个中断请求输入端口。为每个中断请求分配一个中断请求输出端口,以能连接到处理器的VIC端口。

             其实手册上说的这么多,我感觉其实就是这样的:要保证每个中断都能:

             ************************************************

             中断源-------->PL192 VIC--------->处理器VIC端口

             ************************************************

          2.可以用软件屏蔽掉任意制定的中断源的中断。

          3.可以为每个中断设置优先级。

 

          以上是中断控制器做的事情,但是我们的软件方还要做:

          1.确定请求服务的中断源。

          2.确定中断处理程序的地址。

 

       但是一个向量中断控制器可以在硬件上,把所有的上述功能都实现了,他可以提供当前最高优先级的中断的ISR的起始地址和向量地址。

       PL192 VIC和处理器VIC端口的连接:

    ARM11---中断---向量中断控制器(VIC)---结合s3c6410_第1张图片

 

 

     处理器可以通过VICVECTADDROUT[31:0]这个端口获取当前中断的ISR,不用向以前(比如ARM9)那样,采用0x00000018或者

     0xffff0018的策略了。但是处理器的VIC端口不支持读 FIQ 的向量地址。

     以下是引脚的解释:

     ARM11---中断---向量中断控制器(VIC)---结合s3c6410_第2张图片    

   

    IRQACK是由处理器发出的信号,用来告诉VIC:我想读取某某中断的中断处理程序的地址(IRQADDR)

    IRQADDRV是由VIC发出的信号,告诉处理器:ISR的地址已经发送,而且有效,你就放心的读吧!

    IRQACK和IRQADDRV在VIC和处理器之间实现了一个四次握手的机制。(后面有解释。)

 

(二)、中断处理函数的退出:

     往中断对应的向量地址寄存器里执行写操作。

(三)、处理器和VIC之间的时序:

     下面这个图是VIC端口操作时序的例子,情况是这样的:先有了一个 IRQC,后来了一个 IRQB,而且IRQB的优先级比较高。

 

 

 这个图表解释了基本的处理器和VIC之间基本的握手机制。

 1.IRQC中断请求发出,导致PL192 VIC设置处理器的nIRQ为低。

   2.处理器得知nIRQ为低,然后初始化一个中断序列。

   3.然后就在这关键的时候,突然来了一个中断IRQB,它告诉PL192 VIC,我比IRQC更急!!

   4.在B3和B4之间,处理器判断来的这个中断是不是IRQ,如果是则发送IRQACK 信号(高电平)。

   5.在B4,PL192 VIC得到IRQACK 高电平信号,然后把IRQADDR改成IRQB的ISR地址。

   6.在B6阶段,VIC发出IRQADDRV信号(置高),IRQADDRV在处理器得到正确的ISR地址之前,一直是高电平,在这期间,就算来个更高优先级的中断要置高!不然IRQB这次中断就

      丢失了。

   7.在B8阶段左右,处理器读取IRQADDR的值,正确读取后,就将IRQACK置低,因为他的使命已经完成了!

   8.当PL192 VIC发现IRQACK是低电平的时候,it stacks the priority of the IRQB interrupt(这句大家自己理解吧,应该是保存IRQ的优先级,具体什么用我还不清楚。)然后将

      IRQADDRV置低,如果没有更高优先级的中断,他也把nIRQ置高。

   9.当处理器得知IRQADDRV是低电平的时候,他就知道他又可以检测nIRQ了,所以如果VIC要停一段时间再将nIRQ置高的时候,必须保证IRQADDRV是高电平,不然,处理器就一直检测到

      有中断,其实是中断源发出的同一次中断。

 

    我们写中断程序需要注意的:

    **********************************************************************************************************************************************

    中断处理程序要保证在程序的最后进行中断的清除,这样可以保证多个中断源共享一个中断线。另外,中断处理程序要通知PL192 VIC当前的中断的ISR已经结束.

    原文是这样的:

    The clearing of the interrupt is handled in software by the interrupt handling routine,this enable multiple interrupt sources to share a

    signal interrupt priority,In addition,the interrupt handling routine must communicate to the VIC that the interrupt currently being handled

    is complete,using the memory-mapped or coprocessor-mapped interface,to enable the interrupt masking to be unwound.

    **********************************************************************************************************************************************

 

    PL192 VIC是不支持快速中断的,所以s3c6410中断流程图就这样画:

    ARM11---中断---向量中断控制器(VIC)---结合s3c6410_第3张图片

 

   所有的快速中断跑到VCI1,又通过VIC0,来到了TZIC0,最终都由TZIC0一个个的发送到ARM1176了。

   下面这个图是中断发出到被执行的流程图:

   

 

   这里涉及到ARM模式的转换。

   到了这里我们应该清楚中断的产生和中断处理程序的执行的流程了。

 

   注:VE是VIC ENABLE

         mrc p15,0,r0,c1,c0,0
         orr r0,r0,#(1<<24)
         mcr p15,0,r0,c1,c0,0

         这样我们的PL192 VIC就可以用了。

 

今天写到这里,太累了,以后再写写内部中断(watch dog)和外部中断( key )具体流程。都是基于OK6410,今天的算是补充下理论知识。

个人认为这些东西对中断的理解挺重要的!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ARM11---中断---向量中断控制器(VIC)---结合s3c6410)