你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32之FreeRTOS(十):任务通知模拟事件标志组

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

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版