分享

字符设备驱动之一些函数

 nt_bookworm 2012-03-22
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队列头代表的进程。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多