精华内容
下载资源
问答
  • 休眠 所谓休眠就是让出CPU ...wait_event_interruptible(wq, condition) condition = 0 ///休眠 condition = 1 ///唤醒 wait_event_interruptible()和wait_up_interruptible() wait_event_interruptible...

     

    休眠

    所谓休眠就是让出CPU 然后并不返回

     

    wait_event_interruptible(wq, condition)

     

    condition = 0  ///休眠

    condition = 1  ///唤醒

     

    wait_event_interruptible()和wait_up_interruptible()

     

    wait_event_interruptible(wq, condition)
    用wake_up_interruptible()唤醒后,wait_event_interruptible(wq, condition)宏,自身再检查“condition”这个条件以决定是返回还是继续休眠,真则返回,假则继续睡眠,不过这个程序中若有中断程序的话,中断来了,还是会继续执行中断函数的。只有当执行wake_up_interruptible()并且condition条件成立时才会把程序从队列中唤醒。

     

    结合驱动示例分析

     static int touch_event_handler(void *unused)
     { 
     
        do
        {       
            mt65xx_eint_unmask(CUST_EINT_TOUCH_PANEL_NUM);   
            set_current_state(TASK_INTERRUPTIBLE); 
            wait_event_interruptible(waiter, zintix_tpd_flag!=0);   
            zintix_tpd_flag = 0;  
            set_current_state (TASK_RUNNING);  
            mt65xx_eint_mask(CUST_EINT_TOUCH_PANEL_NUM); 


            if (tpd_touchinfo()) {   
            TPD_DEBUG_SET_TIME; 
            }
        }while(!kthread_should_stop());
     
        return 0;
     }

     

    static void tpd_eint_interrupt_handler(void)
    {
        printk("TPD interrup has been triggered\n");    
    //    TPD_DEBUG_PRINT_INT;
        zintix_tpd_flag = 1;
        wake_up_interruptible(&waiter);

    }

     

    中断的时候,唤醒waiter,执行do()while

     

    在补充一点知识:

    wait_event_interruptible 是linux驱动设计中断的重要函数,他有什么用呢?

    1 有什么用?

        就是进程休眠,等待中断:

        用在驱动里面会休眠当前的进程。

    2 两个参数怎么用?

        wait_event_interruptible(queue, condition)

        1 queue 的中断队列里面有对应的中断产生

        在linux kernel 里面 , wait.h 里面有个宏定义 : DECLARE_WAIT_QUEUE_HEAD  就是一个wait 等待的队列结构体

        DECLARE_WAIT_QUEUE_HEAD queue 就是定义了一个等待的队列

     

        2 condition设定条件符合

    然后被休眠的进程如何重新启动呢?

     

    3 如何唤醒

    在中断进程里加入,或者别的进程里面加入

    wake_up_interruptible(&queue)

     

    展开全文
  • wait_event与wait_event_interruptible有什么区别? 最近在项目,被报了一个log,然后就思考到了这个问题: wait_event_interruptible将当前进程的状态设置成TASK_INTERRUPTIBLE。 wait_event将当前进程的状态设置...

    wake_up与wake_up_interrupt有什么区别?
    wait_event与wait_event_interruptible有什么区别?
    最近在项目,被报了一个log,然后就思考到了这个问题:

    wait_event_interruptible将
    当前进程的状态设置成TASK_INTERRUPTIBLE。
    wait_event将
    当前进程的状态设置成TASK_UNINTERRUPTIBLE。
    它们都会被从runqueue队列中删除,不再参与调度,进入睡眠状态。

    如果要被wait_event_interruptible的当前进程有nonblocked pending signals, 那么会直接返回-ERESTARTSYS(i.e. -512),当前进程不会被wait_event_interruptible 和从runqueue队列中删除。

    两者当区别就在于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE。
    可中断的等待状态(TASK_INTERRUPTIBLE)和不可中断的等待状态(TASK_UNINTERRUPTIBLE):
    处于可中断等待态的进程可以被信号唤醒,如果收到信号,该进程就从等待状态进入可运行状态,并且加入到运行队列中,等待被调度;
    而处于不可中断等待态的进程是因为硬件环境不能满足而等待,例如等待特定的系统资源,它任何情况下都不能被打断,只能用特定的方式来唤醒它,例如唤醒函数wake_up()等。

    最常用发送信号的系统函数是kill, raise, alarm和setitimer以及sigqueue函数等,还包括一些非法运算等操作。

    除了wake_up,常见当还有complete,这两个又有啥区别呢?

    completion机制是两个进程间互相同步的工具,而wait_for_event则是让多个进程在一个等待队列上休眠等待某事件的机制。
    completion以一个completion结构体变量为核心,两个进程围绕该变量执行wait_for_completion和complete操作,以达到实现两个进程同步的目的。
    wait_event则是一个一个等待队列为核心,N个进程围绕该队列执行wait_event(将自己加入等待队列)和wake_up(唤醒队列所有等待进程检查唤醒条件是否满足)操作,以达到使进程在等待条件未满足时保持休眠的目的。

    参考:
    completion和wait_for_event的区别
    ————————————————
    版权声明:本文为CSDN博主「风筝丶」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/Guet_Kite/article/details/104052435

    展开全文
  • wait_event_interruptible_locked() interface New wait_event_interruptible{,_exclusive}_locked{,_irq} macros added. They work just like versions without _locked* suffix but require the wait queue's ...

    wait_event_interruptible_locked() interface

    New wait_event_interruptible{,_exclusive}_locked{,_irq} macros added.
    They work just like versions without _locked* suffix but require the
    wait queue's lock to be held.  Also __wake_up_locked() is now exported
    as to pair it with the above macros.
    
    The use case of this new facility is when one uses wait queue's lock
    to  protect a data structure.  This may be advantageous if the
    structure needs to be protected by a spinlock anyway.  In particular,
    with additional spinlock the following code has to be used to wait
    for a condition:
    
    spin_lock(&data.lock);
    ...
    for (ret = 0; !ret && !(condition); ) {
    	spin_unlock(&data.lock);
    	ret = wait_event_interruptible(data.wqh, (condition));
    	spin_lock(&data.lock);
    }
    ...
    spin_unlock(&data.lock);
    
    This looks bizarre plus wait_event_interruptible() locks the wait
    queue's lock anyway so there is a unlock+lock sequence where it could
    be avoided.
    
    To avoid those problems and benefit from wait queue's lock, a code
    similar to the following should be used:
    
    /* Waiting */
    spin_lock(&data.wqh.lock);
    ...
    ret = wait_event_interruptible_locked(data.wqh, (condition));
    ...
    spin_unlock(&data.wqh.lock);
    
    /* Waiting exclusively */
    spin_lock(&data.whq.lock);
    ...
    ret = wait_event_interruptible_exclusive_locked(data.whq, (condition));
    ...
    spin_unlock(&data.whq.lock);
    
    /* Waking up */
    spin_lock(&data.wqh.lock);
    ...
    wake_up_locked(&data.wqh);
    ...
    spin_unlock(&data.wqh.lock);
    
    When spin_lock_irq() is used matching versions of macros need to be
    used (*_locked_irq()).

     看到wait_event_interruptible_locked这个api我内心是迷茫的,不知道这个玩意儿怎么用,搜了下看到了别人的解释如上。

    翻译下:

    因为自旋锁锁定期间不能进入睡眠,那么进入睡眠前就应该释放自旋锁,如果手动操作会比较繁琐,这个接口就是为了统一一下操作,他操作的时候 wait_queue_head_t自带的自旋锁lock,在进入休眠前释放这个锁,然后睡眠,醒了以后再获取到这个锁,这样就是在睡眠过程中自旋锁是释放的状态。

    注意,使用这个函数之前,这个自带的自旋锁应该是先获取到的。

    展开全文
  • wait_event_interruptible和wake_up_interruptible这两个是内核定义的宏 原型: wait_event_interruptible(wq, condition) wake_up_interruptible(x) wq:等待队列,当后面的条件不成立则进程进入休眠 condition...

    wait_event_interruptible和wake_up_interruptible这两个是内核定义的宏

    原型:

    wait_event_interruptible(wq, condition)

    wake_up_interruptible(x)


    wq:等待队列,当后面的条件不成立则进程进入休眠

    condition:判断条件 ,0或非0值

    x: 等待队列,要唤醒的等待队列,即唤醒对应的进程


    当函数中调用wait_event_interruptible后,如果条件不成立,就会一直卡在这里。不会往下执行。反复检查condition是否成立,如果成立则退出,如果不成立则继续休眠;条件满足后,即把本进程运行状态置为运行态(此时如果不执行下面的函数 wake_up_interruptible,上面wait_event_interruptible还会继续休眠)

    展开全文
  • wait_event与wait_event_interruptible有什么区别? 最近在项目,被报了一个log,然后就思考到了这个问题: wait_event_interruptible将 当前进程的状态设置成TASK_INTERRUPTIBLE。 wait_event将 当前进程的状...
  • wait_event_interruptible 与 wake_up_interruptible 深度分析
  • 最近一套方案涉及到内核线程之间的同步,用到了函数wait_event_interruptible_timeout函数,大致是这样: A:是一个后台的线程,平常没事就睡觉,有时被唤醒,或者每5分钟醒一次看看; B:普通线程,负责唤醒后台...
  • Linux驱动中的wait_event_interruptible()与wake_up_interruptible() DECLARE_WAIT_QUEUE_HEAD(wq)   生成一个等待队列头wait_queue_head_t,名字为wq. wait_event_interruptible(wq, condition):...
  • wait_event_interruptible

    2015-07-29 10:18:08
    #define wait_event_interruptible(wq, condition) \ ({ \  int __ret = 0;
  • wait_event_interruptible_timeout函数分析

    千次阅读 2018-02-13 16:08:37
    在intel F10A进行DMA读写操作时,会首先调用queue_work函数将当前work压入工作队列中,然后调用wait_event_interruptible_timeout函数等待DMA读/写操作的完成,在调试的过程中偶尔会出现超时返回的情况。 下面结合...
  • wait_event_interruptible 使用方法 2 .函数原型: #define wait_event_interruptible(wq, condition) ({ int __ret = 0; if (!(condition)) __wait_event_interruptible(wq, condition, __ret); __re...
  • 先看看内核源码的注释,这往往是在研究内核函数必读的一段文字,这将会给...#define __wait_event_interruptible_timeout(wq_head, condition, timeout) \ ___wait_event(wq_head, ___wait_cond_timeout(condition), \
  • 内核中使用wait_event_interruptible和wake_up_interruptible接口函数,来实现内核两个进程之间的交互。 代码实现: /* 声明一个工作队列入等待*/ static DECLARE_WAIT_QUEUE_HEAD(my_wq); static volatile int ...
  • 该函数修改task的状态为TASK_... 在wait_event_interruptible()中首先判断condition是不是已经满足,如果是则直接返回0,否则调用__wait_event_interruptible(),并用__ret来存放返回值---------------------...
  • wait_event_interruptible souece code #define __wait_event_interruptible(wq, condition, ret) \ do { \ DEFINE_WAIT(__wait); \ \ for (;;) { \ prepare_to_wait(&wq, &...
  • 1.原型  #define wait_event_interruptible_timeout(wq_head, condition, timeout) \ ({ \ long __ret = timeout; ...
  • 函数原型:wait_event_interruptible_timeout(wq, condition, timeout) * 函数作用:~睡眠~,直到condition为真,或timeout超时; * @wq: 要等待的等待队列 * @condition: 等待事件发生的条件(一个C表达式 ) ...
  • 1. 关于 wait_event_interruptible() 和 wake_up()的使用    读一下wait_event_interruptible()的源码,不难发现这个函数先将 当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(), ...
  • 1. 关于 wait_event_interruptible() 和 wake_up()的使用    读一下wait_event_interruptible()的源码,不难发现这个函数先将  当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(),  而schedule...
  • wait_event_interruptible_timeout和schedule_timeout的区别 当在某个硬件驱动程序中使用wait_event_interruptible_timeout时,执行的继续可以通过以下两种方式获得: 1.其他人在等待队列上调用了wake_up 2.超时...
  • wait_event_interruptible(wq, condition),该函数修改task的状态为TASK_INTERRUPTIBLE,意味着该进程将不会继续运行直到被唤醒,然后被添加到等待队列wq中。 在wait_event_interruptible()中首先判断condition...
  • 1. 关于 wait_event_interruptible() 和 wake_up()的使用    读一下wait_event_interruptible()的源码,不难发现这个函数先将  当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(),  而schedule...
  • wait_event_interruptible说明

    千次阅读 2014-09-15 14:12:40
    #define wait_event_interruptible(wq, condition) \ ({ \ int __ret = 0; \ if (!(condition)) \ __wait_event_interruptible(wq, condition, __ret); \ __ret; \ })

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 198
精华内容 79
热门标签
关键字:

wait_event_interruptible