系统正是有了休眠才有了高性能,否则就像单片机一样,做死循环等待,导致性能下降。就像现在的CPU类似高通的,我曾经干了一件蠢事,故意while(1),发现CPU很烫了。可怜

linux中提供了众多的休眠机制,waitqueue是一种机制。当我们使用休眠是,需要注意以下几点:

1.对于有休眠的代码段中,不能有类似spinlock,seqlock,或者我们调用了disable_irq_save()禁止中断的操作

2.在拥有休眠的代码段中,要确保当信号量有使用的时候,要保证我们的进程有别的进程去唤醒。否则会导致想用的这个信号量锁住的设备无法使用,也导致想使用这个设备的进程也会休眠。

好,讲用法。

@1:包含头文件

Wait.h (include\linux)	

@2:静态定义一个等待队列

DECLARE_WAIT_QUEUE_HEAD(name)

#define DECLARE_WAIT_QUEUE_HEAD(name) \
	wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
 或者使用动态的方法来初始化队列

wait_queue_head_t name
init_waitqueue_head(name)
@3:

休眠进程调用以下几个函数

wake_up_interruptible(wait)

wait_event(wq, condition) 
 wait_event_timeout(wq, condition, timeout)
wait_event_interruptible(wq, condition)	
wait_event_interruptible_timeout(wq, condition, timeout)
但是建议使用以下几个

wait_event_interruptible(wq, condition)	
wait_event_interruptible_timeout(wq, condition, timeout)

其中wq是定义的wait_queue_head_t类型变量,而condition是一个表达式,假如我们想要加入timeout的话,使用第二个,加入这个参数的的类型是以jiffies为时间单位的。

@4:如何唤醒这些个等待队列的,有以下几个函数

wake_up(x)
wake_up_interruptible(x)	
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">其中x是定义的等待队列wq。</span>

用法是对应的,当使用

wait_event(wq, condition) 
就使用以下函数唤醒

wake_up(wq)
当使用

wait_event_interruptible(wq, condition)	
就使用以下函数唤醒

<pre name="code" class="cpp">wake_up_interruptible(wq)

 下面具体讲解一个流程及用法 

wait_queue_head_t wait;
init_waitqueue_head(&wait);
wait_event_interruptible(wait,audlpa_events_pending(audio))
wake_up_interruptible(wait)
其中condition是一个函数,通过返回值来确定condition是否满足条件。


Logo

更多推荐