一个任务需要等待某一事件的发生时,通常调用wait_event,该函数会定义一个wait_queue,描述等待任务,并且用当前的进程描述块初始化wait_queue,然后将wait_queue加入到wait_queue_head中。函数实现流程说明如下:( J2 @5 I9 [) A1 n
3 ~; s0 d, j) t0 E
1、用当前的进程描述块(PCB)初始化一个wait_queue描述的等待任务。
; f' z, l* o/ n. C& n- `
! a2 `' B) Q! o5 O7 k 2、在等待队列锁资源的保护下,将等待任务加入等待队列。
0 ^5 Y; x4 s. x6 h / ?/ |4 L( ]3 g: M1 Z) n
3、判断等待条件是否满足,如果满足,那么将等待任务从队列中移出,退出函数。
2 \$ M' U; H5 |. k' l0 t
; x0 L; a, G) z 4、 如果条件不满足,那么任务调度,将CPU资源交与其它任务。1 Q+ ~$ b9 D" b6 P
: Q! Z" O1 T$ S" l4 E
5、 当睡眠任务被唤醒之后,需要重复(2)、(3)步骤,如果确认条件满足,退出等待事件函数。
1 Q. ^% x4 W7 V" v$ b9 F6 J5 L% T ! n* _+ V0 D2 I, b& A$ e+ a. {
等待队列编程接口</p> 1' Q- }+ O0 j: n
7 b' a/ L# l: r/ {1 n wait_event
" T% T Y* m: ? ! {4 ?" G' u- u- g# a: R
这是一个宏,让当前任务处于等待事件状态。输入参数如下:% G m+ r& h+ P: t$ b
- J% ]- n0 ^% A# G @wq:等待队列( r5 _) [' v& Z2 G
. D3 i& { Y3 [& d2 @ v
@conditions:等待条件 [! ^+ e( Y, _
) q$ S+ H' e* \' a$ d/ j
2
0 D6 {1 Y% ~0 ^ 6 }" c5 `& X* G! F+ D% B& i( b
wait_event_timeout* C a1 [! X$ @ M! }# _
! | K" P; ]. k) N$ |+ k 功能与wait_event类似,多了一个超时机制。参数中多了一项超时时间。
2 @0 `4 r1 x& R' Q4 K
2 N4 ~9 [0 m- ~( u, C 3
( Z9 v. J4 n# E. m- V0 r) j0 y 8 m5 h* g0 |" U% Q) `' Q
wait_event_interruptible3 ^; G1 E. O# U6 T5 k; ?
; B- h8 P8 I% h+ @* {- ` 这是一个宏,与前两个宏相比,该宏定义的等待能够被消息唤醒。如果被消息唤醒,那么返回- ERESTARTSYS.输入参数如下:
9 J" }2 s2 F: T3 [7 F# W 7 Q! T$ p9 ~2 I+ u \- V1 G5 P {
@wq:等待队列
8 i- ~9 U' N* U* _$ ] + c0 v* l- e/ p: z& I' {# b
@condition:等待条件4 l0 ]5 z. C1 Y8 c( O2 N
9 l1 ~. @. k4 t( r) V
@rt:返回值" `8 J9 C9 t5 L% O3 ?
' I. [; L4 G* P9 K 4
7 l# W2 X6 U4 i / l7 V) e1 H4 Z" [
wait_event_interruptible_timeout- Z$ Q, x; k/ h1 {
7 T2 J2 Z F# @4 Z& H2 K 与(3)相比,多了超时机制( E) w% Z' I( X1 }9 }5 P
5 v/ V# }; b, ~1 g. V$ _" ~ 5
9 x0 s7 l, \0 F2 u8 U7 L! t
+ V6 b) h' r2 h wake_up
& N# x$ w% d: v7 }3 n+ ?' I
, |! i- c* f1 s" y6 C4 n3 y 唤醒等待队列中的一个任务
5 }: u+ T9 S' T
& i/ M) Z% a* R, H, [; R0 G 69 ]' q5 L1 ~! P9 T5 u/ ~
, s3 {. \- A6 c. ], I h
wake_up_all
~2 ?4 g2 A+ ~( j. T; ^
$ \. X' d0 o' `6 S4 m g 唤醒等待队列中的所有任务 |