驅動學習之 核心等待佇列的使用

2021-06-01 12:07:45 字數 1175 閱讀 2388

在中,結構體定義如下:

struct __wait_queue_head ;

typedef struct __wait_queue_head wait_queue_head_t;

且struct list_head ;

再來看定義並初始化乙個wait_queue_head_t 的函式:

主要就是定義個乙個

wait_queue_head_t 的變數,然後初始化,lock初始化為unlock, task_list裡面的next和pre都指向自己的list_head。

#define __wait_queue_head_initializer(name) }

#define declare_wait_queue_head(name) \

wait_queue_head_t name = __wait_queue_head_initializer(name)

我們再來看這個這個結構體:

struct __wait_queue ;

把整個佇列畫出來,是這樣的,中間的節點是wait_queue_t,乙個等待佇列包含了等待特定事件的所有程序。

在我們這樣使用:

declare_wait_queue_head(queue_name);

就新建並初始化了乙個queue的頭結點。

然後呼叫以下函式,就新生成了乙個wait_queue_t 的節點,並加入到這個佇列中,這樣在等待的事情發生後,核心就可以從該佇列中找到等待的程序。

wait_even(queue_name, condition);

wait_even_interruptible(queue_name, condition);

wait_even_timeout(queue_name, condition, timeout);

wait_even_interruptible_timeout(queue_name, condition);

喚醒的方法:

void wake_up(wait_queue_head_t* queue);  

void wake_up_interruptible(wait_queue_head_t* queue);

會喚醒等待的所有程序。注意我們一般都把wait_even與wake_up對應起來,wait_even_interruptible與 wake_up_interruptible對應起來。

核心等待佇列的使用

1.定義等待佇列 wait queue head t my queue 2.初始化等待佇列 init waitqueue head my queue 3.定義並同時初始化佇列 declare wait queue head my queue 4.利用等待佇列使程序睡眠 wait event queu...

Linux 裝置驅動 核心等待佇列

在 linux 驅動程式設計中,可以使用等待佇列來實現程序的阻塞.等待佇列可以看作儲存程序的容器,在阻塞程序時,將程序放入等待佇列 當喚醒程序時,從等待佇列中取出程序.linux 2.6 核心提供了如下關於等待佇列的操作 wait queue head t my queue init waitque...

linux驅動之等待佇列

linux驅動中,等待某種的事件發生的工作最好不要使用不斷迴圈來完成,而是採用另外一種方法,休眠與喚醒。等待佇列工作過程就是睡眠和喚醒的過程 睡眠和喚醒的過程的基本原理,當驅動程式等待事件發生時候進入休眠狀態,當該事件發生後,就會喚醒休眠狀態的驅動 使用 static declare wait qu...