ARM中斷處理之GIC

2021-10-07 14:41:41 字數 4120 閱讀 8229

收藏一篇gic的文章 gic中斷.

本章的主要內容如下:

ø 中斷處理(interrupthandling)主要描述

n gic如何識別中斷

n 軟體如何通過程式設計gic來配置和控制中斷

n gic處理任意cpu inte***ce中斷的狀態機

n cpu的異常模式下如何與gic互動

ø 優先化(prioritization)

n 配置和控制每個中斷的優先順序

n 掛起中斷的執行順序

n 中斷是否對目標cpu可見的決定因素:

u 中斷優先順序遮蔽

u 優先順序分組

u 搶占當前activeinterrupt

3.1.1 多處理器(mp)系統中處理不同型別的中斷

gic支援外設中斷(硬體中斷)pi和sgi中斷。在mp系統中的處理方式不同:sgi使用n-n模型,pi使用1-n模型。

3.1.2 識別gic支援的中斷

軟體獲取支援的中斷資訊:

ø 讀gicd_typern。gicd_typer中的itlinesnumber決定gicd_isenablern的數目,因此決定了gic支援的最大spi的數目。所以,gic支援的中斷總數(itlinesnumber+1)。

ø 寫0到gicd_ctlr禁止gicdistributor將中斷傳遞給cpu inte***ce。

ø 對於gicd_isenablern,從gicd_isenable0開始。

n 寫0xffffffff到gicd_isenablern

n 然後讀gicd_isenablern,相應位為1代表支援該中斷id。

類似的軟體也可以通過讀取gicd_icenablen來獲取相應中斷資訊。

ø 對於gicd_icenablern,從gicd_isenable0開始。

n 寫0xffffffff到gicd_icenablern,禁用所有中斷。

n 然後讀gicd_isenablern,相應位為1表示中斷被永久使能了。

n 寫1到gicd_isenablern,則相應位重新被使能。

3.2 通用中斷處理

當gic接收乙個中斷,將其狀態置為pending。重新產生掛起中斷不影響該中斷狀態。中斷處理的順序:

gic決定該中斷是否被使能,若沒有被使能對gic沒有影響。

對於每個pending中斷,gic決定目標處理器。

對於每個處理器,distributor根據他擁有的每個中斷優先順序資訊決定最高優先順序的掛起中斷,將該中斷傳遞給目標cpu inte***ce。

gic distributor將乙個中斷傳遞給cpuinte***ce後,該cpu inte***ce決定該中斷是否有足夠的優先順序將中斷請求傳送給cpu。

當cpu開始處理該異常中斷,它讀取gicc_iar應答該中斷。讀取的gicc_iar獲取到中斷id,對於sgi,還有源處理器id。中斷id被用來查詢正確的中斷處理函式。gic識別讀過程後,將改變該中斷的狀態:

a) 如果該中斷在pending狀態時,產生了另一次中斷,中斷狀態將從pending轉化為pending &active。

b) 否則,中斷狀態將從pending變為active。

6. 當處理器完成中斷處理後,它需要通知gic處理已經完成。這個過程稱為priority drop and interrupt deactivation:

a) 需要寫eoir(end of interrupt register)

b) 接著需要寫gicc_dir(deactivate interrupt register)

3.2.1 priority drop and interruptdeactivation

priority drop是降低當前中斷優先順序(runningpriority),這個動作發生在寫eoir後,即寫gicc_eoir或gicc_aeoir。

interruptdeactivation是改變中斷狀態:

從active & pending變為pending;

從active變為idle。

在gic v2.0實現中,gicc_ctlr.eoimode為1表示這兩個操作被分開執行。

3.2.2 gic的中斷控制

3.2.2.1 中斷使能

對於乙個外設中斷(pi),乙個處理器可以通過如下兩種方法:

ø 寫1到gicd_isenablern的相應位使能乙個中斷

ø 寫1到gicd_icenablern的相應位禁用乙個中斷

對於乙個sgi中斷,是否永久使能或可以被上述的兩個暫存器控制,這是有晶元實現決定的。

3.2.2.2 設定和清除中斷掛起狀態

對於外設中斷,處理器可以通過如下方式控制:

ø 寫gicd_ispendrn設定中斷pending狀態;

ø 寫gicd_icpendrn清除中斷pending狀態。

對於乙個電平觸發的中斷:

