1、static DECLARE_WAIT_QUEUE_HEAD(button_waitq); DECLARE_WAIT_QUEUE_HEAD是一个宏,定义如下: #define DECLARE_WAIT_QUEUE_HEAD(name) \ wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name) wait_queue_head_t也是一个宏,定义如下: typedef struct __wait_queue_head wait_queue_head_t; struct __wait_queue_head { spinlock_t lock; struct list_head task_list; }; __WAIT_QUEUE_HEAD_INITIALIZER(name)也是一个宏,定义如下: #define __WAIT_QUEUE_HEAD_INITIALIZER(name) { \ .lock = __SPIN_LOCK_UNLOCKED(name.lock), \ .task_list = { &(name).task_list, &(name).task_list } } 所以,static DECLARE_WAIT_QUEUE_HEAD(button_waitq);相当于定义了一个名为button_waitq struct __wait_queue_head类型的结构体变量,并初始化为: .lock = __SPIN_LOCK_UNLOCKED(name.lock), .task_list = { &(name).task_list, &(name).task_list } 意义:定义一个名为button_waitq的队列头,代表该进程。 2、wait_event_interruptible(button_waitq, ev_press); #define wait_event_interruptible(wq, condition) \ ({ \ int __ret = 0; \ if (!(condition)) \ __wait_event_interruptible(wq, condition, __ret); \ __ret; \ }) 当条件condition为0是调用__wait_event_interruptible(wq, condition, __ret)进行休眠; 3、wake_up_interruptible(&button_waitq); #define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL) void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr_exclusive, void *key) { unsigned long flags; spin_lock_irqsave(&q->lock, flags); __wake_up_common(q, mode, nr_exclusive, 0, key); spin_unlock_irqrestore(&q->lock, flags); } 唤醒button_waitq队列头代表的进程。
|
|
来自: nt_bookworm > 《驱动》