ARM-Linux s3c2440 之中斷分析(一)
S3C2440 是arm920T架構(gòu),先溫習(xí)一下s3c2440中的中斷控制器原理和相關(guān)硬件構(gòu)架。
本文引用地址:http://www.ex-cimer.com/article/201611/318128.htm中斷控制器(InterruptControler):
S3c2440A的中斷控制器有60個(gè)中斷源,如DMA中斷,UART中斷,IIC中斷等,60個(gè)中斷源在寄存器中用相應(yīng)的位來表示。當(dāng)有多個(gè)中斷要求到來時(shí),經(jīng)過仲裁過程后,中斷控制器向CPU請(qǐng)求FIQ或者IRQ中斷。仲裁過程根據(jù)硬件中的優(yōu)先級(jí)模塊來決定,其結(jié)果最后寫進(jìn)中斷未決(intterrupt pending)寄存器中,通過中斷未決寄存器的值可以清楚哪個(gè)中斷發(fā)生了。
S3c2440中斷控制器流程圖:
掛起
中斷模式(InterruptMode):
ARM920T(CPU)中有兩類中斷模式: FIQ中斷和 IRQ中斷,前者俗稱快中斷,后者稱為普通中斷。 所有中斷源均可以指定采取何種中斷模式。程序狀態(tài)寄存器(PSR)有F和I標(biāo)志位,當(dāng)F 位 置 1 時(shí),CPU不接受FIQ中斷,同樣,I位置1 時(shí)CPU不接受 IRQ中斷。所以中斷控制器需清零F位和I位,且將中斷屏蔽寄存器(INTMSK)清零后,方可接收中斷。
中斷未決寄存器(InterruptPending Register)
S3C2440A有兩個(gè)中斷未決寄存器:中斷源未決寄存器(SRCPND) 和中斷未決寄存器(INTPND)。這兩個(gè)寄存器指明了是否有中斷未決(產(chǎn)生)。當(dāng)中斷源(一個(gè)或者多個(gè)同時(shí)發(fā)生)要求進(jìn)行中斷服務(wù)程序時(shí),SRCPND寄存器中相應(yīng)的位置 1, 同時(shí)自動(dòng)地,在INTPND寄存器中只有 1 位被置1(因?yàn)閺纳蠄D中可以看出INTPND是經(jīng)過仲裁過程之后的,所以根據(jù)優(yōu)先級(jí)決定最高優(yōu)先級(jí)的中斷被置1)。 如果INTMSK中相應(yīng)的中斷置 1,那么,SRCPND中相應(yīng)位將被置1,而INTPND不會(huì)有變化。當(dāng)INTPND置位時(shí),無論何時(shí),只要I 或標(biāo)志位為0,那么即可執(zhí)行中斷服務(wù)程序。SRCPND 和 INTPND 寄存器可讀可寫,所以中斷服務(wù)程序執(zhí)行完后應(yīng)當(dāng)先寫相應(yīng)位的 1到SRCPND寄存器,然后寫相應(yīng)位的 1 到INTPND寄存器完成清零,以便CPU能響應(yīng)下一次中斷的發(fā)生。
中斷屏蔽寄存器(InterruptMask Register)
中斷屏蔽寄存器INTMSK用來指示中斷是否并禁止(屏蔽)。如果相應(yīng)位置1 標(biāo)明該中斷源被屏蔽,置0 則中斷可以正常服務(wù)。如果某一中斷MASK 為 1且中斷發(fā)生,SRCPND中相應(yīng)位會(huì)置1.
中斷優(yōu)先級(jí)模塊(InterruptPrioprity Generating Block)
該模塊可以服務(wù)32個(gè)中斷要求,共由兩級(jí)仲裁單元組成。第一級(jí)有6個(gè)arbiter0 ~ 5,第二級(jí)為arbiter 6, 每個(gè)arbiter里的中斷的優(yōu)先級(jí)采取輪換機(jī)制改變優(yōu)先級(jí)。
每個(gè)仲裁arbiter處理6個(gè)中斷要求,規(guī)則由優(yōu)先寄存器(PRIORTY)中相應(yīng)的ARB_MODE (1位)和ARB_SEL(2位)來決定。仲裁arbiter中REQ0總是最高優(yōu)先級(jí)的,而REQ5總是最低的。所以只能在REQ1~REQ4中設(shè)定優(yōu)先級(jí):
ARB_SEL位為00b時(shí),優(yōu)先級(jí):REQ0,REQ1,REQ2,REQ3,REQ4,REQ5
ARB_SEL位為01b時(shí),優(yōu)先級(jí):REQ0,REQ2,REQ3,REQ4,REQ1,REQ5
ARB_SEL位為10b時(shí),優(yōu)先級(jí):REQ0,REQ3,REQ4,REQ1,REQ2,REQ5
ARB_SEL位為11b時(shí),優(yōu)先級(jí):REQ0,REQ4,REQ1,REQ2,REQ3,REQ3
所謂優(yōu)先級(jí)采用輪換機(jī)制,舉例說是,例如REQ1發(fā)生時(shí),這時(shí)ARB_SEL自動(dòng)變成01b,所以,之后的優(yōu)先級(jí)將為:REQ0,REQ2,REQ3,REQ3,REQ1,REQ5,可見,當(dāng)某一中斷發(fā)生后(REQ1~REQ4),它的優(yōu)先級(jí)將放到最低(在REQ5前),不斷輪回,同理REQ2發(fā)生時(shí),ARB_SEL自動(dòng)變成10b,之后的優(yōu)先級(jí)將為:REQ0,REQ3,REQ4,REQ1,REQ2,REQ5。但REQ0,或者REQ5發(fā)生時(shí),ARB_SEL將維持不變。
以上是在相應(yīng)地ARB_MODE為1的時(shí)候。當(dāng)ARB_MODE被置0的時(shí)候,將按照默認(rèn)的模式也就是上圖中所示。
關(guān)于外部中斷:
s3c2440有24個(gè)GPIO輸入觸外部中斷,可分為低電平觸發(fā),高電平觸發(fā),下降沿觸發(fā),上升沿觸發(fā),或者下降,上升時(shí)觸發(fā)模式。
通過以上,s3c2440的中斷控制器原理,硬件構(gòu)架分析完了。后面再來分析,ARM-Linux s3c2440之中斷分析的軟件實(shí)現(xiàn)原理。
評(píng)論