(一)、首先说一下PL192向量中止控制器
一个中止控制器是用来处理多个中止源的外围设备,一般包括以下几个特性:
1.为每个中止源分配一个中止恳求输入端口。为每个中止恳求分配一个中止恳求输出端口,以能衔接到处理器的VIC端口。
其实手册上说的这么多,我感觉其实便是这样的:要确保每个中止都能:
************************************************
中止源——–>PL192 VIC———>处理器VIC端口
************************************************
2.能够用软件屏蔽掉恣意拟定的中止源的中止。
3.可认为每个中止设置优先级。
以上是中止控制器做的工作,可是咱们的软件方还要做:
1.确认恳求服务的中止源。
2.确认中止处理程序的地址。
可是一个向量中止控制器能够在硬件上,把一切的上述功用都完成了,他能够供给当时最高优先级的中止的ISR的开始地址和向量地址。
处理器能够经过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 V%&&&&&%就能够用了。
今日写到这儿,太累了,今后再写写内部中止(watch dog)和外部中止( key )详细流程。都是根据OK6410,今日的算是弥补下理论知识。
个人认为这些东西对中止的了解挺重要的!