poll函式 Linux驅動基石之POLL機制

2021-10-11 18:30:34 字數 1094 閱讀 6439

在前面引入中斷時,我們曾經舉過乙個例子:

媽媽怎麼知道臥室裡小孩醒了?

時不時進房間看一下:查詢方式

簡單,但是累

進去房間陪小孩一起睡覺,小孩醒了會吵醒她:休眠-喚醒

不累,但是媽媽幹不了活了

媽媽要幹很多活,但是可以陪小孩睡一會,定個鬧鐘: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 ...