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

STM32G0学习手册——FreeRTOS任务通知

[复制链接]
STMCU小助手 发布时间:2022-10-27 18:45
概述1 n, q. I8 q3 _) n" M
        每个任务都有一个32位的通知值,可以替代二值信号量,计数信号量,事件组,也可以代替长度为1的队列。
3 b' I  v& l# w$ ^+ k/ j& ^& G% ?( L- k. w: d9 m# w
        有以下几种方式发送通知给任务:
0 G4 g) X. w1 Z$ c9 d, P+ ]" t; G. S: |& M, |$ L2 A* \
1.有通知未读,则不覆盖通知值
1 B' `& u% e, ?$ x' x, F" T- g. t& L) S1 H- ]+ K  i2 Z
2.直接覆盖通知值& k  v- m7 J$ _6 h! E' `. v, d

: j2 v$ @$ j' f* p7 T3.设置通知值一个或者多个位,当做事件组来使用. n! H8 |" j) c& K3 m" z

! I3 O6 X: d3 W1 V+ U4.递增/递减通知,当做信号量来使用7 O' f$ e9 K! r6 ^/ v7 o& h3 N

; V! o$ g& G6 e4 }        有以下缺点:9 |# m$ x: N$ K. {* t
  R3 d5 A, D& _' g0 ^, t; e0 Q
1.只能有一个任务接收通知消息" l7 z9 n1 K! Z2 w3 |; P+ w% E

; m- g3 S3 l& i! ~5 k& y2.只有等待通知的任务可以被阻塞,发送通知的任务都不会因为发送失败而进入阻塞。- o9 g3 i% D* q- D* y! p) y
2 w+ X& N$ l; ]
代替二值信号量! [# D$ c: U. c0 ]' |" [
在FreeRTOSConfig.h里开启任务通知, O0 A, h( L6 \

9 o$ i; n+ b( D: X6 V' G
  1. /*Turn on task notifications.*/8 j' t9 {8 V7 M/ k
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码
2 O8 ~- B# R5 }& E& P# H0 ^6 g
在main.c文件里面修改代码0 Z( g/ W" J: r7 X' e
" r" x* u- l) a
/* USER CODE BEGIN Includes */" n3 R7 z0 S( X7 c1 p& a" i( `" V* n

% k; H- |# D5 @  f% l#include "FreeRTOS.h"
1 k+ @! G. V- s$ R#include "task.h"
6 U3 q% ^6 _: e% `' t& [* B! w5 U#include <stdio.h>7 O2 ?" v0 \6 U, l4 U
#include <string.h>6 l% x& b0 A# O2 ~1 A" W

$ }" H" H) a6 a. j* }  e3 R/* USER CODE END Includes */
0 p3 u- d! R( E7 P* Y8 y: M
# D/ I2 O+ Z4 q/ c/* USER CODE BEGIN PV */7 C3 Y2 L9 Z" T
static TaskHandle_t AppTask_Handle = NULL;; p: y$ s; i+ o- G
static TaskHandle_t KeyTask_Handle = NULL;
: l, O% t# q5 n4 Ystatic TaskHandle_t LedTask_Handle = NULL;
1 E7 m" b/ C( m4 R3 p# ?* W
4 H4 k( j8 S& R7 c, }extern int f_printf(const char *format, ...);
# D( j- |6 S# I" M# p2 x( S9 ~7 z/* USER CODE END PV */1 a! Z, `8 U% f5 w- r7 ?
5 |2 X" E9 e' m7 B* L5 O
/* USER CODE BEGIN PFP */7 B' s( e4 T- ^! ~( P
static void AppTaskCreate(void);
. u& [7 z: C3 k3 I- g1 Q" G- @static void KeyTaskCreate(void);5 {3 H) `3 C3 d! }+ |3 t6 h2 W5 h
static void LedTaskCreate(void);/ \3 e' }# q5 @3 H
/* USER CODE END PFP */5 `' ]: H' ~$ f* f0 ?; K4 ^

0 E, u/ [4 j* b6 N5 G) s2 Nint main()
* h+ s7 \# j8 i{4 b4 k6 P$ N$ }7 d5 I

9 {1 g$ k! x1 f6 e/ D9 n: f  /* USER CODE BEGIN WHILE */
1 x/ M( f) E/ j  U( H  BaseType_t xReturn = pdFAIL;
. o: j  V1 @% Y  G! r- ?3 g3 m0 g        
% k1 e4 J7 X# X- s5 E        xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
$ b. y3 Z  V2 c( a, K4 T3 U/ l                        (const char*)   "APPTASKCREATE",5 o+ a/ U9 h! J' @& P
                        (uint16_t)      128,  e; \; D# T) g, H5 g! n+ q
                        (void *)        NULL,* X; p& e! N7 E
                        (UBaseType_t)   1 ,
: T: C7 [5 G2 Q/ a  g                        (TaskHandle_t*) &AppTask_Handle);. B9 u, E+ O5 ~$ F, d/ _
        
% w. @2 D/ o& V* q6 E2 o8 X# |  if(xReturn == pdPASS)! Z! B! X$ U% @  @1 l4 o
        {* x$ w/ U# ?6 L9 f+ ?
    f_printf("AppTask Create PASS.\r\n");
" _  l3 Z  Z6 v) C6 S9 Z$ u                vTaskStartScheduler();9 q! ?0 U3 K: e( r1 @5 ]/ w- y
        }
% n8 E$ W: z# \3 z. B) `- ?0 Z                                                                                                # u3 y5 B: o6 H3 ^! I# o
  while (1)
0 u5 f9 S5 a* J# j; `! G0 J  B9 r( A  {, m0 w/ j1 C2 O1 h
    /* USER CODE END WHILE */
: H# v8 d, q( U# E; [0 `    /* USER CODE BEGIN 3 */
6 Y; q/ V8 T  @& U6 L) O$ D  }
5 K( G+ k4 y( T5 O  m# v- Q  /* USER CODE END 3 */
: Z, f5 ?, A* m, x- A  G$ r( h( X0 Q}
) y% l2 m: O3 f+ p  g2 }& H8 E7 E0 ?& U- t( e+ U$ |
/* USER CODE BEGIN 4 */
# p* x. u5 Z) @$ h$ k( r" N* U0 @- Vstatic void AppTaskCreate(void)
# {5 G5 Y$ m8 P7 r1 X{# a6 I/ t$ M5 _) m1 f
  BaseType_t xReturn = pdFAIL;
7 I; l- O' X; E/ D
* Y% G2 Z# K- S" R- T1 s        xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,% {: @5 [4 L7 c3 j5 R
                        (const char *)  "LEDTASKCREATE",6 `  @* `) R6 P% e3 f
                        (uint16_t)      128,/ x) w& x) G- X$ \
                        (void *)        NULL,1 Z. _- f) q) d. E& U% c: Z1 F( F( t% u
  /*If the priority here is the same as the key task, printf will not print it out.        */4 y7 p! @: C; ?6 J$ B7 D& X& F
                        (UBaseType_t)   2,      % U9 Y0 ^' m" A. c  v* `- j
                        (TaskHandle_t *)&LedTask_Handle);
( @& v3 C8 K) p3 O( q) F0 W: d  if(xReturn == pdPASS)& b7 y2 y# y9 o% G; g, ?+ z
                f_printf("LedTask Create PASS.\r\n");
# p7 B! }1 D9 _1 G2 w) e2 h0 j        
+ O5 d5 R2 @2 O8 J/ a2 j2 e# K        xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,0 O9 t& s) `* ?2 A
                        (const char *)  "KEYTASKCREATE",
% W2 R' j% L, j: h: |& u                        (uint16_t)      128,
% ]1 A' T5 K1 W. X, z, p" ]                        (void *)        NULL,
& h, O) @1 e3 v5 T- |                        (UBaseType_t)   1,
, {, t! E8 ]- ]4 S' z/ b: T5 x1 Z                        (TaskHandle_t *)&KeyTask_Handle);0 C1 [4 G# x2 x5 u# q- F& \+ J
  if(xReturn == pdPASS)  x8 M2 ~* C- q+ N) j% R4 c2 O1 x
        {3 ]0 O" P4 E; I1 W* l
                f_printf("KeyTask Create PASS.\r\n");
