1、 中斷概念
為什麼需要中斷?
1)外設的處理速度一般慢於cpu
2)cpu不能一直等待外部事件
所以裝置必須有一種方法來通知cpu它的工作進度,這種方法就是中斷。
2、 中斷實現
在linux驅動程式中,為裝置實現乙個中斷包含兩個步驟:
1)向核心註冊中斷
2)實現中斷處理函式
3、 中斷註冊
request_irq用於實現中斷的註冊功能:
int request_irq(unsigned int irq, void (*handler)(int, void*, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id)
返回0表示成功,或者返回乙個錯誤碼
中斷註冊(引數)
1) unsigned int irq 中斷號。
2)void (*handler)(int,void *,struct pt_regs *) 中斷處理函式。
3)unsigned long flags 與中斷管理有關的各種選項。
4)const char * devname 裝置名
5)void *dev_id 共享中斷時使用。
a)中斷註冊(中斷標誌)
在flags引數中,可以選擇一些與中斷管理有關的選項,如:
1)irqf_disabled(sa_interrupt)
如果設定該位,表示是乙個「快速」中斷處理程式;如果沒有設定這位,那麼是乙個「慢速」中斷處理程式。
2)irqf_shared(sa_shirq)
該位表明中斷可以在裝置間共享。
b)快速/慢速中斷
這兩種型別的中斷處理程式的主要區別在於:快速中斷保證中斷處理的原子性(不被打斷),而慢速中斷則不保證。換句話說,也就是「開啟中斷」標誌位(處理器if)在執行快速中斷處理程式時是關閉的,因此在服務該中斷時,不會被其他型別的中斷打斷;而呼叫慢速中斷處理時,其它型別的中斷仍可以得到服務。
c) 共享中斷
共享中斷就是將不同的裝置掛到同乙個中斷訊號線上。linux對共享的支援主要是為pci裝置服務。共享中斷也是通過request_irq函式來註冊的,但有三個特別之處:
1)申請共享中斷時,必須在flags引數中指定 irqf_shared位
2)dev_id引數必須是唯一的。
3)共享中斷的處理程式中,不能使用disable_irq(unsigned int irq) 為什麼? 如果使用了這個函式,共享中斷訊號線的其它裝置將同樣無法使用中斷,也就無法正常工作了。
4、 中斷處理程式
什麼是中斷處理程式,有何特別之處?中斷處理程式就是普通的c**。特別之處在於中斷處理程式是在中斷上下文中執行的,它的行為受到某些限制:
1) 不能向使用者空間傳送或接受資料
2) 不能使用可能引起阻塞的函式
3) 不能使用可能引起排程的函式
5、 中斷處理函式流程
void short_sh_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{/* 判斷是否是本裝置產生了中斷(為什麼要做這樣的檢測?) */
value = inb(short_base);
if (!(value & 0x80)) return;
/* 清除中斷位(如果裝置支援自動清除,則不需要這步) */
outb(value & 0x7f, short_base);
/* 中斷處理,通常是資料接收 */
。。。。。。。。。
/* 喚醒等待資料的程序 */
wake_up_interruptible(&short_queue);
6、 釋放中斷
當裝置不再需要使用中斷時(通常在驅動解除安裝時), 應當把它們返還給系統,使用:void free_irq(unsigned int irq, void *dev_id)
linux中斷處理原理分析
首先需要了解一下中斷的概念 乙個 中斷 僅僅是乙個訊號,當硬體需要獲得處理器對它的關注時,就可以傳送這個訊號。核心維護了乙個中斷訊號線的登錄檔,該登錄檔類似於i o埠的登錄檔。模組在使用中斷前要先請求乙個中斷通道 或中斷請求irq 然後在使用後釋放該通道。用到的api就是request irq 以及...
linux中斷處理原理分析
部落格 fireaxe.blog.chinaunix.net tasklet作為一種新機制,顯然可以承擔更多的優點。正好這時候smp越來越火了,因此又在tasklet中加入了smp機制,保證同種中斷只能在乙個cpu上執行。在軟中斷時代,顯然沒有這種考慮。因此同一種中斷可以在兩個cpu上同時執行,很可...
linux中斷處理原理分析
tasklet作為一種新機制,顯然可以承擔更多的優點。正好這時候smp越來越火了,因此又在tasklet中加入了smp機制,保證同種中斷只能在乙個cpu上執行。在軟中斷時代,顯然沒有這種考慮。因此同一種中斷可以在兩個cpu上同時執行,很可能造成衝突。linux中斷下半部處理有三種方式 軟中斷 tas...