ø 當硬體中斷發出中斷訊號,且處理器已經gicd_icpendrn相應位,這個時候寫gicd_icpendrn對該中斷的掛起狀態不會產生任何影響。

ø 如果處理器對gicd_ispendrn的相應位寫1,不管當前硬體的中斷訊號是否已經發出,都不會影響該中斷的變化pending狀態。

3.2.2.3 找到啟用或掛起狀態的中斷

處理可以通過如下方法:

ø 讀gicd_ispendrn或gicd_icpendrn的相應位找到掛起狀態的中斷;

ø 讀gicd_isactivern或gicd_icactivern的相應位找到啟用狀態的中斷。

當中斷為掛起或者啟用時,gicd_ispendrn或gicd_isactivern相應位為1;如果中斷處於active& pending狀態,那麼這兩個暫存器的相應位都為1.

3.2.2.4 產生sgi

處理器可以通過寫gicd_sgir來產生乙個sgi。乙個sgi可以傳遞給多個cpu,在gicd_sgir暫存器中的cputargetlist就可以指定目標處理器。

sgi可以是來自不同的處理器但使用了同一中斷id,因此,任意目標cpu可以接收來自不同cpu的使用同乙個中斷號的sgi。因此兩個sgi只要有如下一項不同就是不同的:中斷id、源處理器和目標處理器。

當產生sgi,目標處理器讀gic的gicc_iar返回中斷號id和源處理器。中斷號id和源處理器id才能唯一的標識目標處理器。

3.2.5 特殊中斷號

gic保留中斷號1020~1023,其中1023是偽中斷號(spuriousinterrupt)。

3.3 中斷優先化

3.3.1 preemption

在乙個active中斷被處理完之前,cpuinte***ce 支援通知更高優先順序的中斷到目標處理器。這種情況必要條件如下:

ø 該中斷的優先順序高於當前cpuinte***ce被遮蔽優先順序;

ø 該中斷的組優先順序高於正在當前cpu inte***ce處理的中斷優先順序

preemption(搶占)發生在處理器應答這個新的中斷時,開始為執行新中斷的相應服務程式。原來的中斷就被搶占,這種情況也稱為中斷巢狀。

3.3.2 priority masking(優先順序遮蔽)

gicc_pmr定義了目標處理器的優先順序閾值。gic僅上報那些優先順序高於這個閾值的pending中斷。初始值為0,遮蔽所有的中斷。

3.3.2 優先順序分組(priority grouping)

優先順序分組是將gicc_bpr(binary pointregister)分為兩個域,組優先順序(group priority)和組內優先順序(subpriority)。當決定搶占(preemption)的時候,組優先順序相同的中斷被視為一樣的,不考慮組內優先順序。那就意味著在每個優先順序組內只能有乙個中斷被啟用。組優先順序又被稱為搶占級別(preemption level)。

gic使用組優先順序決定掛起中斷是否有足夠的優先順序搶占當前active中斷,原則如下:

ø 如果發生搶占,該掛起中斷的組優先順序一定比當前active中斷的組優先順序高,也就是說,掛起中斷的組優先順序域的值小於active中斷的組優先順序域的值。

ø 如果當前cpuinte***ce上沒有active中斷,最高優先順序的掛起中斷將被傳遞給處理器,而不考慮組優先順序。

8 6 ARM介面程式設計 中斷GIC

管理這些中斷源,中斷擴充套件 管理中斷的優先順序 管理中斷源,報告中斷id 管理中斷的響應,遮蔽某些中斷 記錄中斷,中斷掛起 外部中斷 k2 gpx1 1 按下 0 彈起 1 gic中斷源表 中斷源 與 中斷id 和gic管腳 一一對應 1 配置gpio gpx1 1 k2 gpx1con 7 4 ...

linux arm中斷系統之GIC

gic為中斷控制器,不要和arm core的中斷搞混了,這些中斷都是連線到arm core的irq或者fiq上的。和 可以先不用考慮,用於安全模式。gic可以用於單核多核系統,這時候要拋開微控制器的簡單中斷了,從圖上看有sgi software generated interrupt ppi pri...

ARM中斷處理流程

1 arm採用的是3級流水線 arm的流水線結構為 取指 解碼 執行 arm pc pc 4 pc 8pc是指向被取指的指令,而不是正在執行的指令。也就是說在此 pc值為0x1008 執行的是0x1000的 即 書上摘錄 由於arm 體系結構採用了多級流水線技術,對於arm 指令集而言,pc 總是指...