: F* n+ |; Y0 @; n' [3 P    vTaskDelete(AppTask_Handle);! V& ~) d; D" e+ X$ F5 S3 N
        }! L" U' n- K" K( _* ~$ W# @
: v, |+ D0 X5 ^2 R7 {9 E) _
}
# ~" ]; ^: h* t2 c1 ^1 Nstatic void KeyTaskCreate(void)9 h  y2 v1 u; g
{
  X, D: E+ M4 ?        while(1); e* N0 d. ~9 v& c
        {( m! J  |. W0 _0 i$ K1 s
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
: l- C2 S7 I) D7 y4 @$ d! G          {
4 E7 Y) v- m5 _4 c- g      vTaskDelay(50);( b+ I5 |4 ?3 r* w+ }# ?
      if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
* O' L* d6 W7 P! ?/ n' @+ r3 A                  {6 H2 [: T( |* W. W- `
        xTaskNotifyGive(LedTask_Handle);% G% w" u8 K5 u9 X; o1 |) ~8 G. B
                          f_printf("Give LedTask_Handle PASS.\r\n");/ X- ?! L" H4 S8 y! u
                  }
5 y2 Z% r0 u6 I6 F9 J; Z! d          }  W- x, P+ o. x! B
          vTaskDelay(100);6 l( D" h' r$ t8 d4 J% p6 U. |
  }0 U& G8 ]- `5 P% }9 K5 e  Z
}5 ]& w! A6 B9 Q/ B, F6 J
static void LedTaskCreate(void)5 U2 e+ A$ w8 K
{
7 P4 Q6 b* D. p; n! X7 L$ x        uint32_t ulreturn=0;
! C* ~% s) [5 ~) k9 ?# k) t        while(1)* A* ], Q% Q$ c+ _: H& E
        {
0 U1 u2 R, M0 w& A! {) S                ! X4 v% d; }7 n* j) {
    ulreturn=ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
5 q, d/ }; K$ L/ F                if(ulreturn==1)% S4 k8 A5 T+ q* i* R
                {
) V% m: U) a1 i) V                        /*It won’t be printed out at the same level*/. x3 Y4 @* ^1 \1 D. y
                  f_printf("LedTask TAKE PASS.\r\n");
+ l* ^% ?' o& p            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
: x- o# n8 _2 M; o% W4 E                        4 j# D2 s+ g  {& e
                }
