Linux內核設計與實現——7 中斷與中斷處理(5)——註冊中斷處理程序

5.註冊中斷處理程序

1)驅動程序可以通過request_irq()函數註冊一箇中斷處理程序,並激活給定的中斷線。函數原型如下:

int request_irq( unsigned  int  irq , irq_handler_t  handler,

                unsinged  long flags,  const  char * name,

               void *dev )

返回值:成功返回0,失敗返回非0。通常返回非0最常見的錯誤是-BUSY,它表示給定的中斷線已經在使用,或沒有指定共享。

 

第一個參數:要分配的中斷號。

 

第二個參數:一個函數指針,指向該驅動程序的中斷處理函數。中斷處理函數的原型我們已經在前面講過了。

 

第三個參數:可以爲0,也可以使是以下幾個取值.

IRQF_DISABLED:表示內核在處理此中斷處理程序本身期間,要禁止所有其它中斷。多數中斷處理程序不應該這麼做。

IRQF_SAMPLE_RANDOM:表示該設備產生的中斷會對內核熵池(entropy pool)有貢獻。內核熵池是用來產生隨機數的。所以,一般來說,只有中斷產生時機不可預測的中斷源纔會如此設置,否則,會使得產生的隨機數不是真正的隨機。像時鐘中斷這種有規律的中斷是堅決不應該這樣設置的。

IRQF_TIMER:系統定時器專用。即時鐘中斷。

IRQF_SHARED:表示允許多箇中斷處理程序共享同一個中斷線。只有此中斷線上的所有設備都設置了此標誌位,該中斷線纔是共享的。只要有一箇中斷處理程序表示自己不共享,那麼這條中斷線就無法共享。

       注意,第三個參數可以是以上幾個選項中一個或多個的組合,如:IRQF_SAMPLE_RANDOM| IRQF_SHARED

 

第四個參數:是與該中斷處理程序相關聯的設備名。

 

第五個參數:指向該設備的一個可以唯一區分的指針。當該中斷線是非共享的時候,可以是NULL。如果中斷線是共享的,它上面有多箇中斷源,就無法通過中斷號唯一確定一個設備,所以就需要這樣一個指針來唯一定位一個設備。

 

2)注意:request_irq()函數可能會睡眠,所以,不能在中斷上下文或其它不允許睡眠的代碼中調用此函數。

 

3)硬件的初始化和註冊中斷處理程序的順序要正確,應先初始化設備,然後再註冊中斷處理程序。以防止出現中斷處理程序在設備初始化完成之前就開始執行,這種情況下,中斷處理程序根本無法正確指定完成。

 

4)釋放中斷處理程序。有生就有死,有註冊就要有釋放。當中斷處理程序不需要再使用的時候就需要進行釋放,釋放函數如下:

 void free_irq ( unsigned  int  irq, void *dev );

第一個參數是終端號,第二個參數是指向該設備的唯一確定的指針。

刪除中斷處理程序後,如果該中斷線上已經沒有其他中斷處理程序,那麼,該函數以會將這個中斷線禁止掉。

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