02:30:23
在wince的流驅動裡面,要處理的中斷一般是外部裝置物理來的中斷請求。
以arm體系結構為例:為(irq或fiq),其中斷機制完全算是由軟體程式設計控制的。這是看bootloader時得出的結論。
windows ce下的中斷處理分為兩個階段,處於核心模式的中斷服務例程(isr,interrupt service routine)和處於使用者模式的中斷服務執行緒(ist,interrupt service thread)
發生的物理中斷首先經過oal層isr轉換為邏輯中斷,在這他們是多對一的關係。isr通常會向核心返回乙個值,如果中斷與已註冊isr相關聯,將會返回乙個sysintr_***,邏輯中斷號,核心將重新開啟處理器上除已識別的中斷之外的所有中斷。然後,核心將引發與sysintr_***值關聯的事件。驅動程式中的ist將開始執行,驅動程式裡面通過等待事件函式waitforsingleobject(), 其原型如下:
dword waitforsingleobject(
handle hhandle, // 事件的控制代碼
dword dwmilliseconds // 超時的毫秒數,如果超過此引數的時間,函式也會返回。
);waitforsingleobject()函式會阻塞當前的執行緒,等待某個event核心物件標識的事件發生。函式在兩種情況下會返回:事件發生或者超過第二個引數指定的時間。在ist中,通常把第二個引數標識為infinite,表示在此事件上等待無窮長的時間。
然後在使用者態執行相應的中斷處理,最後呼叫interruptdone()通知核心已完成對中斷的處理。核心在接收到sysintr_***值的interruptdone()時,將重新開啟指定的中斷。只有從這時開始,才能接收該裝置的其它中斷。至此,一次中斷處理結束。
下面介紹isr的具體實現:
其工作流程如下:
1. 呼叫picgetcurrentinterrupt中獲取當前硬體中斷
2. 如果該中斷是 intr_timer0(系統計時器),更新curmsec保持時間,檢查並確認是否已經註冊了重新啟動位址reboothandler
3. 如果中斷是 intr_rtc,isr檢查並確認鬧鐘是否已到期sysintr_rtc_alarm。
4. 如果中斷小於intr_maximum呼叫中斷鏈nkcallintrchain,並將nkcallintrchain的返回值設定為臨時返回值。
5. 如果中斷鏈未包含中斷,則通過oemtranslateirq對映當前硬體中斷,並得到從oemtranslateirq返回的syintr值。通常,如果在oeminit函式中註冊過該中斷,則oemtranslateirq會返回邏輯中斷號,否則會返回sysintr_nop。
6. 呼叫picenableinterrupt啟用除當前中斷以外的所有中斷
7. 完成恰當的中斷結束工作以通知pic中斷已完成
從第5步可以知道,要完成乙個物理到邏輯中斷的轉換,有兩種方法:
1.直接修改oal層下面的oem函式,增加相應的中斷號相關的實現。
2.動態生成iisr註冊進核心
ist的實現:
在ist開始時,通常我們可以用cesetthreadpriority函式為ist執行緒設定合適的優先順序。
接著ist需要做的是使用createevent()函式建立乙個event核心物件,
然後使用interruptinitialize()函式負責把某個邏輯中斷號與乙個event核心物件關聯起來,當中斷發生時,作業系統會負責引發這個事件,函式的原形如下:
bool interruptinitialize(
dword idint, // sysintr中斷號
handle hevent, // 與該中斷相關聯的事件控制代碼
lpvoid pvdata, // 傳給oeminterruptenable函式的緩衝區指標
dword cbdata // 緩衝區的大小
);然後,ist通常在前面建立的event物件上使用waitforsingleobject來等待。這樣,當中斷產生時waitforsingleobject就會返回,ist可以對中斷進行處理,例如對裝置進行必要的i/o操作來得到外設中的資料。當中斷處理結束之後,需要呼叫interruptdone來完成本次中斷處理。
中斷的延遲:
1. isr延遲時間
2. isr執行時間
3. os執行系統呼叫的時間
4. 排程ist時間
呵呵,終於還算搞完了,這是我的第一篇部落格,雖然大多都是看書上來的。還請多多支援!
睡個好覺,晚安!!
QNX驅動開發 中斷處理,中斷響應機制
鋒影 e mail 174176320 qq.com 在作業系統中,對於中斷的處理一直是一件麻煩事,其實主要是對作業系統的中斷管理機制不熟悉。當中斷產生時,核心去執行中斷服務程式 isr,中斷服務程式中要做盡量少的工作,以提高系統執行效率,有些人在中斷服務程式中使用延時函式和 printf 函式和m...
wince5 0 Eboot下USB中斷機制
開始在eboot中使用usb的時候很奇怪中斷響應。因為在eboot和stepldr中都沒有看到有對中斷向量表部分的處理。那麼這個中斷是怎麼觸發?最後在usb.c中的isr init找到這句話 pisr unsigned 0xea000000 unsigned isrhandler 0x8000000...
WINCE中斷例子
軟體包測試你的ce的中斷,安裝軟體包後如下圖 以下是10號中斷測試的具體說明 本流驅動在pb平台安裝完成以後,就可以使用irq10號物理中斷,流輸出的是對應10號中斷的乙個事件,事件到來一次,表示中斷發生一次,在500m的研華pcm3370上,evc呼叫這個流驅動,可以達到40us的響應速度,c 精...