: j$ G9 ?7 t5 @& F3 n                else
4 ?2 l5 E) \; q4 |                        f_printf("LedTask TAKE FAIL.\r\n");
0 t, ^* M8 |" c' N+ R4 L* i# n    vTaskDelay(100);& }' t3 I. q, [0 C: _, R* {
  }- J6 n. q8 R3 T% [
}% h& R9 {5 o1 R# a$ H  y
/* USER CODE END 4 */
+ w4 x: \% q$ T- c# z
9 b) v8 a' ]5 D* m2 J& b% @# V 代替计数信号量
2 y4 m/ w8 Q# o2 A在FreeRTOSConfig.h里开启任务通知
9 u0 h& F$ z: w3 i! p# r" B! D$ r9 _0 ?! \3 N6 o9 ^2 E( N
/*Turn on task notifications.*/
: q* s1 `( v7 w7 x" I4 J, i! t#define configUSE_TASK_NOTIFICATIONS      1
7 Z1 S0 D/ i) h" J. L0 Q& s在main.c文件里面修改代码: ^1 r% r: H$ G# i
& g' R  H/ F4 r2 f" Z9 A% w: j
/* USER CODE BEGIN Includes */+ l  y1 B3 [+ x" h
! m& Z/ k% I9 g; R
#include "FreeRTOS.h"
2 E1 J9 c+ E: I$ p  Z#include "task.h"
; }( p( v! @# g" x& E2 D#include <stdio.h>  o  F* h* V1 |: O
#include <string.h>) [8 T5 `" O. F. |

( }1 T+ n+ p% N( Q8 L+ `/* USER CODE END Includes */8 w. W% H" p# f7 j( H4 y* |
$ V$ {6 a7 n. ], q8 Z
/* USER CODE BEGIN PV */
6 i$ q9 F2 Y( `$ Wstatic TaskHandle_t AppTask_Handle = NULL;
  |( R! b8 Z2 Y: rstatic TaskHandle_t KeyTask_Handle = NULL;
) Y! @3 y8 \1 Ostatic TaskHandle_t LedTask_Handle = NULL;
2 F6 E/ t' D; p, Z' |' r8 D! a$ s4 @  J3 r7 D4 Z2 G5 @
extern int f_printf(const char *format, ...);+ L0 k6 C3 i* S0 |6 c' g

0 r/ R, D2 O1 }4 K7 c6 Q" m/* USER CODE END PV */% T# j& `. f* E( ~( W8 t

