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