在前面引入中斷時,我們曾經舉過乙個例子:
媽媽怎麼知道臥室裡小孩醒了?
時不時進房間看一下:查詢方式
簡單,但是累
進去房間陪小孩一起睡覺,小孩醒了會吵醒她:休眠-喚醒
不累,但是媽媽幹不了活了
媽媽要幹很多活,但是可以陪小孩睡一會,定個鬧鐘:poll方式
要浪費點時間,但是可以繼續幹活。
媽媽要麼是被小孩吵醒,要麼是被鬧鐘吵醒。
媽媽在客廳幹活,小孩醒了他會自己走出房門告訴媽媽:非同步通知
媽媽、小孩互不耽誤
使用休眠-喚醒的方式等待某個事件發生時,有乙個缺點:等待的時間可能很久。我們可以加上乙個超時時間,這時就可以使用poll機制。
如果發現沒有資料時就休眠一段時間;
媽媽進入房間時,會先看小孩醒沒醒,鬧鐘響之後走出房間之前又會再看小孩醒沒醒。
注意:看了2次小孩!
poll機制也是類似的,流程如下:
函式執行流程如上圖①~⑧所示,重點從③開始看。假設一開始無按鍵資料:
注意幾點:
drv_poll要把執行緒掛入佇列wq,但是並不是在drv_poll中進入休眠,而是在呼叫drv_poll之後休眠
drv_poll要返回資料狀態
執行緒被喚醒的原因有2:中斷發生了去佇列wq中把它喚醒,超時時間到了核心把它喚醒
使用poll機制時,驅動程式的核心就是提供對應的drv_poll函式。
在drv_poll函式中要做2件事:
static unsigned int gpio_key_drv_poll(struct file *fp, poll_table * wait)
韋東山 Linux驅動基石之POLL機制
版本 日期作者 說明v1 2020 韋東山技術文件 在前面引入中斷時,我們曾經舉過乙個例子 媽媽怎麼知道臥室裡小孩醒了?時不時進房間看一下 查詢方式 簡單,但是累 進去房間陪小孩一起睡覺,小孩醒了會吵醒她 休眠 喚醒 不累,但是媽媽幹不了活了 媽媽要幹很多活,但是可以陪小孩睡一會,定個鬧鐘 poll...
linux驅動之poll操作
poll是乙個系統呼叫,其核心入口函式為sys poll,sys poll差點兒不做不論什麼處理直接呼叫do sys poll,do sys poll的執行過程能夠分為三個部分 1,將使用者傳入的pollfd陣列複製到核心空間,由於拷貝操作和陣列長度相關。時間上這是乙個o n 操作,這一步的 在do...
Linux驅動之poll機制
驅動程式 include 模組有關的 include 核心有關的 include 檔案系統有關的 include include include include include include linux中斷 include include include include copy to user ...