ARM-Linux s3c2440 之中斷分析(一)
====本文系本站原創,歡迎轉載! 轉載請註明出處:http://blog.csdn.net/yyplc===
硬體篇:
S3C2440 是arm920T架構,先溫習一下s3c2440中的中斷控制器原理和相關硬體構架。
中斷控制器(InterruptControler):
S3c2440A的中斷控制器有60箇中斷源,如DMA中斷,UART中斷,IIC中斷等,60箇中斷源在暫存器中用相應的位來表示。當有多箇中斷要求到來時,經過仲裁過程後,中斷控制器向CPU請求FIQ或者IRQ中斷。仲裁過程根據硬體中的優先順序模組來決定,其結果最後寫進中斷未決(intterrupt pending)暫存器中,通過中斷未決暫存器的值可以清楚哪個中斷髮生了。
S3c2440中斷控制器流程圖:
掛起
中斷模式(InterruptMode):
ARM920T(CPU)中有兩類中斷模式: FIQ中斷和 IRQ中斷,前者俗稱快中斷,後者稱為普通中斷。 所有中斷源均可以指定採取何種中斷模式。程式狀態暫存器(PSR)有F和I標誌位,當F 位 置 1 時,CPU不接受FIQ中斷,同樣,I位置1 時CPU不接受 IRQ中斷。所以中斷控制器需清零F位和I位,且將中斷遮蔽暫存器(INTMSK)清零後,方可接收中斷。
中斷未決暫存器(InterruptPending Register)
S3C2440A有兩個中斷未決暫存器:中斷源未決暫存器(SRCPND) 和中斷未決暫存器(INTPND)。這兩個暫存器指明瞭是否有中斷未決(產生)。當中斷源(一個或者多個同時發生)要求進行中斷服務程式時,SRCPND暫存器中相應的位置 1, 同時自動地,在INTPND暫存器中只有 1 位被置1(因為從上圖中可以看出INTPND是經過仲裁過程之後的,所以根據優先順序決定最高優先順序的中斷被置1)。 如果INTMSK中相應的中斷置 1,那麼,SRCPND中相應位將被置1,而INTPND不會有變化。當INTPND置位時,無論何時,只要I 或標誌位為0,那麼即可執行中斷服務程式。SRCPND 和 INTPND 暫存器可讀可寫,所以中斷服務程式執行完後應當先寫相應位的 1到SRCPND暫存器,然後寫相應位的 1 到INTPND暫存器完成清零,以便CPU能響應下一次中斷的發生。
中斷遮蔽暫存器(InterruptMask Register)
中斷遮蔽暫存器INTMSK用來指示中斷是否並禁止(遮蔽)。如果相應位置1 標明該中斷源被遮蔽,置0 則中斷可以正常服務。如果某一中斷MASK 為 1且中斷髮生,SRCPND中相應位會置1.
中斷優先順序模組(InterruptPrioprity Generating Block)
該模組可以服務32箇中斷要求,共由兩級仲裁單元組成。第一級有6個arbiter0 ~ 5,第二級為arbiter 6, 每個arbiter裡的中斷的優先順序採取輪換機制改變優先順序。
每個仲裁arbiter處理6箇中斷要求,規則由優先暫存器(PRIORTY)中相應的ARB_MODE (1位)和ARB_SEL(2位)來決定。仲裁arbiter中REQ0總是最高優先順序的,而REQ5總是最低的。所以只能在REQ1~REQ4中設定優先順序:
ARB_SEL位為00b時,優先順序:REQ0,REQ1,REQ2,REQ3,REQ4,REQ5
ARB_SEL位為01b時,優先順序:REQ0,REQ2,REQ3,REQ4,REQ1,REQ5
ARB_SEL位為10b時,優先順序:REQ0,REQ3,REQ4,REQ1,REQ2,REQ5
ARB_SEL位為11b時,優先順序:REQ0,REQ4,REQ1,REQ2,REQ3,REQ3
所謂優先順序採用輪換機制,舉例說是,例如REQ1發生時,這時ARB_SEL自動變成01b,所以,之後的優先順序將為:REQ0,REQ2,REQ3,REQ3,REQ1,REQ5,可見,當某一中斷髮生後(REQ1~REQ4),它的優先順序將放到最低(在REQ5前),不斷輪迴,同理REQ2發生時,ARB_SEL自動變成10b,之後的優先順序將為:REQ0,REQ3,REQ4,REQ1,REQ2,REQ5。但REQ0,或者REQ5發生時,ARB_SEL將維持不變。
以上是在相應地ARB_MODE為1的時候。當ARB_MODE被置0的時候,將按照預設的模式也就是上圖中所示。
關於外部中斷:
s3c2440有24個GPIO輸入觸外部中斷,可分為低電平觸發,高電平觸發,下降沿觸發,上升沿觸發,或者下降,上升時觸發模式。
通過以上,s3c2440的中斷控制器原理,硬體構架分析完了。後面再來分析,ARM-Linux s3c2440之中斷分析的軟體實現原理。
相關文章
- React技巧之中斷map迴圈React
- 如何判斷一個元素是否位於另一個元素之中
- 交叉編譯場景分析(arm-linux)--序編譯Linux
- STM32學習筆記之中斷筆記
- ARM學習之中斷體系結構
- 【原創】Linux虛擬化KVM-Qemu分析(六)之中斷虛擬化Linux
- ThinkPHP6 原始碼分析之中介軟體分析PHP原始碼
- Linux裝置驅動之中斷與定時器Linux定時器
- 多執行緒-執行緒控制之中斷執行緒執行緒
- 深入淺出:Linux裝置驅動之中斷與定時器Linux定時器
- 分析亞洲手機遊戲市場現狀之中國篇(2)遊戲
- 交叉編譯場景分析(arm-linux)(四)--編譯readline和ncurses編譯Linux
- Arm-Linux子系統的互相NotifyLinux
- 玩轉 PHP 網路程式設計全套之中斷系統程式設計PHP程式設計
- 蛻變成蝶:Linux裝置驅動之中斷與定時器Linux定時器
- 一次DG故障診斷過程分析
- S3C2440 LCD控制器的設定S3
- MySQL斷電恢復的一點簡單分析MySql
- 一覺醒來,我掉入計算機之中了···計算機
- 分析:全面診斷FACEBOOK
- linux下的一個診斷分析工具lsof(轉)Linux
- 【原創】Linux中斷子系統(一)-中斷控制器及驅動分析Linux
- awr診斷分析之二
- 設計模式之中介者設計模式
- Oracle全文檢索之中文Oracle
- Java之中的Vector的用法Java
- Linux中斷機制分析Linux
- 設計模式之中介者模式設計模式
- 把 Go 放到 Nginx C module 之中GoNginx
- JAVA設計模式之中介模式Java設計模式
- Django框架之中介軟體引入Django框架
- Django框架之中介軟體思想Django框架
- linux分析、診斷及調優的必備“殺器”之一Linux
- Steam:《我們之中》是目前最受歡迎的多人遊戲之一遊戲
- 網站SEO診斷分析要點網站
- Linux 中斷處理原理分析Linux
- 詳細分析Java中斷機制Java
- CRS-1606 診斷分析