中斷和中斷處理程序

驅動程序可以通過下面的函數註冊並激活一箇中斷處理程序,以便處理中斷:

int request_irq(unsigned int irq,

                         irqreturn_t (*handler)(int ,void *,struct pt_regs *),

                         unsigned long irqflags,

                         const char * devname,

                         void *dev_id)

第一個參數表示分配的中斷號。

第二個參數handler是一個指針,指向處理這個中斷的實際中斷處理程序。

第三個參數irqflags可以是0,也可以是下列一個或多個標誌的位掩碼:

SA_INTERRUPT:此標誌表明給定的中斷處理程序是一個快速中斷處理程序(fast interrupt handler).在本地處理器上,快速中斷處理程序在禁止所有中斷的情況下運行。這使得快速中斷處理程序能夠不受其他中斷的干擾,得以迅速執行。而默認情況下(沒有這個標誌),除了正運行的中斷處理程序應的那條中斷線被屏蔽外,其他所有中斷都是激活的。除了時鐘中斷外,絕大多數中斷都不使用該標誌。

SA_SAMPLE_RANDOM:此標誌表明這個設備產生的中斷對內核熵池有貢獻。內核熵池負責提供從各種隨機事件導出的真正的隨機數。如果制訂了該標誌,那麼來自該設備的中斷間隔時間就會作爲熵填充到熵池。如果你的設備以預知的速率產生中斷(比如系統定時器),或者可能受外部攻擊者的影響,那麼就不要設置這個標誌。相反,有其他很多硬件產生中斷的速率是不可預知的,所以都能成爲一種較好的熵源。、

SA_SHIRQ:此標誌表明可以在多箇中斷處理程序之間共享中斷線。在同一個給定線上註冊的每個處理程序必須指定這個標誌;否則,在每條線上只能有一個處理程序。

第四個參數dev_id主要用於共享中斷線。

卸載驅動程序時,需要註銷相應的中斷處理程序,並釋放中斷線。使用:

free_irq(unsigned int irq,void *dev_id)

編寫中斷處理程序

static irqreturn_t intr_handler(int irq,void *dev_id,struct pt_regs *regs)

第二個參數dev_id是一個通用指針,它與在中斷處理程序註冊時傳遞給request_irq()的參數dev_id必須一致。如果該值有唯一確定性,那麼它就相當於一個cookie,可以用來區分共享同一中斷處理程序的多個設備。

最後一個參數regs是一個指向結構的指針,該結構包含處理中斷之前處理器的寄存器和狀態。除了調試的時候,它們很少使用到。事實上,目前開發者的興趣顯示這個參數可能不再使用。

中斷處理程序可能返回兩個特殊的值

當中斷處理程序檢測到一箇中斷,但該中斷對應的設備並不是在註冊處理函數期間指定的產生源時,返回IRQ_NONE;

當中斷處理程序被正確調用,且確實是它所對應的設備產生了中斷時,返回IRQ_HANDLED.另外,也可以使用宏IRQ_RETVAL(x).如果x爲非0值

 

                        

發佈了57 篇原創文章 · 獲贊 15 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章