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