Linux 裝置驅動 核心等待佇列

2021-07-13 06:28:53 字數 2795 閱讀 2801

在 linux 驅動程式設計中,可以使用等待佇列來實現程序的阻塞.

等待佇列可以看作儲存程序的容器,在阻塞程序時,將程序放入等待佇列;

當喚醒程序時,從等待佇列中取出程序.

linux 2.6 核心提供了如下關於等待佇列的操作:

wait_queue_head_t   my_queue

init_waitqueue_head ( &my_queue )

declare_wait_queue_head  ( my_queue )

1,  wait_event ( queue , condition )

當 condition ( 乙個布林表示式 ) 為真,立即返回;否則讓程序進入task_uninterruptible 模式

睡眠,並掛在 queue 引數所指定的等待佇列上.

2,  wait_event_interruptible ( queue , condition )

當 condition ( 乙個布林表示式 ) 為真,立即返回;否則讓程序進入 task_interruptible 模式

睡眠,並掛在 queue 引數所指定的等待佇列上.

3, int  wait_event_killable ( wait_queue_t  queue , condition )

當 condition ( 乙個布林表示式 ) 為真,立即返回;否則讓程序進入 task_killable 模式

睡眠,並掛在 queue 引數所指定的等待佇列上.

( 老版本,不建議使用 )

sleep_on  ( wait_queue_head_t  *q )

讓程序進入 不可中斷 的睡眠,並把它放入等待佇列 q.

interruptible_sleep_on  ( wait_queue_head_t  *q )

讓程序進入 可中斷 的睡眠,並把它放入等待佇列 q.

wake_up ( wait_queue_t  *q )

從等待佇列 q 中喚醒狀態為 taskuninterruptible ,task_interruptible ,task_killable

的所有程序.

wake_up_interruptible ( wait_queue_t  *q )

從等待佇列 q 中喚醒狀態為 task_interruptible 的程序.

下面列出乙個例項,方便理解和使用 等待佇列:

比如我們在編寫 按鍵驅動程式的時候,我們的 應用程式採用 while(1) 一直去 read 按鍵值,這樣的話cpu 消耗占用過大;

所以,我們採用 等待佇列 來優化按鍵驅動程式:

在程式開頭 定義並且初始化 等待佇列declare_wait_queue_head

[cpp]view plain

copy

static declare_wait_queue_head(button_waitq);  

[cpp]view plain

copy

static

volatile

int ev_press = 0;  

在有按鍵按下的時候,讀取按鍵值;

沒有按鍵按下的情況下將等待佇列睡眠睡眠wait_event_interruptible

[cpp]view plain

copy

static

int tq2440_irq_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)  

ev_press = 0;  

err = copy_to_user(buff, (const

void *)key_values, min(sizeof(key_values), count));  

return err ? -efault : min(sizeof(key_values), count);  

}  

在 中斷服務程式中 喚醒等待佇列wake_up_interruptible

在 按鍵按下時,進入中斷服務程式,在這時候將等待佇列喚醒

[cpp]view plain

copy

static irqreturn_t irq_interrupt(int irq, void *dev_id)  

return irq_retval(irq_handled);  

}  

通過 對 static volatile int ev_press 變數的值 判斷,來確定 等待佇列 是睡眠 還是馬上讀取鍵值 .

buttons  stat 狀態為 sleep;

看各個按鍵的中斷有沒有被申請  key1-4 :

Linux裝置驅動,等待佇列

裝置驅動程式 include include include include include include include module license gpl define buf size 256 define device const char kgrunt struct kgrunt de...

高階字元裝置驅動 核心等待佇列筆記

等待佇列 在linux驅動程式設計中,可以使用等待佇列來實現程序的阻塞,等待佇列可以看作 程序的容器,在程序時,將程序放入等待佇列,當喚醒程序時,從等待佇列中取出程序。第一種方法 1 定義等待佇列 wait queue head t my queue 2 初始化等待佇列 init waitqueue...

《Linux裝置驅動開發詳解》 等待佇列

基礎知識 阻塞與非阻塞 阻塞操作是指在執行裝置操作時若不能獲得資源則掛起程序,直到滿足可操作的條件後再進行操作。被掛起的程序進入休眠狀態,被從排程器的執行佇列移走,直到等待的條件被滿足。而非阻塞操作的程序在不能進行裝置操作時並不掛起,它或者放棄,或者不停地查詢,直至可以進行操作為止。驅動程式通常需要...