中斷概述
我們知道,ARM核能處理的異常有7種,但僅僅區(qū)分異常的種類顯然不能夠滿足需求。拿手機來說,觸摸屏幕和按下音量鍵可能都是irq異常,但是ARM并不能將他們區(qū)分開,而事實的情況是針對這兩種中斷,我們的處理方式顯然不同,為此就需要在Soc中集成中斷控制器(Generic Interupt Controller),它的核心功能就是進行中斷的調(diào)度和管理。
SGI VS PPI VS SPI
exynos4412中每種中斷都有自己的ID用以標識,exynos4412支持三類中斷:Software Generated Interrupt (SGI),Private Peripheral Interrupt (PPI)和Shared Peripheral Interrupt (SPI)。所有的中斷可以按照優(yōu)先級可以劃分為0~255級,和大多數(shù)芯片一樣,數(shù)字越小,中斷的優(yōu)先級越高,同時發(fā)生的時候優(yōu)先級更高的中斷會被優(yōu)先處理,當然,Soc對每個中斷都有一個默認的優(yōu)先級。
SGI表示軟件生成中斷,即上圖中CPU和GIC通過一個寄存器進行交互,讓GIC給CPU(們)發(fā)送一個中斷(和ARM匯編中的swi不是一回事!)這個過程并沒有真正的外設來觸發(fā)中斷。SGI中斷具有邊沿觸發(fā)的屬性,在多核Soc中,一個CPU可以通過觸發(fā)SGI的方式和其他CPU交互。交互的形式有兩種:1-N,N-N。前者表示只有一個CPU響應這個SGI,此時需要提供機制來確定到底的哪個CPU接收并響應這個SGI。后者表示所有的CPU都將接收到SGI,當一個CPU收到這個SGI之后,這個SGI在這個CPU的pending狀態(tài)就被清除了,但是在其他CPU的pending狀態(tài)還會繼續(xù)維持。exynos4412支持最多16個SGI
PPI表示該中斷只會送給某一個CPU來處理,這是一個外設中斷,有邊沿觸發(fā)和平臺觸發(fā)兩種觸發(fā)方式。exynos4412支持最多8個PPI中斷
SPI和PPI一樣是外設中斷,不同的是這個中斷可以被GIC調(diào)度給任何CPU來處理。exynos4412支持最多128個SPI中斷
中斷的狀態(tài)
GIC負責維護每個中斷的狀態(tài)標志,exynos4412的中斷有四個狀態(tài):inactive,pending,active,active and pending。
Inactive即該中斷既不是pending狀態(tài)也不是active狀態(tài)。
Pending表示一個從中斷源傳送到GIC的外設中斷或者一個SIG中斷正在等待被GIC傳送到目標CPU.
Active表示一個中斷正在被CPU 響應。
Active and Pending表示CPU正在響應一個中斷,而GIC還用一個來自同一個中斷源的中斷在排隊.
編程模型
源碼
參考上面的中斷響應結(jié)構(gòu)圖,為了響應一個中斷,首先應該在外設層進行設置,諸如中斷觸發(fā)條件,中斷連接管腳等,然后需要在GIC層次進行設置,比如中斷的調(diào)度方法,最后在CPU層次進行設置,比如哪些中斷可以進入CPU,哪些不行。
編程使用的原理圖如下,程序的目的是按下一個按鍵,就有一個相應的LED閃爍一下。需要參考的資料有原理圖、exynos4412芯片手冊: