驅動程式開發過程中對中斷的處理是很重要的一部分,直接關係程式的執行結果與效率,所以需要對其給予足夠的重視.
中斷處理包含兩個方面,與ce系統相關的部分及與硬體相關的部分. ce系統特定的處理流程(與其它系統有所區別的,或者說這部分**在其它系統上是無法執行的)一般為:
1.用createevent建立乙個自動事件(即不需要使用resetevent去重置事件.
2.用interruptinitialize將些事件與硬體所需要的中斷關聯起來.
3.建立乙個執行緒,在此執行緒中用waitforsingleobject等待事件,當等到這個事件之後,開始相應的處理,完成之後呼叫
interruptdone去重新啟用中斷.
硬體相關部分, 一般的,oal層的中斷處理程式(oeminterrupthandler),在監測到某個中斷後,會將cpu相應的中斷標誌位清除,同時禁用該中斷,以保證系統排程不會被該中斷再次打斷,而後返回乙個中斷號給系統,從而使系統開始排程其ist,驅動程式的ist被啟用,完成相應的處理之後應該清除硬體級的中斷標誌,從而使硬體知道中斷服務已經完成,而不再產生該中斷。當然有些硬體,例如ata/atapi不需要這個動作,這些裝置在最後乙個位元組被讀出/寫入之後會將其drq標誌清除,自然,只要還有乙個位元組沒有被讀出/寫入,drq就一直存在。
注意: 5。0以後引入pqoal的概念,在pqoal格式的bsp中,有乙個sysintr與irq的概念,sysintr是系統使用的中斷,irq為硬體中斷,即cpu使用的中斷線,一般的bsp中,將其cpu的中斷標誌暫存器的各位一一對應,即,irq0對應於該暫存器的第0位,irq2為第2位。所以,做為驅動程式,必須知道它所驅動的硬體所使用的irq,即硬體中斷線。然後呼叫kerneliocontrol的ioctl_hal_request_sysintr功能得到乙個sysintr,然後再進入上面描述的流程。這樣,驅動程式 以後就只使用申請到的sysintr,而不關心其irq了。 oal層會將irq與sysintr做相互轉換。
Linux核心開發之中斷處理
一 概念 1 外設的處理速度一般慢於cpu。2 cpu不能一直等待外部事件。所以裝置必須有一種方法來通知cpu它的工作進度,這種方法就是中斷。二 中斷實現 在linux驅動程式中,為裝置實現乙個中斷包含兩個步驟 1 向核心註冊中斷 2 實現中斷處理函式 三 中斷處理子系統 1 根據中斷號找到正確的中...
Linux裝置驅動程式設計之中斷處理
與linux裝置驅動中中斷處理相關的首先是申請與釋放irq的api request irq 和free irq request irq 的原型為 int request irq unsigned int irq,void handler int irq,void dev id,struct pt r...
6410之中斷處理
中斷 在6410 arm體系中,有很多模組可以產生中斷,比如gpio,uart,ts等都可以產生。在這些模組和cpu之間還有乙個中斷控制器。這個中斷控制器就是用於協調這些模組和cpu之間的互動的。比如 gpio和uart同時發出中斷請求,那麼cpu來處理那個中斷呢?這就需要用到中斷控制器了。如下圖所...