Linux驅動開發之中斷

2021-08-10

關鍵字:中斷的概念


 

1、中斷的概念與分類

 

中斷說白了就一句話:臨時去處理一下其它事。

 

這個“其它事”具有以下特點:

1、突發性;

2、短暫性;

 

Linux驅動開發中的中斷分類方式較多,大體上可分爲以下三個類別:

1、硬中斷與軟中斷;

2、外部中斷與內部中斷;

3、同步中斷與異步中斷;

 

硬中斷是由具體的、除CPU以外的設備產生的。軟中斷則是由程序發生的。

 

外部中斷是由外設產生的,可以簡單理解成就是硬中斷。內部中斷亦可以簡單理解成就是軟中斷。

 

同步中斷是發生在CPU指令執行過程中的,它只有在當前指令執行完後纔會產生。同步中斷一般是因爲程序錯誤引起的。同樣它可以簡單理解成就是內部中斷。異步中斷的發生則不需要依賴於指令的執行狀況,它可在任何時刻發生。它可以簡單理解成就是外部中斷。

 

 

2、中斷在Linux中的運行機理

 

Linux中斷系統可以簡單劃分成是由三個角色組成的:

1、中斷髮生器;

2、信號傳輸導線;

3、中斷處理器;

 

中斷系統的關鍵就是“信號”。發生器會將其動作以電信號的形式通知到處理器,每個信號線都有一個唯一的編號,驅動程序通過這些編號來向系統申請監聽中斷。通常在中斷處理器內部還會再引入一個“中斷控制器”的角色用以對中斷信號做全局級別的控制。

 

 

 

3、中斷處理過程

 

具體如下步驟所示:

  1. 中斷信號生成;
  2. 信號經由傳輸線傳遞至處理器中的中斷控制器;
  3. 中斷控制器按配置過濾中斷信號;
  4. 未被攔截的中斷信號通過內部數據總線傳遞至CPU核心;
  5. 核心程序收到後決定是自行消化還是交由驅動程序進一步處理;

對應的示例圖如下所示:

 

 

中斷控制器的職責就是不斷地檢查各條中斷線其上是否有信號產生。如果同一時刻有多條信號線產生了中斷信號,則中斷控制器會優先處理中斷編號較小的中斷線信號。

 

可以被傳遞給CPU核心的中斷信號會先被中斷控制器暫存在“端口A”中,然後中斷控制器會通過INRT腳通知到CPU有中斷信號可供讀取。隨後CPU核心會在一個恰當的時機通過內部數據總線將中斷信號讀取進來處理。

 

如果中斷信號是由外部設備引起的,則CPU核心在收到信號後會先發送一個“應答信號”到中斷控制器以表示正在處理此中斷。此應答信號可用於阻止外設的重複中斷信號。

 

 

4、Linux中斷的申請與釋放

 

Linux驅動開發中中斷的申請函數原型如下所示:

int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char* devname, void* dev_id);

參數irq表示中斷號;

參數handler表示中斷處理函數地址。

參數irqflags用於控制中斷處理的屬性。

參數devname表示設備的名稱,此名稱會在 /proc/interrupts 中顯示,用於記錄中斷號與設備之間的關係。

參數dev_id是爲共享中斷線設立的,如果中斷信號不需要共享功能,置NULL即可。

 

 

中斷釋放函數原型如下所示:

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

參數irq表示中斷號。

參數dev_id是爲共享中斷線而設置的。

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章