韋東山 Linux驅動基石之POLL機制

2021-10-06 02:46:47 字數 2748 閱讀 1568

版本

日期作者

說明v1

2020

韋東山技術文件

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

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

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

簡單,但是累

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

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

③ 媽媽要幹很多活,但是可以陪小孩睡一會,定個鬧鐘:poll方式

要浪費點時間,但是可以繼續幹活。

媽媽要麼是被小孩吵醒,要麼是被鬧鐘吵醒。

④ 媽媽在客廳幹活,小孩醒了他會自己走出房門告訴媽媽:非同步通知

媽媽、小孩互不耽誤

static

unsigned

intgpio_key_drv_poll

(struct file *fp, poll_table * wait)

事件型別

說明pollin

有資料可讀

pollrdnorm

等同於pollin

pollrdband

priority band data can be read,有優先順序較較高的「band data」可讀

linux系統中很少使用這個事件

pollpri

高優先順序資料可讀

pollout

可以寫資料

pollwrnorm

等同於pollout

pollwrband

priority data may be written

pollerr

發生了錯誤

pollhup

掛起pollnval

無效的請求,一般是fd未open

在呼叫poll函式時,要指明:

① 你要監測哪乙個檔案:哪乙個fd

② 你想監測這個檔案的哪種事件:是pollin、還是pollout

最後,在poll函式返回時,要判斷狀態。

應用程式**如下:

struct pollfd fds[1]

;int timeout_ms =

5000

;int ret;

fds[0]

.fd = fd;

fds[0]

.events = pollin;

ret =

poll

(fds,

1, timeout_ms);if

((ret ==1)

&&(fds[0]

.revents & pollin)

)

sys_poll位於fs/select.c檔案中,**如下:

syscall_define3

(poll,

struct pollfd __user *

, ufds,

unsigned

int, nfds,

int, timeout_msecs)

ret =

do_sys_poll

(ufds, nfds, to)

;……

syscall_define3是乙個巨集,它定義於include/linux/syscalls.h,展開後就有sys_poll函式。

sys_poll對超時引數稍作處理後,直接呼叫do_sys_poll。

do_sys_poll位於fs/select.c檔案中,我們忽略其他**,只看關鍵部分:

int

do_sys_poll

(struct pollfd __user *ufds,

unsigned

int nfds,

struct timespec64 *end_time)

poll_initwait函式非常簡單,它初始化乙個poll_wqueues變數table:

poll_initwait

init_poll_funcptr

(&pwq->pt, __pollwait)

; pt->qproc = qproc;

即table->pt->qproc =__pollwait,__pollwait將在驅動的poll函式裡用到。

do_poll函式才是核心,繼續看**。

do_poll函式位於fs/select.c檔案中,這是poll機制中最核心的**,貼圖如下:

① 從這裡開始,將會導致驅動程式的poll函式被第一次呼叫。

沿著②③④⑤,你可以看到:驅動程式裡的poll_wait會呼叫__pollwait函式把執行緒放入某個佇列。

當執行完①之後,在⑥或⑦處,pt->_qproc被設定為null,所以第二次呼叫驅動程式的poll時,不會再次把執行緒放入某個佇列裡。

⑧ 如果驅動程式的poll返回有效值,則count非0,跳出迴圈;

⑨ 否則休眠一段時間;當休眠時間到,或是被中斷喚醒時,會再次迴圈、再次呼叫驅動程式的poll。

韋東山匯流排驅動裝置模型201128

一,bus drv dev模型 新一期 一 bus,device,driver都是乙個結構體。二 這只是一種機制,一種device和driver建立聯絡的機制。三 註冊 1,driver register,會把driver註冊到bus結構體中的drv煉表裡。2,device add,會把device...

韋東山第12課 字元裝置驅動框架 led驅動

first drv.c include include include include include include include include include include include include include include static int first drv open ...

韋東山嵌入式linux學習筆記

第一課 原理圖之gpio和閘電路 generial peripheral input output 學習到的知識點 上拉電阻,和下拉電阻的認識和理解 以及梳理了一下閘電路。上拉電阻,下拉電阻一般都是和三極體配套使用,都是為了給懸空的的引腳 管中的一級 乙個確定的電壓狀態,並且起反相的作用。上拉電阻和...