新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM11---中斷---向量中斷控制器(VIC)---結(jié)合s3c6410

ARM11---中斷---向量中斷控制器(VIC)---結(jié)合s3c6410

作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
(一)、首先說一下PL192向量中斷控制器

一個(gè)中斷控制器是用來(lái)處理多個(gè)中斷源的外圍設(shè)備,通常包含以下幾個(gè)特性:

本文引用地址:http://m.butianyuan.cn/article/201611/317819.htm

1.為每個(gè)中斷源分配一個(gè)中斷請(qǐng)求輸入端口。為每個(gè)中斷請(qǐng)求分配一個(gè)中斷請(qǐng)求輸出端口,以能連接到處理器的VIC端口。

其實(shí)手冊(cè)上說的這么多,我感覺其實(shí)就是這樣的:要保證每個(gè)中斷都能:

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

中斷源-------->PL192 VIC--------->處理器VIC端口

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

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

3.可以為每個(gè)中斷設(shè)置優(yōu)先級(jí)。

以上是中斷控制器做的事情,但是我們的軟件方還要做:

1.確定請(qǐng)求服務(wù)的中斷源。

2.確定中斷處理程序的地址。

但是一個(gè)向量中斷控制器可以在硬件上,把所有的上述功能都實(shí)現(xiàn)了,他可以提供當(dāng)前最高優(yōu)先級(jí)的中斷的ISR的起始地址和向量地址。

PL192 VIC和處理器VIC端口的連接:

處理器可以通過VICVECTADDROUT[31:0]這個(gè)端口獲取當(dāng)前中斷的ISR,不用向以前(比如ARM9)那樣,采用0x00000018或者

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

以下是引腳的解釋:

IRQACK是由處理器發(fā)出的信號(hào),用來(lái)告訴VIC:我想讀取某某中斷的中斷處理程序的地址(IRQADDR)

IRQADDRV是由VIC發(fā)出的信號(hào),告訴處理器:ISR的地址已經(jīng)發(fā)送,而且有效,你就放心的讀吧!

IRQACK和IRQADDRV在VIC和處理器之間實(shí)現(xiàn)了一個(gè)四次握手的機(jī)制。(后面有解釋。)

(二)、中斷處理函數(shù)的退出:

往中斷對(duì)應(yīng)的向量地址寄存器里執(zhí)行寫操作。

(三)、處理器和VIC之間的時(shí)序:

下面這個(gè)圖是VIC端口操作時(shí)序的例子,情況是這樣的:先有了一個(gè) IRQC,后來(lái)了一個(gè) IRQB,而且IRQB的優(yōu)先級(jí)比較高。

 

 這個(gè)圖表解釋了基本的處理器和VIC之間基本的握手機(jī)制。

 1.IRQC中斷請(qǐng)求發(fā)出,導(dǎo)致PL192 VIC設(shè)置處理器的nIRQ為低。

2.處理器得知nIRQ為低,然后初始化一個(gè)中斷序列。

3.然后就在這關(guān)鍵的時(shí)候,突然來(lái)了一個(gè)中斷IRQB,它告訴PL192 VIC,我比IRQC更急!!

4.在B3和B4之間,處理器判斷來(lái)的這個(gè)中斷是不是IRQ,如果是則發(fā)送IRQACK 信號(hào)(高電平)。

5.在B4,PL192 VIC得到IRQACK 高電平信號(hào),然后把IRQADDR改成IRQB的ISR地址。

6.在B6階段,VIC發(fā)出IRQADDRV信號(hào)(置高),IRQADDRV在處理器得到正確的ISR地址之前,一直是高電平,在這期間,就算來(lái)個(gè)更高優(yōu)先級(jí)的中斷要置高!不然IRQB這次中斷就

丟失了。

7.在B8階段左右,處理器讀取IRQADDR的值,正確讀取后,就將IRQACK置低,因?yàn)樗氖姑呀?jīng)完成了!

8.當(dāng)PL192 VIC發(fā)現(xiàn)IRQACK是低電平的時(shí)候,it stacks the priority of the IRQB interrupt(這句大家自己理解吧,應(yīng)該是保存IRQ的優(yōu)先級(jí),具體什么用我還不清楚。)然后將

IRQADDRV置低,如果沒有更高優(yōu)先級(jí)的中斷,他也把nIRQ置高。

9.當(dāng)處理器得知IRQADDRV是低電平的時(shí)候,他就知道他又可以檢測(cè)nIRQ了,所以如果VIC要停一段時(shí)間再將nIRQ置高的時(shí)候,必須保證IRQADDRV是高電平,不然,處理器就一直檢測(cè)到

有中斷,其實(shí)是中斷源發(fā)出的同一次中斷。

我們寫中斷程序需要注意的:

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

中斷處理程序要保證在程序的最后進(jìn)行中斷的清除,這樣可以保證多個(gè)中斷源共享一個(gè)中斷線。另外,中斷處理程序要通知PL192 VIC當(dāng)前的中斷的ISR已經(jīng)結(jié)束.

原文是這樣的:

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,來(lái)到了TZIC0,最終都由TZIC0一個(gè)個(gè)的發(fā)送到ARM1176了。

下面這個(gè)圖是中斷發(fā)出到被執(zhí)行的流程圖:

這里涉及到ARM模式的轉(zhuǎn)換。

到了這里我們應(yīng)該清楚中斷的產(chǎn)生和中斷處理程序的執(zhí)行的流程了。

注:VE是VIC ENABLE

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

這樣我們的PL192 VIC就可以用了。

今天寫到這里,太累了,以后再寫寫內(nèi)部中斷(watch dog)和外部中斷( key )具體流程。都是基于OK6410,今天的算是補(bǔ)充下理論知識(shí)。

個(gè)人認(rèn)為這些東西對(duì)中斷的理解挺重要的!



評(píng)論


技術(shù)專區(qū)

關(guān)閉