1)外設的處理速度一般慢於cpu
2)cpu不能一直等外部事件
所以裝置必須有一種方法來通知cpu它的工作進度,這就是中斷。
步驟:1)向核心註冊中斷
2)實現中斷處理函式
intrequest_irq(unsignedintirq,void(*handler)(int,void*,structpt_regs*),unsignedlongflags,constchar*devname,void*dev_id)
返回0表示成功,或者返回乙個錯誤碼
引數:irq:中斷號
handler:中斷處理函式
flags:與中斷管理有關的各種選項
devname:裝置名
dev_id:共享中斷時使用
在flags引數中,可以選擇一些與中斷管理有關的選項
如:irqf_disabled(sa_interrupt)
如果設定該位,表示是乙個「快速」中斷處理程式
如果沒有,表示是乙個「慢速」中斷處理程式
irqf_shared(sa_shirq)
該位表示中斷可以在裝置間共享
快速中斷不允許中斷巢狀(不被打斷)
慢速中斷可以中斷巢狀,其它型別的中斷可以得到服務(預設)
共享中斷就是將不同的裝置掛到同乙個中斷訊號線上。
linux對共享的支援主要是為pci裝置服務
共享中斷也是通過request_irq函式來註冊的,但有三個特別之處:
1)申請共享中斷時,必須在flags引數中指定irqf_shared位
2)dev_id引數必須是唯一的
為什麼要唯一?
在釋放中斷時要voidfree_irq()不然核心不知道你要釋放哪個裝置(共享中斷時有不只乙個裝置在用這個中斷)
3)不能使用disable_irq(unsignedintirq)(這個函式是禁止中斷的)
為什麼?
如果使用了,共享中斷訊號線的裝置同樣無法使用中斷,也就是無法正常工作了。
中斷處理程式是中斷上下檔案中執行的,所以它的行為受到某些限制:
1)不能向使用者空間傳送或者接受資料
2)不能使用可能引起阻塞的函式
3)不能使用可能引起排程的函式
voidfree_irq(unsignedintirq,void*dev_id)
Linux 裝置驅動 中斷處理
為什麼需要中斷 1,外設的處理速度一般慢於 cpu 2,cpu 不能一直等待外部事件 所以裝置必須有一種方法來通知 cpu 它 的工作進度,這種方法就是中斷.在 linux 驅動程式中,為裝置實現乙個中斷包含兩個步驟 1,向核心註冊中斷 2,實現中斷處理函式 request irq 用於實現中斷的註...
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...
裝置驅動 中斷
1 關於裝置驅動中的中斷問題 作業系統為了使得快速裝置和慢速裝置合適工作,需要中斷來提高效率,乙個外設要使用乙個中斷就必須註冊中斷號,獲得跟這個中斷號相關的一些資源,並且在中斷發生的時候核心可以進行一些處理,例如 呼叫中斷處理例程來真正的處理裝置中斷。linux處理中斷的方式很大程度上與它在使用者空...