轉自:http://blog.csdn.net/guly699/archive/2009/10/19/4696722.aspx
先介紹一下WINCE常用的幾個概念
1.IRQ(Interrupt ReQuest)、物理插斷要求
2.SYSINTR、邏輯中斷
3.ISR(Interrupt Service Routine)、插斷服務常式
4.IST(Interrupt Service Thread)、中斷服務線程
中斷處理
一般中斷處理流程:
1.一個中斷髮生時,微處理器跳轉到系統的中斷處理模組來處理;
2.中斷處理模組禁止微處理器中的所有其他同優先順序和較低優先順序的中斷,然後再調用適當的ISR來處理這一物理插斷要求(IRQ);
3.以中斷標識位的形式ISR向中斷處理模組返回一個邏輯中斷,而且通常屏蔽了板級裝置驅動中斷;
4.當前正在執行的中斷一直被硬體所屏蔽,這樣可以等待適當的訊號的到來,觸發IST事件執行。除此之外,中斷處理常式重新開啟所有微處理器的中斷;
5.IST對應處理流程應該被提前設定好,按照流程向硬體提供服務,然後完成中斷處理;
6.中斷事件處理結束前IST調用interruptdone()函數,這個函數的作用是告訴作業系統對該中斷的處理已經完成,不用再屏蔽此中斷了。在系統內部,這個函數執行後,還會調用OAL中的oeminterrupdone()函數來宣告中斷處理已經完成。
中斷服務
中斷服務主要有兩部分:核心模式插斷服務常式(ISR)和使用者模式中斷服務線程(IST)。在WINCE中,ISR負責寄存器的保護與復原,所以用C代碼就可以實現一個ISR。
一般ISR只要完成下面五項就足夠了,不應該在ISR上實現太複雜,太多的功能;
1.在資料丟失或者被另一中斷覆蓋的情況下,ISR能把資料從裝置讀取到軟體的緩衝區中;
2.ISR清除裝置中的中斷條件;
3.ISR向核心返回一個邏輯中斷號SYSINTR;
4.核心設定一個中斷事件來解除對ISR的響應IST的請求;
5.調度器調度響應的IST完成相應的中斷處理。
中斷屏蔽
中斷屏蔽可以使某一個中斷執行過程中的所有操作無效,這會導致作業系統對此中斷訊號將不予理睬。
嵌套中斷處理
為了防止高優先順序中斷的失效和延遲,WIN CE 核心引入了嵌套中斷的機制。
共用中斷處理
WIN CE 處理共用中斷的步驟:
1.在OEMInit中與ISR程式建立關係的一個中斷必須調用NKCallIntChain()核心功能。這個函數用於檢查已安裝ISR的列表,並發出中斷訊號。
2.如果第一個ISR決定它的關聯裝置宣告了一個中斷,那麼它將執行必要的準備工作,處理結束後,這個ISR將為這個裝置返回一個邏輯中斷號。如果這個ISR沒有決定下一步的操作,那麼ISR將會返回SYSINTR_NOP。
3.如果ISR判斷出它相關的裝置沒有宣告中斷,它回到SYSINTR_CHAIN,將導致NKCallIntChain訪問鏈中下一個ISR的發生,安裝ISR的順序是很重要的,因為它涉及到隱含優先權的問題。
中斷處理過程分析
一個完整的中斷處理大致需要一下8個步驟:
1.如果核心的捕獲異常代碼接收一個硬體中斷,那麼核心接著就會識別一個異常,並操作相應的硬體中斷。否則,跳到第二步執行。
2.中斷管理器通知ISR禁用當前指定的中斷,直到這個中斷處理完成後,再啟用這個中斷。不過在此過程中其它的中斷仍然可用。
3.異常管理器調用ISR來決定如何處理這個中斷。
4.核心接收ISR的傳回值後,就會知道該中斷在做什麼。
傳回值 描述
SYSINTR_NOP 核心不做任何響應
SYSINT_RESCHED 作業系統定時逾時,核心重新調度IST
SYSINTR_XXX (邏輯中斷號) 核心觸發中斷源ISR後,IST將被喚醒開始工作,接著IST建立一個事件等待中斷訊號到來。
5.當IST被喚醒後,它做中斷處理要做的所有工作,如將資料移到一個緩衝區裡或用一種可行的方法來解決此資料。
6.必要時,IST調用各種I/O函數訪問硬體來完成對它的相關操作。
7.當IST完成中斷處理工作時,它將調用InterruptDone()函數來通知核心。
8.核心調用OAL中的函數OEMInterruptDone()來宣告所有中斷處理工作已經完成。OAL通知硬體重新開啟該中斷。
配置、註冊、並撤銷一個中斷處理常式
當一個裝置驅動程式載入時必須要遵循以下步驟執行相關的動作。
1.在核心中註冊ISR
2.將物理中斷映(IRQ)射為邏輯中斷
插斷服務常式
中斷服務線程
中斷通知