Windows CE 中斷管理

2021-05-05 16:29:44 字數 3287 閱讀 7827

windows ce 中斷管理

作業系統對外設的請求都是通過中斷來處理的。大多數情況,作業系統都不主動去檢視外圍裝置的請求,只有當中斷發生的情況下,作業系統才會通過中斷來向外圍裝置提供服務。首先需要解釋幾個概念:

irq(interrupt request):

物理中斷請求,這是外部裝置通過

cpu的中斷引腳向

cpu傳送的中斷訊號。

sysintr:

邏輯中斷,這是作業系統或者驅動程式直接呼叫的中斷號,它是通過

oal把物理中斷訊號對映成為了

oem定義的邏輯中斷號。

isr(interrupt service routine):

中斷服務例程,處於核心模式,

isr的主要職責就是判斷輸入的物理中斷號,轉化為相應的邏輯中斷號。

ist(interrupt service thread):

中斷服務執行緒,處於使用者模式,

ist是真正的中斷處理程式,處理相關的中斷請求就是在

ist中實現的。

windows ce

的中斷處理模型如下圖所示。簡單來說,外圍裝置向核心發出了乙個物理中斷,

isr捕捉到這個物理中斷,並且轉化為相應的邏輯中斷,將邏輯事件與乙個事件關聯,

ist通過事件響應,進入中斷處理程式,一次中斷結束。

一.中斷處理過程

當乙個中斷發生時,處理器將控制核心中的乙個異常操作,然後呼叫

isr註冊到當前的中斷。

isr負責把當前的物理中斷轉化為乙個邏輯中斷,同時給核心返回乙個邏輯中斷號。核心將設定乙個事件與該邏輯中斷相關聯。

ist將等到這個事件,直到該事件觸發,

ist處理中斷請求。

下圖是乙個中斷處理內部結構圖:

上圖的整個流程為:

(1).

如果核心的捕捉異常**接收到乙個硬體中斷,那麼核心接著就會識別乙個異常,並且提交相應的硬體中斷。

(2).

核心的中斷管理器通知

isr禁用當前中斷,直到中斷處理完成,才能再重新啟動當前中斷。這個階段過程中,允許中斷巢狀,也就是允許高優先順序的中斷觸發。

(3).

異常管理器呼叫

isr來響應這個中斷。

(4).

核心接收到

isr的返回值後,依據該返回值來決定如何處理中斷。

(5).

核心觸發中斷支援處理器來喚醒

ist並啟用該執行緒。

(6). ist

響應相應的中斷,如果有需要,

ist呼叫個中

i/o函式來訪問響應的硬體來完成操作。

(7).

當ist

完成中斷處理工作後,呼叫

interruptdone()

函式來通知核心。

(8).

核心呼叫

oal中的函式

oeminterruptdone()

函式來宣告所有中斷處理工作已經完成。

oal通知硬體重新開啟該中斷。至此,一次中斷處理結束。 二.

中斷服務例程

isrisr

是執行在核心當中的一段**,通常通過

oem實現。

isr主要是用於相應物理中斷,並決定如何處理該中斷。如果中斷需要被核心和

ist進一步處理,那麼

isr會返回乙個邏輯中斷號

sysintr_***

;如果該中斷不需要被進一步的處理,那麼

isr只需要返回

sysintr_nop

給核心。乙個

isr程式必須非常的高效,從而避免對硬體中斷相應的延遲。如果乙個

isr響應太慢,從使用者來看,就會認為這個裝置宕機了。

從上面看來,我們也可以在

isr中直接完成對中斷的請求,並且完成相應的操作。但是這不是很好的辦法,我們應該讓

ist來完成大多數的工作。

下面以乙個

smdk2410

的例子,該函式位於

%winceroot% /platform/common/src/arm/samsung/s3c2410x/intr

下,在smdk2410

種,oeminterrupthandler()

函式充當了

isr的角色:

ulong oeminterrupthandler(ulong ra)

else

//清空中斷暫存器

outreg32(&g_pintrregs->srcpnd, mask);

outreg32(&g_pintrregs->intpnd, mask);

//可掛載

isrsysintr = nkcallintchain((uchar)irq);

if (sysintr == sysintr_chain || !nkissysintrvalid(sysintr))

// unmask interrupts in case it's nop or invalid

if (sysintr_nop == sysintr) else }}

//返回邏輯中斷號

return sysintr;}三.

中斷服務執行緒

istist

其實就是乙個普通的使用者態執行緒,它負責處理相應中斷的大多數操作。前面的內容中,我們提到過

ist執行緒是在等待到相應事件才會進行處理的,所以在大多數情況下,

ist都是空閒的。實現

ist的常見函式如下:

interruputinitialize():

該函式負責把某個邏輯中斷與乙個

event

核心物件關聯起來。

waitforsingleobject():

該函式阻塞當前程序,等待某個

event

核心物件事件發生。

interruptdone()

:該函式用來告訴作業系統,對該中斷已經處理完成,作業系統可以重新開啟該中斷。 實現

ist必須的步驟:

(1).

建立乙個結構體用來儲存中斷處理的相關資料。

(2).

當ist

觸發時使用

createevent()

函式。

(3).

通過登錄檔讀取物理中斷號和邏輯中斷號,在驅動載入前允許

oal把物理中斷號對映成邏輯中斷號。

(4).

儲存建立執行緒控制代碼。

具體例子就不在這裡列舉出來了。

參考書籍:

windows ce

嵌入式作業系統。

windows ce

裝置驅動及

bsp開發指南。

在Windows CE增加自定義中斷處理

isq interrupt id 邏輯中斷號 event物件。當中斷發生時,isr 中斷服務例程 返回該中斷號對應的邏輯中斷號,然後盡可能快地返回 隨後ce就set該邏輯中斷號對應的event物件 如果有的話 以喚醒在該event等待的ist 中斷服務執行緒 大部分工作都是由ist來完成。一般來說i...

在Windows CE增加自定義中斷處理

在windows ce增加自定義中斷處理 isq interrupt id 邏輯中斷號 event 物件。當中斷發生時,isr 中斷服務例程 返回該中斷號對應的邏輯中斷號,然後盡可能快地返回 隨後ce就 set該邏輯中斷號對應的 event 物件 如果有的話 以喚醒在該 event 等待的ist 中...

在Windows CE增加自定義中斷處理

基於 s3c2410 windows ce4.2 bsp 是smdk2410 wince 的中斷處理是三個對映關係 isq interrupt id 邏輯中斷號 event 物件。當中斷發生時,isr 中斷服務例程 返回該中斷號對應的邏輯中斷號,然後盡可能快地返回 隨後ce就 set該邏輯中斷號對應...