打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
字符设备驱动之一些函数
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队列头代表的进程。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Linux内核的同步机制(三):等待队列
内核等待队列机制原理分析 - wilson的日志 - 网易博客
内核的等待队列 - Linux内核编程 - creator的天空 - m_cu的日志 - ...
阻塞与非阻塞I/O
Linux内核机制之等待队列
linux中的阻塞机制及等待队列
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服