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

【经验分享】STM32G0学习手册——FreeRTOS信号量

[复制链接]
STMCU小助手 发布时间:2021-11-12 01:00
二值信号量的用法示例0 s, Z" N9 w/ X1 i9 I  a8 [
1.创建好带有printf-stdarg.c的FreeRTOS的工程2 ~& U6 R' u' u5 A! n1 ]

8 D0 z+ n5 Q. e6 c" t3 K2.修改main.c文件
0 I" v. z# c/ H9 H$ A* x  f; x8 Y  n3 [+ R
  1. /* USER CODE BEGIN Includes */
    2 V5 y  T0 j+ G  d  N+ l8 X

  2. , [1 }" p1 a& B" E! u* @2 ~
  3. #include "FreeRTOS.h"
    4 P( V% y6 }; e( ^2 }
  4. #include "task.h"6 z+ Q4 D7 q9 g4 ?) l; ?( ^
  5. #include "queue.h"
    $ H- b; y7 E  g( h/ A, t' E
  6. #include "semphr.h"
    $ }$ D  c4 Q$ x. P* ~6 y3 H' v4 o
  7. #include <stdio.h>
    # Q- p, {! r( G, y' ?
  8. #include <string.h>
    3 v; B+ \, U/ ^7 c7 [# ~% V
  9. $ C# K9 d% o! I" c2 E6 W& H
  10. /* USER CODE END Includes */" t* Y2 l8 s9 l8 [5 x
  11. /* USER CODE BEGIN PV */$ Z) E6 W* W. Y  H  u: Z0 `
  12. ( v& T3 r) ]$ L" N, V+ I4 W/ d
  13. static TaskHandle_t AppTaskCreate_Handle = NULL;
    / o0 Z; O- t+ E$ }! c: K
  14. static TaskHandle_t KeyTask_Handle = NULL;
    ; l% ?% A% b: Q# w0 L
  15. static TaskHandle_t Led1Task_Handle = NULL;6 `( G' H$ `4 Z# e
  16. 6 V2 y) J) R, ~0 K4 v
  17. /*Create a binary semaphore handle*/
    / c3 a; ?" k- M) g2 D8 K, ^
  18. static SemaphoreHandle_t Binary_Handle = NULL;4 `- Q+ y' c0 q( {$ s+ d3 t$ m

  19. ! @4 t' c  u1 W
  20. extern int f_printf(const char *format, ...);
    6 O. N/ g  n) r$ I
  21. . [0 R9 Q0 N2 E: u. c, g/ [
  22. /* USER CODE END PV */- c0 ]0 s- S* R5 G2 A+ G- {- ]) E
  23. /* USER CODE BEGIN PFP */# Y& m$ o6 t* _) C0 q4 ?: k( F

  24. ! O# D8 O4 t3 `8 i+ F9 ~
  25. /*Create a task function*/9 u( b' V1 c4 I, D+ h
  26. static void AppTaskCreate(void);
    9 k; @6 |, c; A( N3 M
  27. static void KeyTaskCreate(void);
    % v% x6 Z, O+ u, T8 Z
  28. static void Led1TaskCreate(void);
    " ]  \! d$ `# V

  29. $ d! t9 Y7 F' C$ T( d
  30. /* USER CODE END PFP */& o5 N9 S8 {* f9 A- D7 z! `/ B) ^

  31. 5 v& `: \4 U- A, a2 r5 K
  32. int main()
    * C  S1 K1 U6 _+ E
  33. {
    , ]3 H, V0 v) k# b; p
  34.   /*! o! M) p9 k/ ?6 F; Y, W( w; h* Z0 }
  35.   *! P" J' }4 R+ y3 y
  36.   */  c  ?4 g8 W  D8 f* |+ S
  37.   /* USER CODE BEGIN WHILE */" J; v9 ~1 _0 H, Z# D1 U6 i/ |1 @2 {
  38.   UBaseType_t xReturn = pdPASS;
    4 x; t' e/ P3 G. R1 c" P; c; o
  39.         
    ) O6 f3 {- p8 e( Z( l
  40.         xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,8 z2 e! B. d" q
  41.                               (const char *) "APPTASKCREATE",4 o& T" V$ n( b- b
  42.                                                   (uint16_t)     128,5 t! r: Z0 o' @, h; x' e% [
  43.                                                   (void *)       NULL,
    ) r9 N, A. A" P8 f
  44.                                                   (UBaseType_t)  2,3 p5 N' O, y3 w( b- A. f
  45.                                                   (TaskHandle_t *)&AppTaskCreate_Handle);
    ! Q" K) [4 ~0 b; Z. Z
  46.   if(xReturn ==pdPASS)5 L6 D6 ^8 L' v# ~
  47.         {
    4 a; [* b, h( W# h2 u5 I- V! U
  48.                 vTaskStartScheduler();( n' B- n( u) Y& R
  49.                 f_printf("start..\r\n");
    ! [8 k7 i' H: G
  50.         }6 h3 C: A) f: k* j
  51.   while (1)
    / M, F9 L8 P8 h9 W
  52.   {
    ; N' \6 u' q( V# [/ i9 I1 s
  53.     /* USER CODE END WHILE */
    8 h7 _6 v$ _3 c# e0 y2 J
  54. 6 R" E' K" Y2 `. k
  55.     /* USER CODE BEGIN 3 */; M2 W8 z) V* ]: u- b* w6 w$ n
  56.   }
    5 U  i' v& h! l  Y4 c
  57.   /* USER CODE END 3 */  R- ^4 c+ G& r" ~  I5 j; _
  58. ! }+ p. v1 n; b

  59. 3 [1 Z  C) _7 C) x% F$ ?
  60. }7 Z$ ^2 x: J3 q. C/ p) S

  61. 2 x7 B' A! j& _1 _4 [0 D

  62. " {) [  M. I" u) a- c
  63. /* USER CODE BEGIN 4 */4 {( X, y6 e! y/ a
  64. static void AppTaskCreate(void)7 U% n9 o$ `+ d8 w, |2 J3 i/ o
  65. {
    " W3 _  X1 ?. }  s/ E6 \/ Q7 u
  66.   UBaseType_t xReturn = pdPASS;1 q( V( r8 d) U2 T4 }4 {! n

  67. . r1 T, b5 E) u- c

  68. # n! W. P" v3 K
  69.   xReturn = xTaskCreate((TaskFunction_t) KeyTaskCreate,
    % `, ~  T) i- q) ^
  70.                              (const char *)   "KEYTASKCREATE",3 E3 W; z# }7 Y1 g; @, `9 F7 ]
  71.                                                  (uint16_t)       128,% N5 M' |+ V. t  r4 s" C% m9 d
  72.                                                  (void *)         NULL,
    , w+ V! V. p4 c3 t% V7 X5 d+ ~. j  q
  73.                                                  (UBaseType_t )   2,
    . h8 R& V% g8 ~6 s4 P
  74.                                                  (TaskHandle_t *) &KeyTask_Handle);' N7 v4 x. E7 N4 C

  75. $ H6 ?: N0 E$ I$ d7 {1 m
  76.   xReturn = xTaskCreate((TaskFunction_t) Led1TaskCreate,# ?6 x8 o+ h& `5 i* Q# e( s
  77.                                                 (const char *)   "LED1TASKCREATE",; r# S& |  C: [( o$ w. _
  78.                                                 (uint16_t)       128,3 a- G" f. H+ |- t' r
  79.                                                 (void *)         NULL,
    , c6 l' L: _" ~' G5 b
  80.                                                 (UBaseType_t)    1,
    & x7 e* d) [* o) W$ v
  81.                                                 (TaskHandle_t *)&Led1Task_Handle);
    ' V6 t4 w& Y# f
  82.         ! ^7 U0 ^* l2 D; f( D: y! f* p
  83.     /*Create a binary semaphore*/
      c! q3 Q- J1 }
  84.         Binary_Handle = xSemaphoreCreateBinary();: }( A, y3 ?5 H; D9 J% y4 ]9 S4 K
  85.         if(Binary_Handle !=NULL)
    + S! p+ `/ c. p  b# X& T
  86.                 f_printf("Create Semph_Binary PASS.\r\n");* g0 b/ {$ m8 c: q
  87.         0 D! j2 Z& v# K/ [* B
  88.         if(xReturn == pdPASS)
    ) h! ~8 C& H+ Z. P0 a7 F0 T: Z
  89.     vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);                , `7 I9 Z0 F7 z/ B' o( n/ `  P6 d' {
  90. }9 M: ]" q" C$ C6 _- U0 t1 H

  91. - t0 {* i) _& O6 Y+ j
  92. static void KeyTaskCreate(void)$ u" E$ A: H& m0 ]5 t
  93. {
    + l' o4 m  j" W# V, E" a2 ^, F
  94.   while(1)
    5 N+ G" H. d2 p$ g$ Z  A" i: d
  95.         {
    * m- X. {5 a' ~
  96.                 UBaseType_t xReturn = pdPASS;
    1 Z% t9 q( ^% z0 R
  97.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))& {: q0 d7 }6 y( [- W
  98.                 {
    0 f4 `' F9 S7 c- {& o
  99.                         f_printf("KEY TASK PASS.\r\n");4 B5 H' _$ e( w. C( R/ E' b
  100.                         vTaskDelay(100);' j8 G: h% w4 a
  101.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    7 m5 u# g9 R% T) j8 D
  102.                         {
    5 [: J+ C7 e4 Z6 L- V5 U
  103.                                 xReturn = xSemaphoreGive(Binary_Handle);
    $ @( ]( v, V3 A5 q4 O2 l
  104.                                 if(xReturn == pdPASS)+ J1 ?/ o) ^7 P0 c5 I
  105.                                         f_printf("GIVE BINARY PASS.\r\n");5 G5 A# m; M+ @! s/ y
  106.                                 else if(xReturn == errQUEUE_FULL)
    9 U8 ~: B7 W3 C% Z8 E: ]1 W) ]- C
  107.                                         f_printf("QUEUE IS FULL.\r\n");
    . f& C) \+ Y8 Z% m2 T5 M
  108.                         }7 I# k8 w; y* A3 }
  109.                 }+ I8 F; ?4 ?2 x# h4 }# A0 N& Y/ D
  110.                 5 A- M% x+ H; P4 K( j' J
  111.     vTaskDelay(100);
    : v/ \) F+ ~+ i3 O6 d
  112.         }5 [. w5 B+ v( T9 n: C+ J
  113. 9 X) r1 B) i2 L; E
  114. }
    ' j' ^1 t) X) I$ w* r
  115. static void Led1TaskCreate(void). H( [, I9 x: F
  116. {" U/ O% W+ f* \, Q7 o, C
  117.   while(1). L, _+ h) d  \7 p8 L+ E. f
  118.         {7 [+ \, ?6 k  A8 v2 H- B* }
  119.                 UBaseType_t xReturn = pdPASS;4 n" d3 Q4 e2 x) w+ x4 Z8 E' T  j
  120.                
    6 C# B0 f; ?( s' S
  121.                 xReturn = xSemaphoreTake(Binary_Handle, portMAX_DELAY);7 q% f! c4 \7 _  `
  122.                 if(xReturn == pdPASS)
    3 }; h6 _8 _5 K; f
  123.                 {! J( |2 F' K+ N7 x  s: a, S$ x; d1 F
  124.                         f_printf("TAKE BINARY PASS.\r\n");7 b. F& A" T1 r$ S9 Y7 @9 t
  125.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    0 P$ G7 z* O" D- r
  126.                 }
      J& M+ m; Z: f( ]
  127.                 $ t$ Q3 j7 R5 f& p" x8 @
  128.           vTaskDelay(100);
    ' E: L) x6 j# X3 U7 P
  129.         }% _2 d9 A- L$ Y# N6 o; \
  130. }) Y  p2 ]' a7 H4 {- [% ]
  131. ( x, I- q" P' j2 v. ~: u
  132. /* USER CODE END 4 */
复制代码

/ }! P. s. ]7 e) f* Q. X计数信号量的用法示例5 M$ \7 F2 Z3 U" j* S
1.创建好带有printf-stdarg.c的FreeRTOS的工程
) W" q: u& y4 j$ e  T1 Z$ A- T9 f. {2 k& x3 h- F1 W3 ?
2.修改main.c文件
! ]8 E: w4 h! ~% `  T: X
) k; A5 e( P/ y/ n. t/ c) m0 b2 W
  1. /* USER CODE BEGIN Includes */
    . G( X) @4 |6 b2 Q* F3 G' A

  2. $ Q1 E9 B7 w0 U) [
  3. #include "FreeRTOS.h"5 n. ^. }" ]$ j2 x: ]& h2 ^& h
  4. #include "task.h"
    3 O! t) I8 w1 J8 b2 {5 C
  5. #include "queue.h"( U  `+ N/ k% A
  6. #include "semphr.h", X6 C) U0 E1 Z1 i% M
  7. #include <stdio.h>9 G1 v( x+ i  f% e
  8. #include <string.h>. e' F/ @0 \8 U$ L+ Y

  9. 1 C& U$ [7 q1 W! s7 z
  10. /* USER CODE END Includes */9 T' Q+ g2 K& D' z  `% ?8 O
  11. /* USER CODE BEGIN PV */
    , G0 g, z8 ~( q
  12. static TaskHandle_t AppTaskCreate_Handle = NULL;$ I. }( ?+ i9 M4 s8 [7 k
  13. static TaskHandle_t KeyTask_Handle = NULL;
    , E5 e; O+ A+ R/ S& e: }# A- p0 R
  14. static TaskHandle_t Led1_Handle = NULL;, s- T5 T1 x3 }. W  O; r
  15. + q+ F7 q* B3 P0 _& _/ T
  16. SemaphoreHandle_t SemaphCount_Handle = NULL;+ o3 ^& b3 Y3 @

  17. : _9 C$ e! V- S! |9 f: f; l
  18. extern int f_printf(const char *format, ...);/ }, _' ~0 {2 D7 c# c$ ~/ _) D
  19. 5 Z4 H) b5 h7 I' V+ X' o' d
  20. /* USER CODE END PV */
    ! o2 j, e$ F' S) ?
  21. # e# A8 e1 {* a6 C7 Q- ^* x# l* D
  22. /* USER CODE BEGIN PFP */
    ! Y: D9 k7 T5 c) c- [# N  ~

  23. : O! X* i' P& O  L  i( }7 E- j
  24. static void AppTaskCreate(void);6 U( z% N2 M$ u: ^
  25. static void KeyTaskCreate(void);
    + s. y9 ~- }9 l: [' w  j
  26. static void LED1TaskCreate(void);. B# A" K6 j) M$ ]6 A  E, W

  27. ! ?9 E1 ?0 C) p% b3 y& W( e
  28. /* USER CODE END PFP */' o* T, t, J0 T8 F) Q
  29. ) U: `' Y3 {1 V$ Z# `: x( k  P3 I
  30. int main()
    - p( v7 V) t' k: d
  31. {
    & I, r# m# }- B3 d
  32.   ***
    * }" K5 L7 f4 H2 w. A
  33. 7 k* l. \% U& F0 {. y( e# |, z9 @
  34.   /* USER CODE BEGIN WHILE */2 L& F, M; T$ h0 {, ?: s1 f! h/ ^

  35. . b9 ]  n4 M5 s- i  A3 o
  36.   UBaseType_t xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
    $ W6 M3 O3 e& o( u5 A/ o
  37.                                     (const char *)"APPTASKCREATE",
    , s- G9 N7 D$ U
  38.                                                                         (uint16_t)    128,4 @9 k* g4 V$ d  N* ]! P
  39.                                                                         (void *)      NULL,/ @6 M( e6 V7 F- S# _
  40.                                                                         (UBaseType_t) 2,
    ! J) g% L5 G4 i/ V9 F
  41.                                                                         (TaskHandle_t *)&AppTaskCreate_Handle);
    + k, z) U3 A/ \) B& w( R
  42.         if(xReturn ==pdPASS)5 `  H! c% f. ^) t$ }
  43.         {
    8 u. ]; P# h/ @7 ?1 g7 ]
  44.                 f_printf("TASK START.\r\n");  x2 R6 ^6 {; B
  45.                 vTaskStartScheduler();
    ) r- D5 W1 P  [# L8 p
  46.         }
    ; O9 I+ q0 L/ i9 W, i3 F
  47.   while (1)
    : X' T# }( i- H7 |
  48.   {2 M- o6 t' e# H1 y0 k7 B) T
  49.     /* USER CODE END WHILE */' M; |. A# R* T; {' J+ L: W
  50. $ E3 h* J! f( F5 b/ O
  51.     /* USER CODE BEGIN 3 */. ]! `0 J! C: {
  52.   }
    6 K1 U# g/ z& v+ Z/ s- Y: H
  53.   /* USER CODE END 3 */; V3 F( M, n3 `7 p
  54. }& Q/ M4 x5 j6 M0 z; j! ~) S
  55. ' a3 H  b& u: c, o% K+ V. O
  56. /* USER CODE BEGIN 4 */$ F, k; t* \6 x3 a
  57. static void AppTaskCreate(void), R! G2 R' a7 O5 h* r# o; `
  58. {
    * {( ^: V/ k& l3 T! O, r( z

  59. 2 ~7 a5 a4 w3 T) k: f; S& O* [
  60.   UBaseType_t xReturn ;; ~0 J2 [! s% C4 y7 a  D
  61.         xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,- i( h- b1 _# W" N6 A8 o$ L! {+ @& \
  62.                                     (const char *) "KEYTASKCREATE",0 N% z3 |% |7 t4 k
  63.                                     (uint16_t)      128,
    * l- `% w: ]# B4 w
  64.                                                                         (void *)       NULL,' z9 E: b* q( {2 r
  65.                                                                         (UBaseType_t)   2,  M! X2 k' |) V) B. c6 ^
  66.                                                                         (TaskHandle_t*)&KeyTask_Handle);
    1 m+ |8 \) c; r4 z9 A1 T1 r8 A; e
  67.   if(xReturn == pdPASS)' j, Y& h) X+ b
  68.                 f_printf("KEY CREATE PASS.\r\n");+ T) h; P" h8 A5 [$ S6 {) V

  69. ; D9 P- p5 s; m% h5 m
  70.   xReturn = xTaskCreate((TaskFunction_t)LED1TaskCreate,7 M2 ?9 L$ j/ t, `9 L3 z& Q: N
  71.                                                 (const char *)  "LED1TASKCREATE",7 B- m/ u  q. u. P+ J
  72.                                                 (uint16_t)      128,
    9 X6 x' p7 ]8 N& T
  73.                                                 (void *)        NULL,
      U+ @* g- ?- w! T6 l
  74.                                                 (UBaseType_t)   1,
    - j# S0 X! M  d$ j* a- E# C
  75.                                                 (TaskHandle_t*)&Led1_Handle);
    : h) _7 a3 ?" c

  76. " ^; W3 ~; I% h3 S9 Y7 g
  77.         SemaphCount_Handle = xSemaphoreCreateCounting(3,0);
      f/ }0 Y# V( v6 P$ S
  78.         if(SemaphCount_Handle != NULL)' m" K1 }% E" h% k; ~
  79.                 f_printf("SEMAPHORE COUNT CREATE PASS.\r\n");
    & Y0 k1 [* X7 |" p9 j
  80.         
    ( y# F, R( C: `  J1 [! J  D
  81.   if(xReturn == pdPASS)! n: J9 O2 I9 G& R6 e' t; N& j
  82.         {
    ' i( M4 `$ w$ k
  83.                 f_printf("LED CREATE PASS.\r\n");        6 Z& P( }* k6 U6 z7 W' Y
  84.                 vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);' i. u  Y2 |. f/ G0 [
  85.         }3 ~+ ?/ x+ g% }( @7 z
  86. }+ E! O5 |, E2 z+ R
  87. + e: a* R* O& t/ ?" s3 o

  88. 4 h" F: F% v$ `. Y6 ~
  89. static void KeyTaskCreate(void)
    3 r  Z4 r8 }+ M* [# a
  90. {
    : q+ {# x) C2 y$ Y9 f8 u
  91.   while(1)
      k4 t% o% S& P* s1 L
  92.         {, ~5 E8 q6 c. G' H- ~0 W6 I0 M
  93.                 UBaseType_t xReturn = pdPASS;
    ! Q# V5 [: d' L& C% i. r( f* T
  94.     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))9 A5 N! M0 S( S2 `0 [' ]5 J
  95.                 {
    . l; o* ~' `' J4 S; L
  96.                         vTaskDelay(100);
    % [% b& x/ [8 d1 V- H! D' L
  97.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))0 B; G6 ]* d3 L5 q8 L9 {- E8 W
  98.                         {
    % B/ s9 L+ z' w. T7 g
  99.                                 f_printf("KEY PRESS.\r\n");
    + f1 i3 a1 S/ S$ H
  100.                                 xReturn = xSemaphoreGive(SemaphCount_Handle);: S+ h+ T0 i5 r
  101.                                 if(xReturn == pdPASS)8 x, o: M8 N/ ]- t
  102.                                         f_printf("GIVE COUNTING PASS.\r\n");$ s. \8 z! C5 n  Y- H. e! z) |
  103.                                 else if(xReturn == errQUEUE_FULL)
    3 Q9 W( I- E9 `8 V! V/ `
  104.                                         f_printf("QUEUE IS FULL.\r\n");/ H( [! p/ O* c) F7 f4 h
  105.                         }( o. @5 u" [( Y( w
  106.                 }               
    % \3 P1 [7 c( G0 M
  107.                 vTaskDelay(10);
    ) Y) H3 h; V6 l  D( a
  108.         }
    4 u! z0 a% g) F, b
  109. }
    " i4 Z9 a' L3 I& U
  110. static void LED1TaskCreate(void)
    3 U! A: t8 ^) `  z+ U
  111. {
    & G. ?( ]9 `: t1 Z/ V
  112.         while(1)% N' J1 E2 W$ a# j6 M
  113.         {
    : Z! t3 n* f9 \' ]" L
  114.                 UBaseType_t xReturn = pdPASS;! X) m2 ?* s" T( W8 `3 b
  115.                 % v7 ^6 E7 z7 s
  116.                 xReturn = xSemaphoreTake(SemaphCount_Handle,portMAX_DELAY);
      a' H3 t+ _9 ?
  117.                 4 K# V3 w, _5 Y
  118.                 if(xReturn == pdTRUE)* T3 l6 q0 S6 S% t0 N7 D+ W
  119.                 {
    ) [5 N$ T  c/ G
  120.                         HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
    ' F8 z6 C$ u- N+ N9 b- o
  121.                         f_printf("Counting Take PASS.\r\n");" n* n+ H  q, g; [3 [1 e& D' E
  122.                 }
    4 {* P  Z# o  E$ T' V4 s
  123.                 else if(xReturn == errQUEUE_EMPTY)
    % I4 r1 s5 h1 {
  124.                         f_printf("semaphore is empty.\r\n");
    5 W5 f  B. n/ l( g
  125.                 vTaskDelay(2000);  q5 S, ~- q+ a
  126.         }
    7 r) i, R& L# O6 v  q$ B/ w
  127. }8 F# c2 D4 Q3 `5 B' X
  128. /* USER CODE END 4 */
    ( U& z. P# t4 G6 R
  129. " m6 D' I$ m0 m5 e) G, i
复制代码

+ q. q: M' E3 W& ^, l: R! `( y2 B# _
收藏 评论0 发布时间:2021-11-12 01:00

举报

0个回答

所属标签

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