今天看了看ARM1176手册关于中断的那部分,感觉挺有意思的。记下来!
(一)、首先说一下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,今天的算是补充下理论知识。
个人认为这些东西对中断的理解挺重要的!