5 B* b9 |6 A% s* x) ?5 @; ?/* USER CODE BEGIN PFP */7 N+ _0 F. P9 h2 |- _) I
static void AppTaskCreate(void);
$ a1 `  a2 M6 q2 @/ estatic void KeyTaskCreate(void);+ G# {" l/ q% p2 R+ J
static void LedTaskCreate(void);
1 t+ V( S1 D* _- j/* USER CODE END PFP */! d7 e, {- Z, H3 W6 i7 J, ~
9 X* P: x) g6 G& j: V0 a) U( ~
int main()( h' W- x/ W3 D# K- m- e6 p
{* H& j1 A, [6 x. o
  /* USER CODE BEGIN WHILE */7 n! W. f4 c* H/ Y5 |: p
  BaseType_t xReturn = pdFAIL;        / U! r( p5 `1 [- n

/ {0 m0 d3 |/ p5 r7 M  xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
0 J8 Y2 R$ P3 `4 Z& q/ T. [( h                        (const char *)  "APPTASKCREATE",
7 p# W' [' p1 e2 T6 |                        (uint16_t)      128,
/ T$ D- Y' x$ o                        (void *)        NULL,. t: K3 M- D; _) k2 P3 A3 U- g
                        (UBaseType_t)   1,, J; {  `# s  ~- L6 a, |
                        (TaskHandle_t*) &AppTask_Handle);
1 x. m, g* x: G" Q% B
8 M# q/ q9 B$ Z8 x4 }6 w  if(xReturn == pdPASS)$ e2 Z- `9 N- e/ ~
        {
0 R( p6 F0 t& o6 g    f_printf("AppTask Create PASS.\r\n");
' J( V( y0 S2 `/ m, G+ b    vTaskStartScheduler();5 h' g9 n9 p+ N2 r. E4 ]
        }
6 @4 o4 o( C+ x& w, ^  while (1). _( B* q: o1 G$ h8 Z1 Z
  {
$ }0 Z0 h7 H$ y2 ~% k    /* USER CODE END WHILE */
2 U( G$ @# I" x' z# X. [/ [0 Y. n2 ^, \4 I% j
    /* USER CODE BEGIN 3 */
0 ?4 w: q3 v" I8 p3 ?  }
' S, V5 Q4 o9 G8 y  /* USER CODE END 3 */
- |. w4 G* i/ ^" Y/ T1 B0 ?}
. Z- x# {) T; f2 Q2 }1 ^. z) P' G# g/ `; u- a; c' n4 [
) U& E9 T( g6 a6 H- h( _1 Q6 C
/* USER CODE BEGIN 4 */
, O* ~2 S- O! K) R" O/ j* y' qstatic void AppTaskCreate(void)
& B) h2 R0 ~9 k4 y{
$ {+ K$ w. u( a. ]+ C; |        BaseType_t xReturn = pdFAIL;, b! Y5 \- ~5 @$ d7 r1 _
! Q  j/ {* ^2 M8 w
  xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,
# `& {1 G4 a  u1 Y0 O6 v                        (const char *)  "LEDTASKCREATE",
0 K5 K) t* ?1 P7 x/ x                        (uint16_t)      128,5 b' v2 N" e5 o
                        (void*)         NULL,
$ p& n' C) O: t* W; `9 B) I5 C' i                        (UBaseType_t)   1,+ Q) l; `& t# }3 q. Q1 t5 Z" g
                        (TaskHandle_t *)&LedTask_Handle);" Q/ z( c# R4 O: y- k: \; ~* S8 D
  if( xReturn == pdPASS), `: I# M/ m3 _# ]
          f_printf("LED Task Create PASS.\r\n");$ \) O3 u" q5 N* y
        ; |# g6 S* u  s+ O; T$ B% `+ ?
        xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,2 T- K" w: t$ ?2 K
                        (const char *)  "KEYTASKCREATE",
1 F; W4 X8 x) ^" w2 u( p1 I# e/ @8 Y) ^                        (uint16_t )     128,
8 O4 |; ^) p' l. d                        (void *)        NULL,
+ |) e: g9 |) R; R/ Q- H                        (UBaseType_t)   2,; O& V- E8 z* L3 ~  ?" g3 v
                        (TaskHandle_t *)&KeyTask_Handle);2 z4 [8 _( C( v. G8 K
  if( xReturn == pdPASS), f. u% i5 f& Q. p" M3 ], [
        {
1 v) C0 m3 q% h3 R) G$ D    f_printf("KEY Task Create PASS.\r\n");
8 t0 w9 w- T/ X: w: S7 s( F& V    vTaskDelete(AppTask_Handle);
) T! X& R0 u/ H' P; w        }1 x2 G5 U  S: q. H: U( Q3 C8 {! ^
}
2 S0 l# \+ D5 f/ i5 ?# U, J- [static void KeyTaskCreate(void)! ~1 \  y* S* T
{
2 R5 K& _; f8 N* i$ _( {  while(1)
1 J0 Q- l# p( d- ], M+ z8 I5 Y        {
( ~% N/ O% E% u+ r! T, D( [    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
- c# O$ k; x6 `3 x( a                {) V) O* Q  K  L' y6 ?; \6 b; Z
                        vTaskDelay(40);
6 Z0 @1 e: e5 n: z      if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
5 F+ a0 ~* X  K7 b' Q/ n+ u                        {
% `; p  i* p8 o" l& M# j                                xTaskNotifyGive(LedTask_Handle);
5 P; @) x$ |* t) b. m$ S                                f_printf("LED TASK GIVE PASS.\r\n");1 O; z. A' B& L1 N6 h
                        }
8 {& M9 |' S; N* N                }$ r; d/ k. Y+ Q4 |2 B
    vTaskDelay(40);
/ {. f. k/ g& g1 g3 p        }
- |6 O) t: t3 d: W1 n! _5 X7 b( U                - O$ I# H# Q; B* u
}
* h+ T* @+ B7 Bstatic void LedTaskCreate(void)
3 l1 {- t" U4 Y$ e6 @{
& O! r4 l( l0 t( T, j: }        uint32_t ulValue = 0 ;
, @0 s4 a" e( T$ j. x$ I        while(1)
0 Z: O% O  n) }* ]4 U$ n# y        {
) a' l; I' m  q' j# G4 o1 H    ulValue = ulTaskNotifyTake( pdFALSE , 0);
1 f- F/ T, G3 f; W; o                ! |+ w+ k0 \8 ?3 ?7 T0 l
                /*Greater than 0 proves that there is still a notification value that can be % {& M) W3 ^) g  L$ V, y
         *reduced by 1. Equal to 0 indicates that no notification is available, `% I+ u* W# s& ^5 j
         */
6 l( g& D8 y0 ]  t, G- u5 R" a                if(ulValue >0)
/ t4 u5 G6 C9 M2 e, M3 f                {+ n* e4 g% s6 E9 s; @7 `, S  u' M
                        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
/ z% {1 o/ e" n                        f_printf("LED Task PASS.\r\n");
+ ?' h7 t' C" v- h                }                # Z8 t, e+ ?2 S; D9 e2 P
                vTaskDelay(1500);
! ]2 f, J9 Z$ _; T- D        }
) f2 L# s+ C( r- F3 ?! E. E& D}
' u0 f! ^; T# E* U+ i, u+ y+ |
/ z, S# |2 U" u* D, ?/* USER CODE END 4 */& b6 _  A& h- V- ?& ^  i- S

9 l; p* N# R+ x" _9 i代替事件组
" y* R6 ~1 c6 h2 ~5 g. i. k在FreeRTOSConfig.h里开启任务通知& D) ~+ D; n& @4 `" e# P5 o

& X& a9 @' [$ p' A: F  @
  1. /*Turn on task notifications.*/
    8 m8 s! ?3 `8 w! J/ d- O8 n% y
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码
! _+ C3 c; d5 d; H7 Z
在main.c文件里面修改代码
! @* l4 R- W7 E7 f: q& b0 u. S! ]" }0 Q+ G- i3 t. X, y8 G
  1. /* USER CODE BEGIN Includes */
    5 [6 Y: J3 }% t4 {- ]
  2. 7 w, z0 k! e% Z  X
  3. #include "FreeRTOS.h"
    ; w. N0 h2 I. u
  4. #include "task.h") z$ a* w. }' Y5 t
  5. 0 A7 L( n+ y5 v6 S9 B  o3 ~9 F9 t
  6. #include <stdio.h>
    & L8 l8 _  g) s5 m" U; i" a) f
  7. #include <string.h>8 s& k3 G  X' X
  8. " J) d7 ~+ {0 r0 O, @% Z4 u
  9. /* USER CODE END Includes */
    - p# v& A) }1 E7 T1 [$ c

  10. ) T" I' [9 l3 M
  11. /* USER CODE BEGIN PV */. U% I6 [& q$ P. _
  12. static TaskHandle_t AppTask_Handle = NULL;
    5 M* F& A8 t7 s/ f7 E
  13. static TaskHandle_t KeyTask_Handle = NULL;4 G; ]2 C+ P) Q+ g. u! t: M
  14. static TaskHandle_t LedTask_Handle = NULL;3 h4 \% l/ j7 e& S
  15.   w- g) c0 I# G
  16. extern int f_printf(const char *format, ...);* k  |  d- x- ?2 I
  17. /* USER CODE END PV */( C  s2 X2 I8 e1 ]1 j! r

  18. ; J0 o: U* N4 b. G3 \* h; H
  19. /* USER CODE BEGIN PFP */
    ( E! u6 f. a1 O# D$ H* p, \; c

  20. 6 s5 p( Z9 T1 }' Z# r, W
  21. static void AppTaskCreate(void);& w. U- f0 u- J4 K( y' t5 m
  22. static void KeyTaskCreate(void);
    ( k6 m4 Y! _/ J, B3 c# v0 y
  23. static void LedTaskCreate(void);! e+ H! N) y8 }$ L9 s7 U  A

  24. ( O7 ]+ f5 w3 V: d
  25. /* USER CODE END PFP */- ]% I! B2 v4 B; s! Z: I- z
  26. , w3 q5 V# }9 D+ D
  27. int main()- B8 f) k7 \( y* ~
  28. {$ T2 b0 T2 Y- w
  29.   /* USER CODE BEGIN WHILE */# c* N4 a- ^  A
  30.   BaseType_t xReturn = pdFAIL;
    4 {& Q% Q$ e. ?, y% Q" ^  s
  31.         " B$ @& f" H1 y7 v/ L  x7 o0 U
  32.   xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
    # V  {6 t+ r. d. f0 M
  33.                             (const char *)  "",
    0 Z: J9 i' w3 q7 W3 a+ N
  34.                                                 (uint16_t)      128,
    9 q5 H- l; Q2 w2 H7 G- f* p0 d
  35.                                                 (void *)        NULL,% x, `  G8 a$ o: z: }
  36.                                                 (UBaseType_t)  1,5 f- I. z+ q) y0 ?& ~
  37.                                                 (TaskHandle_t *)&AppTask_Handle);
      B9 f* w0 E- |8 c" N
  38.         if( xReturn == pdPASS)/ ~5 i; @7 A' |
  39.         {# h) \( t% ^6 @: q
  40.                 f_printf("APP Task Start.\r\n");; Z/ j: t% ^3 C- u; h7 L
  41.                 vTaskStartScheduler();
    ( a& E, A* M$ r. l. o1 ]- H% }: M
  42.         }$ b% K! @& _& y4 d
  43. - K+ g# P. ~2 H. c: V) x
  44.   while (1)) S9 R/ M0 Q6 u, I& V- v( ?2 o% A9 ~0 S0 I
  45.   {/ H+ P6 c+ }6 ]0 o( x
  46.     /* USER CODE END WHILE */
    + l1 Y2 q  H% [# V3 I. C

  47. 2 s5 g7 K: ]. E. ~2 M, @! _
  48.     /* USER CODE BEGIN 3 */6 ?3 `' @# `4 O9 _3 I' O% m
  49.   }  W& k7 g( I! Z% h5 |
  50.   /* USER CODE END 3 */
    # [& ?0 t' |0 D1 ^  T9 S2 ]6 c# r
  51. }( y' C. M" [2 K

  52. * U. D4 p% b% ~0 u0 s
  53. /* USER CODE BEGIN 4 */
    * O1 N  s" @! N/ O
  54. static void AppTaskCreate(void)6 w; O3 [' I1 j, N% ~
  55. {. n3 k0 S5 k! R/ y& b
  56.         BaseType_t xReturn = pdFAIL;) l# o, C7 v+ E2 l7 T
  57.         
      R% ~( d& y% v
  58.         xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,/ `/ R$ n+ c- Q
  59.                               (const char *)  "",
    " g* ?; R: n& L8 k2 i" c$ t- z# f8 P
  60.                                                                                                 (uint16_t)      128,& u* }# H0 A2 W( v5 z: o
  61.                                                                                                 (void *)        NULL,
      b, `% l8 p$ Y
  62.                                                                                                 (UBaseType_t)   1,
    % j  I* K% I6 g' t
  63.                                                                                                 (TaskHandle_t*) &LedTask_Handle);" `( I3 \0 |6 N( c9 W! y0 Y
  64.   if( xReturn == pdPASS)
    $ W8 D8 H1 G! S* ~. f- l
  65.                 f_printf("LED TASK PASS.\r\n");( R8 u1 P2 T% Y! e% A
  66.         6 `0 l' S4 j9 q6 [
  67.         xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,1 f4 Z5 _9 J% p4 w( ~+ q# W8 x
  68.                               (const char *)   "",
    % U, h( ]+ O$ o
  69.                                                                                                 (uint16_t )      128,
    / t7 {4 U! F* h' }. {$ ^$ X9 @! w; }
  70.                                                                                                 (void *)         NULL,# U: R3 j! \3 P$ e. N; o; S
  71.                                                                                                 (UBaseType_t)   2,
    # P1 g" @+ w( d8 z0 O0 p  S  [2 {
  72.                                                                                                 (TaskHandle_t *) &KeyTask_Handle);/ V! B5 p/ D: X; Z. k
  73.   if( xReturn == pdPASS)
    ; h6 N8 D8 O+ o" ?# ]* H' e8 z1 N
  74.         {8 O" s+ }- j% x( N
  75.     f_printf("KEY TASK PASS.\r\n");3 t& f: O; q5 r1 i
  76.                 vTaskDelete(AppTask_Handle);
    3 R( r& j& E4 X$ z4 c6 C0 H
  77.         }                                                                                ! U/ J( D5 p' g8 X8 b
  78. }
    4 [, e' S; A& g: e+ T
  79. static void KeyTaskCreate(void)
    - x9 U+ X( O  U& v  s0 U0 T
  80. {! V9 R0 S( m  @  S! {
  81.   while(1), y( c! d1 G& _, k, w8 h
  82.         {
    7 M3 }. D9 I7 J& @" ~
  83.     if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)), q! a: T$ R) d; ^* j* ]! g# n" ?7 _
  84.                 {
    ' {. e1 t! p- b' X3 \
  85.                         vTaskDelay(40);3 Z- P  V/ w1 K( ~0 E2 I
  86.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))+ N6 p4 e& \4 S' }8 k
  87.                         {
    # ?8 B/ N+ M, o5 o: p1 j0 H/ y: n
  88.                                 xTaskNotify(LedTask_Handle,0x00000001,eSetBits);, K* U9 U( U5 M# S4 z2 K) m
  89.                                 f_printf("PA0.\r\n");7 \6 \& t1 K( l/ m8 e$ m# \
  90.                         }
    ( G. u  N% D0 B$ T, H
  91.                 }
    . J. x; M0 M4 e3 n8 c
  92.                 else if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)
    , e2 t. M5 U8 n0 X5 z) s, e
  93.                 {
    % ?1 G+ x. {8 e& O; v7 |; _% Y
  94.                         vTaskDelay(40);: k3 x+ C, v9 S0 I% j) }5 g; o
  95.                         if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)3 m2 R3 }: f7 k1 }* u
  96.                         {
    / z; C7 \, \1 e9 h0 d6 }
  97.                                 xTaskNotify(LedTask_Handle,0x00000002,eSetBits);
    0 y4 X) I: M0 s  {8 o# i6 b
  98.                                 f_printf("PC12.\r\n");9 m6 A7 U5 ]. x
  99.                         }
    : {' k; B7 @" X; v
  100.                 }
    % G) I* G1 ?4 ?0 L# X0 ?/ l) B6 g+ C
  101.                 / Y+ }6 P: }6 R7 @
  102.                 vTaskDelay(50);! `( I* P' }1 ^+ p. m5 Y
  103.         }
    8 s# r) S( O5 p" d
  104. }( M8 H; ^. u, i) K* o# q
  105. static void LedTaskCreate(void). r) g1 L6 u* z, d; ~
  106. {9 C/ l& e% ?2 D! Z
  107.         uint32_t ulReturn = 0;- K: S, J( y+ {& k% |
  108.         BaseType_t xReturn = pdFAIL;
    4 C% {' Y* M9 i( B# J9 ?% Y
  109.         while(1)+ E3 D1 A: Z, I! ~- x7 S) b
  110.         {# d0 Q3 _8 @4 D
  111.                 xReturn = xTaskNotifyWait( 0 , 0x00000003 , &ulReturn, portMAX_DELAY);0 E" j8 Z# q) I! \9 _- \% N
  112.                
    + z- r$ W) E; M
  113.                 if(xReturn == pdTRUE)
    ( s4 Q6 m2 ?/ L  ?0 A
  114.                 {
    1 C; U8 O& {2 m- ~6 @4 y
  115.                         if( (ulReturn & 0x1)==1)
    ' f2 `" |) p/ x* m% X
  116.                         {
    , Y7 k& T: Q( [$ n7 h
  117.                                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
    . m; y- |, B5 [
  118.                                 f_printf("LED1.\r\n");
    5 A$ J6 U# t! L* J
  119.                         }
    . r( @4 Z. Y% _9 E9 K: A2 V
  120.                         else if( (ulReturn & 0x02)==2)
    - a0 n3 g; E) p( F7 ~0 L* ~5 q
  121.                         {
    ( ~9 `+ Z- [. m5 C4 I; w
  122.                                 HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);- m( s; Y1 ^2 E$ M6 x
  123.                                 f_printf("LED2.\r\n");. k, q) D" ]& s
  124.                         }
    " m% y  i1 ?8 N2 f' `- J4 `
  125.                 }
    % W2 b6 T( T0 [, S
  126.                 else
    % z/ m( N# ~& p* r1 X* q8 h
  127.                         f_printf("Read Notify FAIL.\r\n");
    + m& P) b) q) I$ y! [* U

  128. ( B1 w# P. f2 y* x# ]9 N# N
  129.                 vTaskDelay(1500);* U3 D9 Y, M' w3 V( o4 L
  130.         }
    " d% S) p, X( @5 p& G
  131. }4 @$ }  G! u. C. s
  132. /* USER CODE END 4 */
复制代码

2 L; O4 I4 b1 D5 M1 k) Z. b9 y0 b4 H8 w& v" |4 }( k
代替长度为1的消息队列0 Q0 p5 p( j( X% P- x4 e
在FreeRTOSConfig.h里开启任务通知4 ?& D5 b- R* U4 r* ?* ?( {0 z
: \9 X  t% M3 M
  1. /*Turn on task notifications.*/9 A( i: W- t/ p" u9 |
  2. #define configUSE_TASK_NOTIFICATIONS      1
复制代码

5 z: c- N: d0 R% o在main.c文件里面修改代码
5 e6 k, r8 z% i( o; M8 l$ D6 ^* q' }4 T* \4 j1 X
  1. /* USER CODE BEGIN Includes */
    " L% w& J: _/ N2 ^# f  T9 W

  2. ! u" S/ {& K$ P( o: \# m( \% x
  3. #include "FreeRTOS.h"
    " o* [- S& Q/ I/ l1 l
  4. #include "task.h"+ J" f- a# O8 _5 u
  5. #include <stdio.h>) {; S. h& v2 W1 |. S
  6. #include <string.h>" m4 N3 G0 n. s5 B- q
  7. 2 m5 s& J3 Q" p4 y
  8. /* USER CODE END Includes */
    9 C1 ^. n* J; Y5 u
  9. 9 n3 V# {# ~- m$ R/ j: [
  10. /* USER CODE BEGIN PV */" f  f* |. Q: T
  11. static TaskHandle_t AppTask_Handle = NULL;$ ?/ P3 ^0 ^+ X2 s* i5 I
  12. static TaskHandle_t KeyTask_Handle = NULL;9 H( K. {. B, I6 n+ r
  13. static TaskHandle_t QueueTask_Handle = NULL;  Q, I( _' _8 j! W( N& G2 M
  14. static uint32_t Message = 0;
    * U. p0 N2 u5 o7 ]" y" r9 u
  15. static uint32_t *printf_value=&Message;
    2 H( b' g* ^, H$ K
  16. extern int f_printf(const char *format, ...);
    : w6 C" c! ~  a4 B9 ]

  17. 1 c8 f7 K' c9 L4 d
  18. /* USER CODE END PV */: P" x3 g+ c" v0 ]9 j" }
  19. 9 ~8 D; ]; U/ Q% Q" b2 N1 a
  20. /* USER CODE BEGIN PFP */
    + f2 \% @; t6 C0 A; n9 H" S
  21. static void AppTaskCreate(void);& y. \2 R, }. K1 y1 e
  22. static void KeyTaskCreate(void);+ {1 J3 A$ Z! P6 v# E0 H1 j( g) ?
  23. static void QueueTaskCreate(void);4 P; p2 m( h# m* }$ f
  24. /* USER CODE END PFP */
    ) p# `5 ~! ~, [5 q: _; b1 U
  25. # x% S2 g# V: P$ j* V- N' @$ r
  26. int main()
    7 x! z% k) I2 y, d! [5 P6 D* w6 \
  27. {
    2 Y: _9 }  [. T( W0 N
  28.   /* USER CODE BEGIN WHILE */
    3 P3 ~& s6 e0 M# R9 E
  29.   BaseType_t xReturn = pdFAIL;* ~1 H3 P, W5 p4 F
  30.         # \& ]3 F8 A1 Y
  31.         xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,8 X* O* Y( |: M- L. {
  32.                               (const char *)   "",
    & Q0 W$ j$ |: @5 U0 `+ Z* F' w
  33.                                                   (uint16_t)       128,
    ; q, F3 z) o/ S/ p1 T$ I+ X  \
  34.                                                   (void *)         NULL,
    $ p/ i2 `: U& s( o
  35.                                                   (UBaseType_t)    1,3 y( s5 h4 `0 V6 v; }
  36.                                                   (TaskHandle_t *) &AppTask_Handle);
    : u, B: H. Y$ b& e- v- T
  37.                                                                                                 2 {  r$ a+ s" {- p  J
  38.   if( xReturn == pdPASS)( A$ W7 U3 U& X" u+ R2 y1 X) p
  39.         {
    ) z! V# k, J) ^9 V1 V
  40.     f_printf("AppTask Start.\r\n");
    # c% c) k) {1 \4 [; B/ V
  41.                 vTaskStartScheduler();
    4 W1 l, @4 T: ]" f$ n4 s; o
  42.         }
    + ?! T; ^0 F: |; v& n+ n+ @
  43.         
    * h+ D$ M$ }9 J& u; n  C
  44.   while (1)
    8 Q5 B% [6 C  F0 e
  45.   {, L) ~! ], N# x$ l/ d0 G& k& E
  46.     /* USER CODE END WHILE */
    ' ~/ L0 B$ h% S8 D1 j& A8 z

  47. . U' e: V, Z' T: l" {+ r( ?
  48.     /* USER CODE BEGIN 3 */9 o9 b5 d6 t3 l4 ^0 i
  49.   }# \% _: d( w. ?) J- {$ C4 u
  50.   /* USER CODE END 3 */7 h; M: h! P5 q* W8 M0 r
  51. }" K& r7 @- y& t, B: v

  52. 1 x# \) Y" m' _
  53. /* USER CODE BEGIN 4 */
    % {' }" {8 B( n' u6 [$ l; z0 v5 D
  54. static void AppTaskCreate(void)& ]& R7 H. c7 n" \4 ]8 T* j
  55. {
    : H" B, S0 U) |9 t; i, d
  56.         BaseType_t xReturn ;
    * X1 n7 e. w0 y
  57.         
    / n" g. m* D8 \4 Z( T
  58.         xReturn = xTaskCreate( (TaskFunction_t)QueueTaskCreate,% M! ^. H7 {3 G0 N; u7 ]" {
  59.                          (const char *)  "",
    ) L$ W) G% {0 [
  60.                                                                                                  (uint16_t)      128,/ y9 _/ f! O* b3 s7 t% A' E1 y$ ^
  61.                                                                                                  (void *)        NULL,, z7 K0 Y$ Q) ~% j
  62.                                                                                                  (UBaseType_t)   2,/ p; B( B6 t  [0 \) i7 Q
  63.                                                                                                  (TaskHandle_t *)&QueueTask_Handle);% n- i. w0 M) c+ c0 C
  64.   if( xReturn ==pdPASS )) S$ l# \+ {- i+ x3 A! z; Z
  65.                 f_printf("QueueTask Create PASS.\r\n");
    4 ], D$ ^/ o) l8 ]
  66.         $ g! h, {0 N% L+ W/ x, x, \4 q
  67.         xReturn = xTaskCreate( (TaskFunction_t)KeyTaskCreate,% H% _, s8 ]# p* w5 w- e+ G
  68.                          (const char *)  "",
    ' [' p8 q- A, `9 H% N7 `
  69.                          (uint16_t)      128,6 P  Z  W2 L( r; ^
  70.                                                                                                  (void *)        NULL,
    " h' E- U8 C" k! i/ s
  71.                                                                                                  (UBaseType_t)   1,/ l5 W1 V/ n- l: T1 Y; N  \/ m
  72.                                                                                                  (TaskHandle_t *)&KeyTask_Handle);3 S- ^+ Q' t. Z% U7 h3 a
  73.   if (xReturn == pdPASS)5 {2 ?' \$ [0 q# _
  74.         {2 a' u/ q) T8 {) Y9 \( T
  75.           f_printf("KeyTask Create PASS.\r\n");6 U3 D1 M( z1 V9 z9 p
  76.                 vTaskDelete(AppTask_Handle);; @, O( B0 y' L  N  Y' V: i
  77.         }
    5 s7 X* s+ q3 o9 @8 _! }/ i: Z
  78. }2 R0 v4 ?# F) o2 l" E4 \/ q4 G" b
  79. static void KeyTaskCreate(void)& k4 e1 ^3 t9 a9 n9 y7 k7 A
  80. {
    + n% b8 @; X+ D  e) S9 I1 d
  81.         while(1)% L) m, x2 J9 z
  82.         {$ w/ c+ `: z' t4 J) w
  83.                 if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))$ H8 G: }( ~% ?8 ^% G- u; P
  84.                 {1 ]4 i! h0 V" w, l* E
  85.                         vTaskDelay(80);8 X! u: B  _/ Y  f3 a
  86.                         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
    ! S. L/ ?3 d! e- c4 M
  87.                         {6 W$ ?' R% g; }* u" c: j
  88.                                 xTaskNotify(QueueTask_Handle, (uint32_t)Message, eSetValueWithOverwrite);; ^5 w& N3 V5 H! q$ a
  89.                         }/ p5 Q  z1 `" h* E
  90.                 }0 c4 w8 t! W4 L) e) o' M
  91.                 vTaskDelay(80);7 Z6 I# q4 Y* g$ ^. W+ c+ B+ ]+ Q, z
  92.         }
    ! ^9 ^; ]; {; j
  93. }
    * P0 x( X' O: r: r- C: I/ f
  94. static void QueueTaskCreate(void)
    ( a  F& ~7 Q& n9 u
  95. {
    9 v5 r' \- C& U. p% d/ C3 N
  96.         while(1)" M' `6 Y+ e& X4 G/ I* l# m
  97.         {
    : I- [. Z9 i" W. t# }
  98.                 /*work.*/5 b$ |0 |! \& }) O: p" o) k
  99.                 xTaskNotifyWait(0, 0xFFFFFFFF, printf_value, portMAX_DELAY);
    0 E3 d9 H+ R2 K; X1 ?0 g
  100.                 f_printf("Message is :%d\r\n",*printf_value);
    - v9 M% n/ y$ ^3 E
  101.                 Message=*printf_value;
    * V0 I$ H3 L6 V4 Y! p4 k" S
  102.                 , E( o6 Y  j9 @8 E9 o* {- t
  103.                 /*The second method works too*/* Q1 N: m7 x( `7 T- h
  104.         /*7 h0 H# P; h1 R. a/ W2 k% j
  105.                 xTaskNotifyWait(0, 0xFFFFFFFF, &Message, portMAX_DELAY);9 A! n; p! P4 O' m, F) K& [
  106.                 f_printf("Message is :%d\r\n",Message);1 S5 H1 H7 K) R( K- O7 X6 s
  107.         */
    + ]% X2 m8 Z' U- s
  108.                 Message++;
    2 I9 E1 {2 E1 ~7 g* T+ Q& C$ P
  109.                 if(Message > 10)2 W! N0 y6 v: f5 K- {
  110.                         Message = 0;
      d4 s6 }2 ?' z6 S2 ]% _
  111.                 vTaskDelay(1000);
    6 w% K; ~/ n& ^, g7 _
  112.         }
    + H' x* g" U; F8 s5 [
  113. }- J3 ]; Q9 B" P9 n# }9 v. x
  114. /* USER CODE END 4 */
复制代码
# p' v. f/ }, w2 X

! e; y3 i- h' v, `; N————————————————9 O4 d7 f. H+ I8 V) C. {
版权声明:SCCELE4 ]/ ?" ^; c( x+ R& ^4 G; V$ m/ G9 q
3 t* m4 H$ Y6 a& ?! o
赞 收藏 评论0 发布时间:2022-10-27 18:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

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