一般使用步骤是:
( a$ o1 b1 _* e7 x3 P' |7 g: Z1、发送任务通知- ~4 p; {- I# z7 K' z, Y
2、获得任务通知值8 N, I: L% R! S. d
( M& F$ D: J% M; L3 g* \
第1步:发送任务通知
3 ^; {1 F& M: q( _- % s( ?: M5 h( S; O6 Y3 _) L
- 6 \! X: x) n: V, ?& z
- #define EVENTBIT_0 (1<<0) //事件位9 E- r: t8 h2 f+ `( s% Q2 J( ~" r
- #define EVENTBIT_1 (1<<1)
, x3 k5 V0 r \ - #define EVENTBIT_2 (1<<2)
8 Y6 T8 U1 z6 F @& v6 z* m! k9 d - 7 r" y8 Z6 X9 Q* P
- if(EventGroupTask_Handler!=NULL)/ ^4 v; }5 S& c5 x [# }
- {
; c5 V" M O, W7 T3 ]& f - key=KEY_Scan(0);% b& z) q% `, |% t# l* ]% }1 z9 q
- switch(key) n4 y& ?) ~9 u) D9 p
- {
8 j0 Y, q) P" p; K - case KEY1_PRES:
& y. `0 @0 G" A - xTaskNotify((TaskHandle_t)EventGroupTask_Handler,
2 W( \3 P E# R( r$ S) M - //接收任务通知的任务句柄
0 P. P$ Z9 V0 v% \5 N - (uint32_t )EVENTBIT_1,
* l! {9 G" e% ]* [/ \ - //要更新的bit
: M; M" D5 I2 g - (eNotifyAction )eSetBits);
* k2 z4 X* ]& e - //更新指定的bit! X% K& {( B) f
- break;, l" G" `! P* C( x Q
- case WKUP_PRES:1 [' G. } h% |* {1 u+ ^$ _
- xTaskNotify((TaskHandle_t)EventGroupTask_Handler,3 u8 f3 W3 ~9 E
- //接收任务通知的任务句柄+ s8 K- V: H( T/ @
- (uint32_t )EVENTBIT_2,
/ }0 g' }6 K( g q, ^ D - //要更新的bit
% _" `0 ]+ F0 |7 i* D' l - (eNotifyAction )eSetBits);
4 ^! z# [& Z5 U/ k/ j) O4 Q - //更新指定的bit
- n1 s9 A0 B# i - break;
/ F; U% N; f* l, K" R - }. m) m4 [$ N$ v, Z. ^: S. w9 O3 u
- }
复制代码 ( `: r8 P" U$ m9 _5 _0 j6 D
第2步:获得任务通知值6 [4 e6 E4 c% Z+ ~* E
- & g, c% d, B8 f9 \8 S! ^5 D
- u8 enevtvalue;
$ C2 j0 W1 e M! L9 V3 y - static u8 event0flag,event1flag,event2flag;
. ?7 k! W1 q% q" T; { - //获取任务通知值( z* z7 r6 x5 w( }* \
- BaseType_t err=xTaskNotifyWait((uint32_t )0x00, ( L8 [; v( B. `9 V
- //进入函数的时候不清除任务bit& X( W5 q$ S6 s$ z! Y& J
- (uint32_t )ULONG_MAX, 6 e2 o0 x" g0 I; n2 ` N
- //退出函数的时候清除所有的bit
6 _4 B6 }. }& I" T - (uint32_t* )&NotifyValue,
3 h Z1 L b+ s! A$ l+ e - //保存任务通知值* Z' c$ e2 j$ f; E6 @
- (TickType_t )portMAX_DELAY);
u7 c# W D" c; n - //阻塞时间3 a3 W( m" k8 x+ e/ i# a
-
6 M6 P2 I1 J6 ^- j - if(err==pdPASS) //任务通知获取成功进行相关处理. \, s1 k. N, j5 O5 S+ d0 k
- {
# X/ n/ o- O' n - if((NotifyValue&EVENTBIT_0)!=0) //事件0发生 - n' b+ z' _$ x9 t! N% J1 U6 H
- {
H; O ?' O! L5 Y( Z ^! P- B# Q - event0flag=1;
3 {6 {! L. x4 U( s - }
: g, y7 V R$ R8 R5 l& X' H - else if((NotifyValue&EVENTBIT_1)!=0) //事件1发生 ! k J) W6 K' X
- {- b" s8 q4 Y5 A2 g( m) k7 h
- event1flag=1;$ ]" c$ l( _# L/ w$ r+ F
- }- {3 C1 \- n( e) K; s4 ^* J
- else if((NotifyValue&EVENTBIT_2)!=0) //事件2发生
Z1 l8 F/ C! w( _: G - {
. A, U& B7 [- J/ `$ N0 V% K* T - event2flag=1;
: ?/ ~# C& b' k; f3 U - }
b/ i' z5 g. f - ; U* G% s7 d. o+ {
- //模拟事件标志组值
( x2 n% ?0 N" z8 B - enevtvalue=event0flag|(event1flag<<1)|(event2flag<<2);( z" q- S% {7 k$ }! O) d) z" e
- . Q( K2 ?3 v0 e& U6 z
- //user code
' h" w% c8 `3 ]6 f' I+ _! u* G- M - //用户根据enevtvalue做出相关动作
+ G" a) v. x- n+ m5 { -
9 H3 s: m, v( N: i- h0 o
复制代码
/ p, L) G" q# E. v$ C总结/ p0 \( l5 n; b6 E% ^& S$ E4 N
以上是任务通知模拟事件标志组的常规用法。
' d- ?. s+ ]( y' [: `: U
6 n4 b% e! T* z; o, s1 p
m, \2 T9 T8 }! \! I# G4 n5 p _( G9 q3 f: z6 |
|