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

【经验分享】STM32G0学习手册——FreeRTOS任务通知

[复制链接]
STMCU小助手 发布时间:2021-11-14 22:04
概述
& e- E& n6 `- r        每个任务都有一个32位的通知值,可以替代二值信号量,计数信号量,事件组,也可以代替长度为1的队列。
4 |6 ?+ K3 w/ S# v+ ]/ ?* g4 g8 N
2 }. ]. i9 p6 V        有以下几种方式发送通知给任务:. e0 r, u# n$ p% w3 X
0 p6 ~0 Q9 J0 a9 I5 v9 X0 p* C
1.有通知未读,则不覆盖通知值, K1 W5 w& E9 B, |4 |
% I; J& ~  {/ f6 W/ [4 g
2.直接覆盖通知值
/ x& y$ ^4 S2 [! r2 {) r( h: {) P0 o
3.设置通知值一个或者多个位,当做事件组来使用' C! A# `3 I5 P. m0 l  {

6 h: m1 }( a# ]: P4.递增/递减通知,当做信号量来使用. a5 d) r/ y( e+ K5 p# u* D

5 j7 }0 W' k+ A5 K& e' E4 Q" P        有以下缺点:% M) E3 {" r8 z5 G
" p6 G' U& t5 N" c: v
1.只能有一个任务接收通知消息
% Z! b; r8 t0 Q
9 Q2 f7 Y9 N* i7 _4 Z* k5 S2.只有等待通知的任务可以被阻塞,发送通知的任务都不会因为发送失败而进入阻塞。9 d: {/ I$ P) @
6 N( A, H4 \3 a" o3 _
代替二值信号量
7 v" U; J+ l+ k2 l在FreeRTOSConfig.h里开启任务通知1 B, o: \0 W4 y( g; j
  1. /*Turn on task notifications.*/0 Q2 J6 I, u5 |; t. ~$ l0 y: e
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码
" G( h( P! H) k  ^7 x( v. p
在main.c文件里面修改代码
$ z6 w, g0 x) Q% Z8 f4 K
6 G+ n( n( H8 K5 ?7 G
  1. /* USER CODE BEGIN Includes */
    # f/ p* s3 P) E, _$ T! z
  2. . A, g) ]- u; g2 |/ T: q+ ?+ A
  3. #include "FreeRTOS.h"
    6 F7 q$ p' H9 o& G/ z: Q
  4. #include "task.h"1 X; J" a3 C* `+ Y6 c( Y' C
  5. #include <stdio.h>! L5 ~- s1 l8 y& m# v2 ^' n
  6. #include <string.h>3 ^' L0 I9 i  H3 N/ E8 R- E

  7. . ?3 X4 t* X$ u2 E" y* x
  8. /* USER CODE END Includes */; w, ?5 j' ^# z: @  ]8 l/ Y

  9. 8 V- r, a" x) L7 Q$ }$ ?5 j6 L3 m4 `
  10. /* USER CODE BEGIN PV */
    , s4 S6 j6 l* w0 O4 ^
  11. static TaskHandle_t AppTask_Handle = NULL;- Z9 G6 u- _, x, X& w6 }% k
  12. static TaskHandle_t KeyTask_Handle = NULL;! F& o6 r  t/ \( K4 C3 @: m
  13. static TaskHandle_t LedTask_Handle = NULL;
    , e' \/ E2 G/ @: S" I

  14. ' C, k9 @* I1 i
  15. extern int f_printf(const char *format, ...);
    ) y8 P3 d$ W/ ~9 f8 ^8 |$ v' E! ~
  16. /* USER CODE END PV */
    9 w% [, U4 V( m. ]
  17. ; p; V. z0 Q& F" ~/ N
  18. /* USER CODE BEGIN PFP */
    # B% k/ D- `' g# O+ S6 P
  19. static void AppTaskCreate(void);5 Q- N8 u% F" O0 z2 \7 Y
  20. static void KeyTaskCreate(void);' G, j' `1 y& I* R. o* R( u; }! V
  21. static void LedTaskCreate(void);
    2 q2 R, B5 w# E, y, o+ a
  22. /* USER CODE END PFP */
    1 \4 F# D8 `$ L' e$ m2 Z7 j
  23. ; O, j- j+ a- Z% u( }7 p
  24. int main()+ G5 w% K4 C  s* k
  25. {
    + v3 |4 y5 V0 I6 p$ ~3 r" D- d% e7 X

  26. ! t8 ^; S$ m; u$ }! }  N
  27.   /* USER CODE BEGIN WHILE */8 V% K+ q$ f4 C3 k8 y0 G
  28.   BaseType_t xReturn = pdFAIL;
    " {+ c  T% }" d+ O$ U" w
  29.         
      B1 p7 k/ Y5 \  B; j% W
  30.         xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
    # {, r" L- A1 k! }: a& F" C; p' O
  31.                         (const char*)   "APPTASKCREATE",
    9 U2 u& D# S. v- |: W
  32.                         (uint16_t)      128,0 C5 k- x! H2 J( |
  33.                         (void *)        NULL,
      Q% Y9 Z; K& p) x% H/ M6 O
  34.                         (UBaseType_t)   1 ,5 q* q) G3 A$ K7 ]# O0 H
  35.                         (TaskHandle_t*) &AppTask_Handle);8 g' B2 c" n' ^1 b# W9 T! m
  36.         
    % }3 }, r, [2 u4 \1 M& S
  37.   if(xReturn == pdPASS)2 D# r5 a- i# q2 q2 Y
  38.         {; u! ~$ A& Y, s) g! |' Y$ N
  39.     f_printf("AppTask Create PASS.\r\n");
    ; `8 v! ~9 e( @0 M) p  L
  40.                 vTaskStartScheduler();. b* c, m" q+ Y: a8 b* D5 S0 f
  41.         }
    ( v: Q$ ^" f4 Q/ u% m% A8 K" M
  42.                                                                                                 
    ; y) o: ~9 T! h  l' g' v5 N/ L
  43.   while (1)
    ' ]9 D7 q3 K0 n( b
  44.   {
    + h3 h) O! Q# N; x: Q# N
  45.     /* USER CODE END WHILE */% O+ {& e4 _' }7 q  l, h& J
  46.     /* USER CODE BEGIN 3 */
    9 m( w7 p$ M, D( ?; W5 q/ m8 Q3 f
  47.   }/ r9 m" t& e  w; @. s: I" S
  48.   /* USER CODE END 3 */
    ' o3 B# O4 T0 Y# p8 P9 U
  49. }$ u+ e( b4 z# U# V: }" b7 H, Y5 h
  50. 4 {$ T0 h& s2 {& I% K
  51. /* USER CODE BEGIN 4 *// @& J6 W: w5 [- h. X
  52. static void AppTaskCreate(void)
    / S: j5 k' P( p, c, p) O
  53. {
    / K& x) O( |( d4 @! Y5 @
  54.   BaseType_t xReturn = pdFAIL;: i# K; o. j: y3 j, j6 _

  55.   B7 [' O* y1 L! F8 j2 G; O& N
  56.         xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,( j$ p: f" _( O6 @
  57.                         (const char *)  "LEDTASKCREATE",3 _" |) ~7 Q  D7 s7 U: S; Z: q8 ?8 Q
  58.                         (uint16_t)      128,
    , ?3 O3 E% m4 |* k( [5 A. F% H- Z
  59.                         (void *)        NULL,
    3 g! U0 g3 m+ \& x
  60.   /*If the priority here is the same as the key task, printf will not print it out.        */! F( {2 A  X: I- k, T) o
  61.                         (UBaseType_t)   2,      
    & Q( G! p! M+ X! P9 F# w7 C! w/ B
  62.                         (TaskHandle_t *)&LedTask_Handle);
    1 b1 w9 d0 H/ O: \8 {, n
  63.   if(xReturn == pdPASS). x7 ?- h8 \  ?% G& X  j. C& ~; ~
  64.                 f_printf("LedTask Create PASS.\r\n");
    , A% ~( O( k8 R( e' E, h4 O
  65.         ( |" K! j, a- p! _  `" q6 C: D
  66.         xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,5 z0 H* }0 S4 y9 ]- i; S6 O' ]
  67.                         (const char *)  "KEYTASKCREATE",8 s" V7 _5 W; D1 c3 n7 v9 M
  68.                         (uint16_t)      128,2 K2 u% z' f. U; \
  69.                         (void *)        NULL,+ T, b, x+ l6 F" r9 c1 p
  70.                         (UBaseType_t)   1,
    ; J6 H: M- K% D! J! @
  71.                         (TaskHandle_t *)&KeyTask_Handle);) l7 P2 I  p9 B7 ?
  72.   if(xReturn == pdPASS)3 c7 n3 k1 M: _7 X5 S. W7 Y3 x
  73.         {
    : ^$ [4 G- ~! O/ U0 @6 T, V; o0 V6 Y
  74.                 f_printf("KeyTask Create PASS.\r\n");, I5 `* S: A0 I
  75.     vTaskDelete(AppTask_Handle);3 ^' `; K/ U: S8 C  n( M9 _
  76.         }6 ?) J. k+ |; @
  77. , Y/ M, s5 L' ]: E2 N3 g
  78. }
    * |$ T: X8 }8 Q( O6 K6 y7 A
  79. static void KeyTaskCreate(void)7 J5 `+ Z% X$ m9 ^3 |: \( w
  80. {
    - Q. Q% T$ \% S. ^$ H6 s8 g. V
  81.         while(1); L% K3 A. E) s0 g+ d- q
  82.         {; {7 G4 w4 n6 }) K& t4 s
  83.     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    % Y# R5 M9 v, p$ ]& \
  84.           {
    , ~. R6 X+ T! T0 e: b
  85.       vTaskDelay(50);' a7 H2 Q$ E6 C9 }+ q5 d
  86.       if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    1 a+ B* j; X, ~+ R' g2 P
  87.                   {# t$ g2 ?( X. k  d0 u
  88.         xTaskNotifyGive(LedTask_Handle);& z" X' }1 K6 }; g; J
  89.                           f_printf("Give LedTask_Handle PASS.\r\n");9 u9 [1 P/ X% s& `8 n
  90.                   }
    . \! Y; i2 I+ z
  91.           }- s/ F1 @3 _5 ^, l
  92.           vTaskDelay(100);' k  c7 [; Z3 p: Y8 X- G
  93.   }9 W  g. H" v3 D8 P- X
  94. }
    ) O$ e* u4 e) |, @8 o
  95. static void LedTaskCreate(void)
    - y1 x7 M1 u7 g, T' x: X
  96. {
    ! n7 Y* [  N% s. G- m, K/ G# O
  97.         uint32_t ulreturn=0;2 c2 E' M, x; G" R1 A: Z0 Z: j
  98.         while(1)
    $ {" b+ \, Q5 F" A
  99.         {' P9 i1 S% _+ o- I9 Z! x
  100.                
    7 K2 P- L$ T! z0 D& [
  101.     ulreturn=ulTaskNotifyTake(pdTRUE,portMAX_DELAY);& Q2 Z0 y5 ]) n
  102.                 if(ulreturn==1). f( o4 H  {4 s' Q2 h. Z0 G- B
  103.                 {
    2 m& `2 t! W7 t9 `+ X2 e
  104.                         /*It won’t be printed out at the same level*/, I5 A& H6 z2 p9 n  r' g, y
  105.                   f_printf("LedTask TAKE PASS.\r\n");9 Y: C  j- K! D2 n. Z" {
  106.             HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
    1 J. @* c) m. P
  107.                         2 z! `- P: S( S
  108.                 }1 G$ F5 [( ?. D- F( X" R
  109.                 else
    6 D3 |# q0 c& H
  110.                         f_printf("LedTask TAKE FAIL.\r\n");) V! g% S+ D# S& {
  111.     vTaskDelay(100);
    " W( O9 c  A: m
  112.   }
    9 u  P0 v2 D% r$ V" x# D: u' ^
  113. }
    ( f; m1 Q' `$ J
  114. /* USER CODE END 4 */$ l1 k8 Z, E/ R' s' ]7 g6 d
  115. 代替计数信号量
    4 K  M; ~% }0 ~3 `. G9 D, _) ]
  116. 在FreeRTOSConfig.h里开启任务通知7 S) `2 v9 r# Q% A5 E# c

  117. : \' ^+ ?1 T5 f+ Y; _' ?4 u
  118. /*Turn on task notifications.*/
    : [& B. g. O3 k8 K* L  a
  119. #define configUSE_TASK_NOTIFICATIONS      1
    ' Z' v9 r; T6 W
  120. 在main.c文件里面修改代码
    5 Q& f! b( T! G( S
  121. 3 x* ^: k$ i$ v  h# P* L
  122. /* USER CODE BEGIN Includes */$ T! Y6 l7 Z6 r
  123. ' P8 W$ b8 {8 \. s5 e- M/ l9 s
  124. #include "FreeRTOS.h"
    $ T7 {8 {6 N% ?3 v3 _
  125. #include "task.h"
    4 @% E8 X& q+ D
  126. #include <stdio.h>
    / K- p' @. E; n
  127. #include <string.h>
      A/ H: t3 r8 d. D

  128. " B1 Q# l  I- e; D/ N5 N
  129. /* USER CODE END Includes */
    , H7 R  L* z% u2 S1 j; ~6 x& U' m5 r

  130. * \6 A5 Q. [  ?8 @( K' j% ?
  131. /* USER CODE BEGIN PV */2 e! Z1 [! x7 r+ _  s
  132. static TaskHandle_t AppTask_Handle = NULL;
    1 T/ t, h& f4 t
  133. static TaskHandle_t KeyTask_Handle = NULL;
    + R1 m: z" M! _% [3 G  N! U9 y! t
  134. static TaskHandle_t LedTask_Handle = NULL;0 T# ?0 k4 t1 b! R# M
  135. , j# F* @5 j5 l: @7 F8 Z; D; G. V
  136. extern int f_printf(const char *format, ...);
    5 U- ~  |' I+ O1 M
  137. . G* p- T5 n. ^' f/ j. K0 Z
  138. /* USER CODE END PV */- f& N1 V6 `" j, C

  139. , P( D3 w  @3 n4 G
  140. /* USER CODE BEGIN PFP */2 B7 F. `  P4 Z/ \; q! P
  141. static void AppTaskCreate(void);
    " O# C7 a& L' I
  142. static void KeyTaskCreate(void);+ V1 M& `+ |- [  `7 l8 ~
  143. static void LedTaskCreate(void);2 e# p( H' _9 }9 {8 F/ T
  144. /* USER CODE END PFP */! D* T6 j! b! C: h0 j/ w, Y4 K+ {7 W
  145. - V7 H# u& [' E8 ]+ H# |
  146. int main(), G5 V8 M' F* l* x
  147. {
    6 i5 M2 s1 s: Y3 y0 }/ A3 O" z/ i/ M
  148.   /* USER CODE BEGIN WHILE */
    7 R$ S3 z8 c% B' i( I
  149.   BaseType_t xReturn = pdFAIL;        6 X% g! G5 m) h" F/ P- T  s

  150. 2 K+ u* I" a, G, l
  151.   xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
    - t- v0 i3 r+ ~& O* t9 L
  152.                         (const char *)  "APPTASKCREATE",
    1 u( M! i- o1 `5 E
  153.                         (uint16_t)      128,
    7 b; w) C' K/ o$ ?
  154.                         (void *)        NULL,
    % U, X  g/ {2 J' p$ [
  155.                         (UBaseType_t)   1,5 o1 D0 u0 G2 d) Z0 M
  156.                         (TaskHandle_t*) &AppTask_Handle);
    3 }5 }" Q2 B# w9 Q7 d

  157. 3 B$ i- ?" V5 _& F3 O
  158.   if(xReturn == pdPASS): [, U: d6 b$ t4 D9 a$ S1 n3 p
  159.         {
    * X' D7 ?$ z- c
  160.     f_printf("AppTask Create PASS.\r\n");& P' q% s8 f5 Y! x' o7 [) I
  161.     vTaskStartScheduler();
    4 G' ]) J  @) J8 t/ {
  162.         }
    2 G( Q  ?8 V% B  g2 R9 l- I) R, q
  163.   while (1)$ d$ r4 C' o, J2 F8 e/ M# P; C
  164.   {7 Q$ F6 y. u7 @2 K' N" w
  165.     /* USER CODE END WHILE */
    & H& k  x9 Q+ q9 \+ F+ Y9 Y

  166. 2 W7 ~2 u4 G1 y4 X, t. K; ]
  167.     /* USER CODE BEGIN 3 */
    : c5 z1 l; P( g; r& \8 L
  168.   }3 L. q6 K2 W" ]% p% F& g. j' B
  169.   /* USER CODE END 3 */) S9 i' ^8 Q  a2 N4 b# V$ H
  170. }% o6 ~9 n. `% W  d( q$ B) D, |9 h
  171. , @: [$ g; R4 K- S% x2 j5 {
  172. ! I2 Y7 {# k& ~& N- T" q
  173. /* USER CODE BEGIN 4 */
    . j  t# O  w* ^. P$ d
  174. static void AppTaskCreate(void)
    4 m$ }8 \! h' W9 ^7 Y
  175. {0 N. m2 j+ x" ~, p+ H
  176.         BaseType_t xReturn = pdFAIL;
    % |4 x; i7 b4 t9 b' r/ d2 N* R. Y

  177. / u6 |$ a$ y& D0 k1 O$ k
  178.   xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,
    5 g* p  s1 s5 a. L, v
  179.                         (const char *)  "LEDTASKCREATE",
      ~0 X" U# F4 x9 W$ ^' B+ Z
  180.                         (uint16_t)      128,  [- @% c9 ^) @6 {  @9 W# W+ S
  181.                         (void*)         NULL,! S) ?+ Q; m, ]7 B/ r% N8 D
  182.                         (UBaseType_t)   1,
    1 }$ b. g1 @- B9 j  ]' f
  183.                         (TaskHandle_t *)&LedTask_Handle);% C+ |6 ^0 L. o( x! X& B
  184.   if( xReturn == pdPASS)' `9 X4 z1 }- D6 E, D# G. C6 N$ `
  185.           f_printf("LED Task Create PASS.\r\n");
    2 ]- v+ s. P0 e7 f  T, A( h
  186.         ; \1 a- A6 Y  g" P' Z* ~
  187.         xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,/ O5 s: E( {9 F! ~8 P* o/ V9 }
  188.                         (const char *)  "KEYTASKCREATE",
    " L- w5 \. E8 Q* }2 `* e  p
  189.                         (uint16_t )     128," V. P7 V/ Q- Y8 H# s- a" g7 j
  190.                         (void *)        NULL,
    9 v0 I# z) O7 V- U
  191.                         (UBaseType_t)   2,' `' M# ?- @% O: @0 \
  192.                         (TaskHandle_t *)&KeyTask_Handle);* W" ^3 u+ @5 k. W8 u6 K7 q
  193.   if( xReturn == pdPASS)
    3 {3 N. ?& d5 G6 B" ^9 K
  194.         {8 }3 B, K; H4 w7 [4 y
  195.     f_printf("KEY Task Create PASS.\r\n");/ Y/ D: ]4 W* y2 }: g! _( U$ m
  196.     vTaskDelete(AppTask_Handle);: {' Z2 M. V+ R- K! ^( e
  197.         }! H5 q- o+ o6 j% r  J* N* |# r% q
  198. }
    + A9 B/ F6 p8 N% P1 t3 O$ `
  199. static void KeyTaskCreate(void)
    / q" y# i1 _  A: A0 Y1 M4 O
  200. {. t% Q$ l0 Y7 D& r
  201.   while(1)3 r/ R7 E: R7 t1 h3 M8 K3 H2 j
  202.         {% C6 Q) h  N- _7 R4 p$ o/ h' j! _
  203.     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))$ |: c9 o' o8 \* q8 D) k. |6 l
  204.                 {9 [3 r) I/ }0 W% {8 m. s
  205.                         vTaskDelay(40);% e- g7 m# p3 D. ?* N% F: U
  206.       if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
      {5 l$ [9 Z9 O3 B- ?0 N! V! z/ U
  207.                         {) N: n& n0 [" o; q9 I) T
  208.                                 xTaskNotifyGive(LedTask_Handle);
    / C6 u( s8 p. ~
  209.                                 f_printf("LED TASK GIVE PASS.\r\n");
    ! S/ m: x4 H4 n3 X
  210.                         }, P$ |6 |4 y( U! [0 J" c" O
  211.                 }: y, G" m3 w  X% a0 h
  212.     vTaskDelay(40);2 ~, d0 H' I  v- M$ W+ ?& Y
  213.         }6 L$ @: ?( u9 c* ]/ w7 u% b5 u# t
  214.                
    7 p/ D4 f; e" o1 `
  215. }
    2 J' x3 C1 C$ L6 q- l; ^, N% Z
  216. static void LedTaskCreate(void)
    $ L* i7 b0 n* e
  217. {
    ' i+ e/ |6 Z" v& d6 @
  218.         uint32_t ulValue = 0 ;$ Q1 O  x; U# B/ U+ Q' t* A+ X; i- @7 g
  219.         while(1)
    8 s2 D# O% O- _* U; [
  220.         {/ X$ y: ~. t2 ^/ y! F
  221.     ulValue = ulTaskNotifyTake( pdFALSE , 0);& Z$ K6 S. l9 J5 C1 H1 o
  222.                 ( P& B$ A3 W( f
  223.                 /*Greater than 0 proves that there is still a notification value that can be   D/ ]$ ^* d( {7 e8 t0 A0 w4 i
  224.          *reduced by 1. Equal to 0 indicates that no notification is available
    * T2 y5 F( @8 s
  225.          */
    2 f( h$ L. t$ ~; Q
  226.                 if(ulValue >0)3 D, A: U7 S! ]: N/ m# K7 Y
  227.                 {4 H( s9 w: P+ Q- l# t0 {& n9 I
  228.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
    . T# P/ `" }3 G" n; G
  229.                         f_printf("LED Task PASS.\r\n");
    ' ]! E6 P3 p! V, Z$ c
  230.                 }                ) \3 x$ F. G4 e! Z5 ^3 j
  231.                 vTaskDelay(1500);
    1 E5 [7 L0 n% X; I
  232.         }
    $ u3 Q7 x( l: h0 E- p9 |* r( `
  233. }
    8 i& Y0 Q  G4 L+ n/ B  b! {5 x
  234. " C9 N8 ^7 {$ G0 I
  235. /* USER CODE END 4 */
复制代码
4 F: V4 |$ `, c6 i8 |% h: p
代替事件组6 U+ z/ c* M1 N7 \; t5 N- e( H
在FreeRTOSConfig.h里开启任务通知3 `- I$ K/ _7 b# n% a: c7 A
* ?& L, |" c  f) s+ j7 ]8 |+ Q
  1. /*Turn on task notifications.*/
    & l: W8 f3 \( ^/ n- U# a
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码

* t& ~7 U! I/ C1 v5 O# p! d9 x' k/ I在main.c文件里面修改代码5 `" E9 C: ^9 z
% e# n! x6 Q+ ~$ O  z& N5 ?8 H
  1. /* USER CODE BEGIN Includes */! G, K' x/ ]: W. @% u8 Y
  2. # z, K% k1 t2 L/ r! G
  3. #include "FreeRTOS.h"
    6 t, W& Y. Y; L/ {7 C; D
  4. #include "task.h"
    + n9 ~7 Y, V5 U" k& Y
  5. 0 B4 s0 E  a3 m" q
  6. #include <stdio.h>% e1 ?. G: L% V! j0 }( F
  7. #include <string.h>  y. B& l1 |2 K* Y2 ^3 d
  8. 4 j% ~3 b+ p: T  Q. l) S
  9. /* USER CODE END Includes */
    2 o8 o# w, |+ @5 T
  10. 3 Z, T3 n4 w2 n4 ~/ ^& b
  11. /* USER CODE BEGIN PV */: |1 h$ V# N* o. N* n6 q
  12. static TaskHandle_t AppTask_Handle = NULL;
    5 e1 ~% D+ Y' B* _
  13. static TaskHandle_t KeyTask_Handle = NULL;
    % I0 X5 X& w8 f4 ]; f  d
  14. static TaskHandle_t LedTask_Handle = NULL;
    , S/ o7 ?/ D& W$ i( @

  15. * t. A5 R* C# @4 b5 B- x: }
  16. extern int f_printf(const char *format, ...);
    % s! N( H9 l, N
  17. /* USER CODE END PV */
    7 B7 d  m/ E. J* }
  18. 4 k) c) J& i! ?4 j. X% m( g
  19. /* USER CODE BEGIN PFP */
    6 w- ^$ R" @1 X. c- }+ W
  20. 8 E# I" b1 F4 X& o. F) J" `
  21. static void AppTaskCreate(void);
    6 b3 t" \3 X2 I5 [
  22. static void KeyTaskCreate(void);
    9 M& b$ V% i6 p2 {  y
  23. static void LedTaskCreate(void);
    ! ~  [$ k& R- K& a( X! e, c* y6 H

  24. 4 g. N# }8 n' {5 a1 |6 M+ c
  25. /* USER CODE END PFP */( W: c$ C( f( m! Q

  26. " S& D. G, ?; f
  27. int main()2 f, Y5 I: q: `0 a+ Z" }
  28. {9 C5 o7 T1 n9 Q+ x: e4 A
  29.   /* USER CODE BEGIN WHILE */
    ; l, L0 M# w/ f1 B
  30.   BaseType_t xReturn = pdFAIL;
    9 J/ |. B1 Z) |; C1 w
  31.         9 `+ y6 c! |  o3 R
  32.   xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
    0 Y7 `9 R; l1 S$ z) e- \4 P
  33.                             (const char *)  "",( B0 f8 r1 R( n8 b2 j
  34.                                                 (uint16_t)      128,, n2 H! f9 n% X% ?
  35.                                                 (void *)        NULL,
    ) o% v; I# X4 l* v
  36.                                                 (UBaseType_t)  1,
    0 S5 [9 _0 G' O$ u% p& e
  37.                                                 (TaskHandle_t *)&AppTask_Handle);
    7 J9 J7 v# `7 q) R0 G7 j4 u
  38.         if( xReturn == pdPASS)
    # L/ P9 v% S- v. k. R/ y4 ?
  39.         {
    : J! d3 _/ x0 B& Y5 H
  40.                 f_printf("APP Task Start.\r\n");! i0 v* m$ Q. \
  41.                 vTaskStartScheduler();7 |; j1 P8 {2 z! v5 r* T- Y
  42.         }
    8 G( L; B- c: G; l; W1 b
  43. # n4 O0 \& \4 p" i+ e, a1 A
  44.   while (1)6 W7 B2 K' w- P3 g. p4 p) [
  45.   {+ n" i  N4 [; d
  46.     /* USER CODE END WHILE */
    6 ~3 [* }1 T' o( p0 [. Y+ u
  47. + x( a7 K. j: ~$ k5 O) e
  48.     /* USER CODE BEGIN 3 */
    % E  q( u& b$ W. H4 @% x- F, ^
  49.   }+ k6 k" G  }  m& Z
  50.   /* USER CODE END 3 */& S  ^( K3 I) L0 E& B( g
  51. }
    ( ?- e4 ]+ e% w$ }. f9 W5 P, R$ p) a
  52. 3 }, Q  u0 d) O7 K
  53. /* USER CODE BEGIN 4 */0 u5 i1 S3 M! S! ~
  54. static void AppTaskCreate(void)0 o5 [3 {' ~# E1 v7 H
  55. {
    8 @0 S* y4 \  S$ r
  56.         BaseType_t xReturn = pdFAIL;
    3 L6 q. X: k: Q* @: O2 N- \
  57.         
    6 z) n" n. I2 c' O2 L0 P$ {; R- `
  58.         xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,/ @$ O. p8 C) {3 a" Y
  59.                               (const char *)  "",) @. A& [5 k! ]. F1 N7 s
  60.                                                                                                 (uint16_t)      128,1 h5 o' t& q4 s% X( I# v/ |) m
  61.                                                                                                 (void *)        NULL,. H9 P: ~. V" J( W2 l. b
  62.                                                                                                 (UBaseType_t)   1,. v" {, N$ Y2 _; B7 w& m
  63.                                                                                                 (TaskHandle_t*) &LedTask_Handle);5 g/ A5 f9 w8 Z* }% N
  64.   if( xReturn == pdPASS)" X8 g& C% ^9 D; O3 k0 {
  65.                 f_printf("LED TASK PASS.\r\n");. s) {. K7 e& l2 ~( p2 _; J  y
  66.         % w! e8 t* m2 O2 [+ H* v
  67.         xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,$ [. W5 D; B% {
  68.                               (const char *)   "",5 q0 h" d) }4 R+ M
  69.                                                                                                 (uint16_t )      128,/ k+ D- A: m/ y8 }, c# n; i
  70.                                                                                                 (void *)         NULL,
    3 v3 g( j* `7 V& t1 Q# n
  71.                                                                                                 (UBaseType_t)   2," `5 Z9 g/ u) I: E
  72.                                                                                                 (TaskHandle_t *) &KeyTask_Handle);. d) Z  w; E1 P, w& T+ `: b9 |/ z( ]
  73.   if( xReturn == pdPASS)  b' B2 z+ a) l- J3 \- K/ i' ?1 X: V
  74.         {
    , w6 D) \, X/ m& b. S* O( n2 c6 t0 A
  75.     f_printf("KEY TASK PASS.\r\n");: H& {/ f) Z% V5 _! x
  76.                 vTaskDelete(AppTask_Handle);
    ; @" P; Q7 s, V$ p! @
  77.         }                                                                                
    5 Z* G" q; S4 G. _  j; x0 `
  78. }6 ], p' Z7 p6 G* w; t5 K4 W
  79. static void KeyTaskCreate(void)
    % p! X7 U$ N( r
  80. {
    8 i% F1 k, V& M4 v* U
  81.   while(1)' E2 u1 r. c2 H$ N1 o
  82.         {
    % ^0 h$ j4 N' Q" v  |& Z3 j4 o1 H" ^
  83.     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))7 z" T# @. B, F8 m0 U5 q+ }! ]
  84.                 {" n: t) v% ^! G4 q) L2 X9 D
  85.                         vTaskDelay(40);: E# P5 C, Z+ H/ A
  86.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    ( [3 `2 x) T! i. a  [' ^3 r% R3 Y6 ]
  87.                         {! o* ?9 o' g& a* ~# n- Y& s0 y
  88.                                 xTaskNotify(LedTask_Handle,0x00000001,eSetBits);. y. Y/ a1 V! {! \. \% f
  89.                                 f_printf("PA0.\r\n");
    - }( a1 n0 R. @# V% ^( C  y2 ?
  90.                         }6 g" M! K! ]4 w# A
  91.                 }, S' u. h& g% Z) v! @
  92.                 else if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)
    : M6 E  v% o* Y* j6 y# {. k
  93.                 {
    2 D8 v& O6 U' X% b- w' o3 N
  94.                         vTaskDelay(40);
    0 r" q, P- s4 E; ^  _$ v
  95.                         if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)
    + u4 l2 x7 o/ @4 H
  96.                         {$ R+ O2 Q! s& w8 \, D% R
  97.                                 xTaskNotify(LedTask_Handle,0x00000002,eSetBits);- Z8 d/ n8 Q3 v( E
  98.                                 f_printf("PC12.\r\n");
    9 W3 o, K6 a1 n% A+ W4 w# j
  99.                         }. L- C5 W" l% C  K' ^" Z
  100.                 }
    ! Q9 u7 Y" N/ t
  101.                 9 d& ]  ^4 b1 D$ `' ~
  102.                 vTaskDelay(50);
    ' a0 T6 T. m# i0 z6 p; H
  103.         }1 @- O. a# E& z; a" I- X( ~. M
  104. }
    ( c7 K; n9 W+ ]& [3 w8 k
  105. static void LedTaskCreate(void): o/ k4 o* E* U1 Y
  106. {
    1 V  C: P3 G) k0 o% p. y
  107.         uint32_t ulReturn = 0;3 J) ~2 ?$ r: t
  108.         BaseType_t xReturn = pdFAIL;" p- G5 A1 k' d/ Z7 \
  109.         while(1)4 h7 l; j0 O& D/ g
  110.         {
    ( v5 I7 _8 d" g) h6 Y
  111.                 xReturn = xTaskNotifyWait( 0 , 0x00000003 , &ulReturn, portMAX_DELAY);4 ?$ p5 V! y% J4 H  W$ r4 R6 W
  112.                 7 J  H/ e# k9 s* f* ^
  113.                 if(xReturn == pdTRUE)" y" y' A9 }5 d7 _( b
  114.                 {* t* o$ k: @. G
  115.                         if( (ulReturn & 0x1)==1)4 c  Q) i" S- A% g" g' s% D
  116.                         {& p3 ]* X' q6 `/ i+ \" _
  117.                                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);& v4 o% D0 D" Y4 M9 `9 M; \
  118.                                 f_printf("LED1.\r\n");
    % d& M$ S5 E& `3 [; t/ T, @1 U
  119.                         }
    8 L) p" P2 W3 |: U: g" k6 [
  120.                         else if( (ulReturn & 0x02)==2)
    / Q0 Q3 @: p1 t# v2 ^1 O
  121.                         {
    # t9 Y% d5 O' }, G$ x; Y4 m& J- M
  122.                                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);4 p- @; s* c& s3 J
  123.                                 f_printf("LED2.\r\n");' i+ p& r0 ]6 Q% s
  124.                         }& [* x, ~* |$ v
  125.                 }
    - y0 \0 U8 E- r/ O2 m1 e& B8 _
  126.                 else
    7 p5 u. e4 p" u! W' M, q' f6 p# o! F
  127.                         f_printf("Read Notify FAIL.\r\n");4 \- n6 ~; R* h: p1 _- Q7 F
  128. 9 I" J, k+ ^) Q) p8 Q, q
  129.                 vTaskDelay(1500);  v4 D0 v1 Q6 J4 x. c& Z
  130.         }
    . ^8 b" L' b3 x: [4 j% T& L- O
  131. }$ `, X* ^/ x& Q6 q& n
  132. /* USER CODE END 4 */
复制代码
6 D, P2 p6 S& @6 U2 y+ B: u
代替长度为1的消息队列
0 B5 M2 V. L; Y! t3 K. k在FreeRTOSConfig.h里开启任务通知; H  P# j! r- z' m3 E, x
  1. /*Turn on task notifications.*/, N! ~& Z+ P4 l, D% _
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码

$ p8 S- x9 o. Z6 z( @; {  K在main.c文件里面修改代码
& o' I+ t$ N7 C
7 p/ q- w, g/ T4 f9 D5 b
  1. /* USER CODE BEGIN Includes */1 g9 J) _' d8 L- Z

  2. . `! n# d/ o, f# N1 ?& A9 N
  3. #include "FreeRTOS.h"8 n0 P6 D. t! L! {  c! m* @/ j' H
  4. #include "task.h"
    - H- Z8 `! E+ E- A# ^% Y
  5. #include <stdio.h>
    3 ~" o% `2 c! d) P
  6. #include <string.h>
    , D3 e) G% i& B4 k6 m
  7. ; L' R1 M7 ]5 Z
  8. /* USER CODE END Includes */
    6 x. f/ D' M, [$ O& X7 H1 q
  9. 5 Z6 K2 z) c2 H$ b' G) P. B
  10. /* USER CODE BEGIN PV */& l  h) S( b3 A2 z* @
  11. static TaskHandle_t AppTask_Handle = NULL;
    % ^3 r5 D! c1 Q0 }7 o$ }
  12. static TaskHandle_t KeyTask_Handle = NULL;/ d) i* D8 K0 q1 Q7 P7 k% M
  13. static TaskHandle_t QueueTask_Handle = NULL;6 i# N* c' z7 W. U$ \8 I% K. J
  14. static uint32_t Message = 0;- [* ]0 C+ S& J7 e0 P  K
  15. static uint32_t *printf_value=&Message;
    . M! ^1 I. P7 V3 E3 A) q7 |
  16. extern int f_printf(const char *format, ...);4 ^* r; D& @0 u" A3 d; k

  17.   H: N' x2 E) q! s/ ~1 D4 h! Y
  18. /* USER CODE END PV */
    2 k1 D3 S$ Z- G
  19. 6 z: Q1 Y* K! l+ C- S, s
  20. /* USER CODE BEGIN PFP */- I( m6 U4 N% ~
  21. static void AppTaskCreate(void);
    1 Y! U  m+ W) ^" }) ]
  22. static void KeyTaskCreate(void);% r& g. `$ S9 ]. G$ h# ?1 q
  23. static void QueueTaskCreate(void);
    5 f" U: L: o5 F; [! k5 b
  24. /* USER CODE END PFP */) s3 n* P8 g, e5 h. ^* V, E
  25. # l% d$ I8 M+ w  Z6 ^4 t
  26. int main()5 \* K. M( _; a/ [' @
  27. {3 K3 Z& ?5 d4 }% {$ a4 ]
  28.   /* USER CODE BEGIN WHILE */
    ! ]) F# c/ i* s/ h' R
  29.   BaseType_t xReturn = pdFAIL;
    . K2 M) ^- M' ~8 I7 c
  30.         : c! r( |% v" }2 R: l
  31.         xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,* E  w0 j8 O8 F0 A3 G+ _
  32.                               (const char *)   "",8 B& U- ]; v' `# [) U0 @
  33.                                                   (uint16_t)       128,
    5 a  \% e* {- \# d0 u: O7 X' H
  34.                                                   (void *)         NULL,
    # p. ~! A7 |; N7 n% C
  35.                                                   (UBaseType_t)    1,7 \. _8 _7 o. c9 P
  36.                                                   (TaskHandle_t *) &AppTask_Handle);/ |. F" A% I( u
  37.                                                                                                 
    , t5 O$ A9 c# T
  38.   if( xReturn == pdPASS)
    8 M2 F: L  {4 q& C! C8 J
  39.         {0 Q" O! t4 Z/ i: v# g
  40.     f_printf("AppTask Start.\r\n");
    7 B3 c6 w( t# Y! U
  41.                 vTaskStartScheduler();
    2 ^( r, H' Z8 T1 @6 |& O) u
  42.         }
    8 a0 z( J) k" L& f% m4 i/ M" I' ^
  43.         
    $ b* c1 v& X1 n1 I, s4 |( T" f  Q9 I
  44.   while (1)0 K; c1 a! c& K4 j3 \: M* H
  45.   {
    ! ~- |: C; O+ H) I/ B: D- a
  46.     /* USER CODE END WHILE */( F! W  g+ g8 b+ P1 }% |
  47. . r2 ~/ ~$ u( I7 e1 E& r7 }
  48.     /* USER CODE BEGIN 3 */* x- p; T" L' q: ]; c7 R
  49.   }
    8 Q6 N+ e- k) q( m- u  f. H
  50.   /* USER CODE END 3 */' K* R, x6 H$ q! t7 _) U
  51. }
    9 T- u+ Z; Z( c; C

  52. & X* @5 U" {# v* ?, T
  53. /* USER CODE BEGIN 4 */" q% v$ M7 ?0 o  ^) o  T5 h. S
  54. static void AppTaskCreate(void)
    " E4 y6 B9 P' ]
  55. {
    ' [$ @; w& W7 w3 _0 I# j1 S' @
  56.         BaseType_t xReturn ;
    2 X2 r8 e* U; [4 V# V! X
  57.         2 s7 s; @0 y  S. x! K; o3 U
  58.         xReturn = xTaskCreate( (TaskFunction_t)QueueTaskCreate,
    0 m* D( T8 F* v7 H! R! B
  59.                          (const char *)  "",
    9 i2 E0 p" W% z/ u" K
  60.                                                                                                  (uint16_t)      128,
    2 W% i: @2 g0 q) p- L  B( V* D
  61.                                                                                                  (void *)        NULL,
    2 u8 R- c' K9 ]1 M0 _% D
  62.                                                                                                  (UBaseType_t)   2,7 `: R2 B2 s9 i* A+ S. P' J
  63.                                                                                                  (TaskHandle_t *)&QueueTask_Handle);
    7 H  s1 N7 ]: z' u
  64.   if( xReturn ==pdPASS )( V5 f5 Q: v4 I: _8 Z9 n
  65.                 f_printf("QueueTask Create PASS.\r\n");
    / f% D" ?" X5 D8 Q  T0 ]
  66.         ( w5 M% b4 I* b
  67.         xReturn = xTaskCreate( (TaskFunction_t)KeyTaskCreate,0 ?; V- u) \+ T# R# B+ O
  68.                          (const char *)  "",
    % Q! t" q* u# u# y
  69.                          (uint16_t)      128,
    - y; E- |6 i8 x3 l: c5 t; F
  70.                                                                                                  (void *)        NULL,
      V! M0 y9 J! @9 B  o! g1 H# U+ R, S
  71.                                                                                                  (UBaseType_t)   1,
    ( f! @2 k3 G8 B# {
  72.                                                                                                  (TaskHandle_t *)&KeyTask_Handle);- e) n5 Z5 |+ W3 y8 E  n
  73.   if (xReturn == pdPASS)
    2 M. L& q$ r* l
  74.         {# p" n7 S/ o/ `' H/ a
  75.           f_printf("KeyTask Create PASS.\r\n");$ w" \+ F- m6 w0 ~; ?" {
  76.                 vTaskDelete(AppTask_Handle);+ Y3 U' S2 _$ ?; R6 J0 G
  77.         }( p7 x1 X5 k( A" O
  78. }" h5 A1 \3 F( X; C) J
  79. static void KeyTaskCreate(void)
    7 l& L1 X3 C( Q! O( f4 D3 Y
  80. {2 p. T4 ~& }  \) v$ Z, ^5 R% Z% R4 _) \
  81.         while(1)
    . K$ ^, x. C8 ?7 k% e/ I
  82.         {. S" {) [* x  `4 d
  83.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)); l4 x  K$ z) O1 j. F7 E7 f2 W
  84.                 {  D- x* S% R2 D; k0 `& W! S0 N- }+ R
  85.                         vTaskDelay(80);
    : o5 j; G! O- O: I' Z
  86.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    ' b6 Q4 o8 O$ I3 B1 w) g6 Y
  87.                         {
    8 X; w, c" j6 _. C5 L
  88.                                 xTaskNotify(QueueTask_Handle, (uint32_t)Message, eSetValueWithOverwrite);( f! V# f; D; @3 r0 R- Q& _" e
  89.                         }5 |% A* R4 S7 I% Q8 g; i
  90.                 }  Z/ s$ ?1 J9 i! W. m& g) r
  91.                 vTaskDelay(80);
    7 B# R8 f, l/ U7 B7 f* X
  92.         }! R; E0 S- Z4 z5 n
  93. }
    ' {* T) P, A" g6 e" K0 k3 m/ g4 k
  94. static void QueueTaskCreate(void)
    % D1 A2 m. Q5 V% V  K
  95. {& O/ m. Y# H8 n4 C- q% [8 z# L# g
  96.         while(1)0 r& T, Z; f: m! ~: ?
  97.         {
    * \: s, a0 \& L0 _" p0 B
  98.                 /*work.*/
    " B7 }9 X+ L9 w
  99.                 xTaskNotifyWait(0, 0xFFFFFFFF, printf_value, portMAX_DELAY);
    5 T" J. e2 s0 V4 s# o" |* Y- ^. M  J' e) Y
  100.                 f_printf("Message is :%d\r\n",*printf_value);
    2 S. z, x% Y! m: e6 u7 w7 ?
  101.                 Message=*printf_value;$ x- g1 D4 D; n" V
  102.                
    & n( E8 Y: D4 Z! D$ T0 ]. O
  103.                 /*The second method works too*/
    . H6 E5 Z# O' J! ~" J% t! Y
  104.         /*
    2 [" s( _3 g& M1 e' i5 z. s( }
  105.                 xTaskNotifyWait(0, 0xFFFFFFFF, &Message, portMAX_DELAY);
    1 g" R% M) p8 m' O
  106.                 f_printf("Message is :%d\r\n",Message);8 k" A# {+ \: b1 s: a
  107.         */
    , ]8 ^. L$ |8 G3 L
  108.                 Message++;5 v0 }' T4 B; {9 d( f
  109.                 if(Message > 10)
    9 C  [& v5 c$ F6 Y8 ?+ r! v
  110.                         Message = 0;
    + P" K" _! S8 q+ i+ n
  111.                 vTaskDelay(1000);6 f- B% _/ s! I" C! V
  112.         }) D$ M, |7 Z4 Y# s/ ^
  113. }
    7 I- I' T% w6 X2 X1 I
  114. /* USER CODE END 4 */
复制代码
  w5 i# x- ^. s: y

" W+ g9 I+ {* ]1 @$ u- }) U8 l6 A* W' x- W: o3 G" I* @% B
收藏 评论0 发布时间:2021-11-14 22:04

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版