新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM11---中斷---向量中斷控制器(VIC)---結合s3c6410

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

        作者: 時間:2016-11-09 來源:網絡 收藏
        (一)、首先說一下PL192向量中斷控制器

        一個中斷控制器是用來處理多個中斷源的外圍設備,通常包含以下幾個特性:

        本文引用地址:http://www.104case.com/article/201611/317819.htm

        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,今天的算是補充下理論知識。

        個人認為這些東西對中斷的理解挺重要的!



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 昭苏县| 金塔县| 奇台县| 汪清县| 凤山县| 辽宁省| 积石山| 金乡县| 阿克陶县| 调兵山市| 泰安市| 仙游县| 山东省| 西昌市| 孝感市| 深圳市| 镇安县| 双峰县| 孟津县| 肇东市| 河西区| 凤翔县| 中牟县| 屏边| 平果县| 邵武市| 通海县| 中阳县| 鹤壁市| 合水县| 农安县| 隆回县| 合作市| 达拉特旗| 乐至县| 福海县| 和林格尔县| 长宁县| 万山特区| 曲水县| 北海市|