×
嵌入式 > 嵌入式开发 > 详情

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

发布时间:2020-08-18 发布时间:
|
(一)、首先说一下PL192向量中断控制器

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

以下是引脚的解释:

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中断流程图就这样画:

所有的快速中断跑到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,今天的算是补充下理论知识。

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



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
MSP430单片机硬件知识-复位