概述
8 P. z2 s" W# }+ E% { 每个任务都有一个32位的通知值,可以替代二值信号量,计数信号量,事件组,也可以代替长度为1的队列。
& l+ b$ y& F- h7 _- u. U W4 H. w+ K9 c( e/ v% P# T* } }
有以下几种方式发送通知给任务:8 x8 j# q) a3 t: N9 G0 {) e
9 V/ w0 J3 S3 x7 Z% D; M
1.有通知未读,则不覆盖通知值
- V5 |: Y& n7 ~. u4 L8 n
! e0 y! g: @& B! G3 Y2.直接覆盖通知值- c/ c8 e1 l( k1 m% }
% k' _5 K7 k6 V9 l
3.设置通知值一个或者多个位,当做事件组来使用9 e: ]- f' @4 ?( u0 I- `5 I" g1 e
; A0 B, E& b+ V
4.递增/递减通知,当做信号量来使用
! J5 y: R" \" t
1 u1 V6 @" u& L! k8 w* ]4 K 有以下缺点:
) L: T/ e( y. i+ q e
) f! f/ c# @% r5 m& a4 R8 @% x1.只能有一个任务接收通知消息/ }6 g% J0 ?2 ~" A
8 p: T5 h U3 c7 t' a! r
2.只有等待通知的任务可以被阻塞,发送通知的任务都不会因为发送失败而进入阻塞。
( O. x7 ]. Y% `
* ^" w, B" A, b4 t& t4 y3 y代替二值信号量 \' J7 M; J M' O* Z0 z
在FreeRTOSConfig.h里开启任务通知
+ z8 A0 E, Y; S5 E! H- /*Turn on task notifications.*/
% \, z" l$ V0 M2 \# b$ |! x2 F - #define configUSE_TASK_NOTIFICATIONS 1
复制代码 + ^4 i+ A* O+ V$ v d5 o, w
在main.c文件里面修改代码& Y/ ]1 t' n3 w& c2 e- C! D1 G
( d( F4 o1 I: S3 h4 v- n
- /* USER CODE BEGIN Includes */
6 _- B- D/ ]- D* F K& e
, U% c" x* ?7 v. u5 M3 u/ p- #include "FreeRTOS.h"
# C7 @4 |7 v. O$ u; @0 g - #include "task.h"
( [% G* h. \4 p& F6 | - #include <stdio.h>
& V# }& }! C& u% T* a, A0 q- j, O4 } - #include <string.h>
$ h. Y9 o/ A' e8 R, P
6 B- S4 R+ Z5 I; C+ z- /* USER CODE END Includes */
2 A- o2 @! N% w7 Y! K. n - + P- D# d/ S2 d* L" Y8 v1 T/ ^
- /* USER CODE BEGIN PV */1 h, _3 {! s' o' j3 v$ v+ T
- static TaskHandle_t AppTask_Handle = NULL;8 O9 u# i Z4 @3 g
- static TaskHandle_t KeyTask_Handle = NULL;
" [5 G' O, M) q) B, `) W. ^5 a: N - static TaskHandle_t LedTask_Handle = NULL;* ]; f8 M4 X5 @% s' L# M' S
; ]8 d: W. z* e3 _2 t9 `) W- extern int f_printf(const char *format, ...);* h, g$ J* \3 a I3 Y# w) D; G
- /* USER CODE END PV */0 V! \1 a$ ?, v' i
' Y5 _) E y; m* P P- /* USER CODE BEGIN PFP */+ |) e0 s$ W/ Y j5 T8 X1 d( g" k
- static void AppTaskCreate(void);
5 u9 m* j& e; Q8 X4 _ - static void KeyTaskCreate(void);
( |; s7 A4 u- [ M1 g c) A2 P - static void LedTaskCreate(void);7 ]" f: ^5 o4 R, N* k! _' y" U, S2 ]
- /* USER CODE END PFP */
( P5 c" z" ?' t2 c8 c
7 X P: D$ C# z* A5 e$ C. x& y1 s& {- int main()" y5 B# ]; y0 E6 }
- {
+ m0 B5 [9 b! p/ b' [6 T
! N5 \' S( W! x' K$ d& j- /* USER CODE BEGIN WHILE */1 q: P- v4 O; P3 L' ^
- BaseType_t xReturn = pdFAIL;
, i' h, l# |/ t7 c4 w6 E -
4 S/ v; a7 f4 o - xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
- Z1 Z# j! F* S: X' B+ n y' M& e8 [6 [ - (const char*) "APPTASKCREATE",
+ i3 a+ Q# J9 Q- @ - (uint16_t) 128, T/ z, v9 p" ^3 ]1 q2 c
- (void *) NULL,
" {2 e& F% x4 t) K4 A, H - (UBaseType_t) 1 ,
5 D u6 h* [ ]' T2 w: Z/ h - (TaskHandle_t*) &AppTask_Handle);- T) k$ T; e' D5 b8 W# Z
-
& Q4 d& j \' K) Z8 p - if(xReturn == pdPASS): f8 l' H' l' I3 L, z
- {
" R5 K* e# k& m! Q - f_printf("AppTask Create PASS.\r\n");
" ~& I% p/ @! b- B" e- i - vTaskStartScheduler();
8 X$ u) d4 i( W$ ^+ a8 } - }
+ E" V- _3 d+ ?# ? - ( V: {1 e4 ?- j# @5 w! E1 I; Y
- while (1)/ p3 \% z, @5 b( A, Y+ ]+ g
- {8 K- W6 q0 V {) k" a2 Z
- /* USER CODE END WHILE */
( d" Y9 S: H4 g* U- M1 t$ Z - /* USER CODE BEGIN 3 */
4 ^- Q+ f- q6 c1 p% ^5 |, F - }
6 I }1 \8 U% Q, c; F1 G; U - /* USER CODE END 3 */
; f# L# L, `7 s2 C' D - }9 A0 @+ ?6 L0 u* {
- ! d- V* s. A1 F- u9 p" a9 F, f7 h
- /* USER CODE BEGIN 4 */5 p; H: ~) A! K1 B0 d
- static void AppTaskCreate(void)
* o- L. r+ B( v+ X( q* m& h" w5 y - {
9 k- u( k* s4 k4 R# O5 \4 s - BaseType_t xReturn = pdFAIL;, ]* X) ?/ f5 n* @% `3 w5 p% O. E3 |: |
- 8 ?! I6 V: @ Y+ ?! K
- xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,. |3 e0 V3 [8 t M2 }* k
- (const char *) "LEDTASKCREATE",! B H8 K$ u* V8 z. Y/ g
- (uint16_t) 128,
# s# f; q+ K5 s) H& n - (void *) NULL,, x" L+ S- y, j5 O2 ]) i
- /*If the priority here is the same as the key task, printf will not print it out. */" Q0 T) `; t6 l: w
- (UBaseType_t) 2, - P2 t% S: Z2 @! L- u# z, t' L0 \' Y$ ?
- (TaskHandle_t *)&LedTask_Handle);( H0 w# P! g# T' e- Y; ^2 n) ]
- if(xReturn == pdPASS)
$ |$ I5 \8 Q6 T4 H* \ X - f_printf("LedTask Create PASS.\r\n");
) j- p+ t/ Z& z( c( j0 x& u -
5 ^7 i6 `0 Z' o& m' q - xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,/ m2 _5 _- X% [ a% }) q; I
- (const char *) "KEYTASKCREATE",
% ^4 _% t4 {. W) o% c! f1 X$ ~ - (uint16_t) 128,
) d9 I. D2 l% t& t" J9 E; m - (void *) NULL,
+ y% i- B* }6 e8 F' m0 g4 f! [ - (UBaseType_t) 1,, b3 I, `6 k2 s7 ~
- (TaskHandle_t *)&KeyTask_Handle);7 e& m. z7 \, d9 _5 Y0 z5 K
- if(xReturn == pdPASS). E5 [/ _( p+ t2 ?% l U S0 m: M
- {. b4 O0 V1 X& H2 K( d- ?% f
- f_printf("KeyTask Create PASS.\r\n");
+ A' r( f9 R9 b6 O - vTaskDelete(AppTask_Handle);! s s$ s1 v! p! }- f
- }
: B q+ ~/ F4 j+ l; ~ - - d6 Y) _- u, C: A9 l
- }
5 z: p; p: u# |9 m5 Q) r7 W - static void KeyTaskCreate(void)% [+ {: H3 G! e3 s2 U. D, D
- {
) T, R6 E2 R! m5 l - while(1)& F! \% M. b0 z! b% s" L' u
- {; ~, \4 L8 ]. d* W
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))7 j# i0 x0 E- u0 e! W. S
- {
7 I: Q% x, z: f' B6 A: e - vTaskDelay(50);" D# ^! E8 R- y1 \4 l5 ^+ O# P
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))/ }: H. A- i X7 z& W- T; K' ]
- {+ m% b6 b1 Q. C' g: _5 {
- xTaskNotifyGive(LedTask_Handle);7 v% S! m& e4 w8 S, b k: ?
- f_printf("Give LedTask_Handle PASS.\r\n");
' ?2 d& k9 b. n( ^ - }
7 ^* |; x. _4 F- S% J - }% o0 W2 V. p5 \4 o9 L3 H( G- C
- vTaskDelay(100);# X7 W. r$ U) Z& v' ?! @
- }
8 U- {1 O% l2 B - }- l- Q% b6 S' S+ h2 t, k g- ~
- static void LedTaskCreate(void)
1 y; G" L: S& n2 t- r - {- ~3 Y! v" ^" q! U
- uint32_t ulreturn=0;
6 c' Q. \# ^+ L4 q N/ F/ s - while(1)
$ t; [0 [2 m5 J0 j/ m9 q - {! C1 Y, u( q- J
-
. f3 `. ]7 J1 m Q. K - ulreturn=ulTaskNotifyTake(pdTRUE,portMAX_DELAY);
3 \6 ?& g* z7 l& G+ \ - if(ulreturn==1)% J5 K0 J# b m
- {
. b/ z- Z2 P3 r- W# Y - /*It won’t be printed out at the same level*/
- U) t3 e- n9 | - f_printf("LedTask TAKE PASS.\r\n");7 M% o5 \ ]3 ?# u& {* o5 B! C& K
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);9 G2 W1 i: Z2 e( j) L" P
-
. M; ^2 Z/ A' o0 R, s# U# z" G. _( K - }' n8 `' S( F# k
- else
' W% m$ O2 b j$ X0 e6 ` - f_printf("LedTask TAKE FAIL.\r\n");
8 @& d j+ y$ R# ^; g; W - vTaskDelay(100);
! w$ W8 s( \6 J0 J$ B$ z - }1 b+ G E2 z1 Q
- } S5 l# L5 u- Y/ ?4 N' ]0 s8 F
- /* USER CODE END 4 */
1 U) I, R) t6 k6 j# R- j( P0 `; G - 代替计数信号量
& c' N Q7 j0 ~, |5 \ - 在FreeRTOSConfig.h里开启任务通知
, J1 L# d+ m! P - : r% o4 W6 S* G5 p7 |% l
- /*Turn on task notifications.*/3 N2 b3 g7 {4 \ ]& c4 j. n
- #define configUSE_TASK_NOTIFICATIONS 14 o& t( m5 g/ ^% N
- 在main.c文件里面修改代码- j9 t3 {) [) b) G
- # {/ U0 z! p ?" H0 q
- /* USER CODE BEGIN Includes */( J2 R( |5 I2 a' k
- ' [% Z$ R9 J* u- m0 l
- #include "FreeRTOS.h"8 h4 Z6 K2 J- X; F& S
- #include "task.h"( H4 s3 ?# w" t! H
- #include <stdio.h>. W1 b8 f' k- a0 n# B: B* T& \$ C
- #include <string.h>7 u# M' @$ E! N
/ ^' u! t+ g* r/ W3 {+ d- /* USER CODE END Includes */
5 X+ t* b8 K; N. N% Y
' m7 l5 g! y. t& n0 ?% a& @9 A- /* USER CODE BEGIN PV */
& M; A+ J5 V* K; V - static TaskHandle_t AppTask_Handle = NULL;
& I. T8 h$ A1 G1 \8 q) f - static TaskHandle_t KeyTask_Handle = NULL;
2 x, N3 e5 S5 k$ q: ^ - static TaskHandle_t LedTask_Handle = NULL;
, g! [) y+ L d* P1 X( q; y& w I8 r/ z
" @: x2 D8 X D* K4 K- extern int f_printf(const char *format, ...);7 e3 W1 l+ Y0 T1 l" E _! @* ^
! f5 e# H- e% U- i# L0 U- /* USER CODE END PV */4 I- D5 ]" v6 T
- ( D2 x3 f7 z" n G1 Y9 Z
- /* USER CODE BEGIN PFP */& j, C w& }+ t- K. X2 X
- static void AppTaskCreate(void);
3 `& P- a& O* i2 \ - static void KeyTaskCreate(void);
! u6 N0 v9 o9 O8 N* | - static void LedTaskCreate(void);. ]# u8 K4 d2 N) F0 j; M
- /* USER CODE END PFP */
2 ^( h& y6 r% a1 |
# ~2 `1 O* b( S- int main()
( }4 V9 ~" J! j) @% S$ E' |2 ^ - {, L( r' v F% \" _- U5 z3 a
- /* USER CODE BEGIN WHILE */
' ]4 z9 B- J" g - BaseType_t xReturn = pdFAIL;
. W7 i/ A- U# Z
9 R# R3 ~7 U8 f1 a7 U0 f. b; Z- xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
I# B/ ~. ]5 p0 l - (const char *) "APPTASKCREATE",* I- _" E2 p- J
- (uint16_t) 128,
9 r/ r" s1 |' d$ O; {# ^ - (void *) NULL,
4 X# Y Q- Y+ _& q/ F+ _. b - (UBaseType_t) 1,# u/ f- t8 ` k* e2 R
- (TaskHandle_t*) &AppTask_Handle);
# `. c/ G& [. f" K, I% O& j, L# D
* i7 I: z) x7 y' D" P- if(xReturn == pdPASS)
- v& _* w, Z) b y8 O5 O' @" D - {
$ q; {% n. H7 y: `; N - f_printf("AppTask Create PASS.\r\n");
; a6 k' n* ?: l9 R - vTaskStartScheduler();: p7 v! X y' r ~) T |
- }
% M, P- U: R. U6 Y2 u - while (1)4 P4 v8 r$ h! n* N6 \ h5 C) e- D. G
- {1 y. W1 @5 l; |' Z. _
- /* USER CODE END WHILE */
x3 @5 L2 n) J: W7 |
" |4 y' [! `- R* w- /* USER CODE BEGIN 3 */
; L/ X7 k6 r8 o5 Y6 n - }0 o3 B# l' ^3 ^
- /* USER CODE END 3 */4 Z" { A6 ]% U, V& e# U$ h6 J
- }
m$ B* m6 T! S9 C# y7 V - % T! @9 W( P! d# s) j6 H
- 7 i8 O/ V) V- a3 h7 p# y
- /* USER CODE BEGIN 4 */1 p9 p! U+ D q$ t
- static void AppTaskCreate(void)) p5 ?; }5 J, m2 `8 O
- {: {# \# J' {+ m0 [
- BaseType_t xReturn = pdFAIL;) s( [- z% C V
- 2 y- H* x: I! R" d2 Y1 n5 Y! ~
- xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,, E- Z6 I5 f& ]7 X0 T- L7 ^# E
- (const char *) "LEDTASKCREATE",
q; v' P: ]6 @( ~5 t - (uint16_t) 128,6 M8 Y0 G4 ]; N
- (void*) NULL,
0 k b4 |" p$ x0 U - (UBaseType_t) 1,/ w1 O' |! p% a+ Y" D1 r
- (TaskHandle_t *)&LedTask_Handle);: l& _. s6 p5 _& g
- if( xReturn == pdPASS)9 u3 U( \& H) R& f
- f_printf("LED Task Create PASS.\r\n");
. `$ H1 ]' R$ J - 9 W$ {7 H, r- Q5 ]+ t8 n
- xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,* ]+ N% G9 d; G
- (const char *) "KEYTASKCREATE",
6 q1 E1 |3 x. ?/ m) n - (uint16_t ) 128,. J+ b3 u" f0 J1 X
- (void *) NULL,9 t- M5 S9 O* b+ D
- (UBaseType_t) 2,& m- F0 E# ^0 m# E* a% j
- (TaskHandle_t *)&KeyTask_Handle);0 B; s" }: D0 _. D
- if( xReturn == pdPASS)
3 p* N; s: F* k1 g: A' w) r - {% e) m, \$ x8 w# G6 E3 m! j( h% |
- f_printf("KEY Task Create PASS.\r\n");0 w" y* \5 {7 P! g Y5 m/ c
- vTaskDelete(AppTask_Handle);, \% N0 }3 ]" ^ D. \5 k8 o4 m
- }
; A: L( }& }4 q& v - }+ ` I! }' z4 [) S0 h- ?6 N7 }9 {
- static void KeyTaskCreate(void)
( W" q+ I9 W, x. }9 [ - {4 Z2 Q( l7 ]5 p; Q3 s! L
- while(1)
9 T. v1 h! }& H$ E - {* q w) T% p( M' }0 z- g9 s; E% X
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))4 W% n: `3 ]$ s* e0 Z
- {3 F- C0 j/ R; n
- vTaskDelay(40);8 b4 [+ C# s* [' ^
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
9 L( N0 d* B7 G/ Z - {8 f3 z4 |; S+ E/ i3 M7 {
- xTaskNotifyGive(LedTask_Handle);$ ^; I3 j( Y6 D9 u5 K
- f_printf("LED TASK GIVE PASS.\r\n");
4 D6 n1 l" g+ j5 \/ H - }
: I+ d j5 M g7 N. H3 v$ g - }
: D4 i+ ~3 n% O) S - vTaskDelay(40);
3 @1 c9 Q8 k8 U - }5 N$ o& M) z& m! B
-
" n" {: T1 T$ ? - }
/ a" i" m" I7 e0 G$ A7 R - static void LedTaskCreate(void)
* ]. G. L$ v) H! t1 n0 R, G% { - {. B% T( d" |, z0 ?
- uint32_t ulValue = 0 ;/ `8 c0 H4 B2 p, G, O6 M
- while(1)
0 N- D7 t; V; n2 H# C$ G3 e - {' {: S0 T! @! A2 a" y- d ]- w: x
- ulValue = ulTaskNotifyTake( pdFALSE , 0);- t: v% C+ n! c* Q! s! K( W5 V
-
$ x1 a& u3 ~( g) e6 ~8 O# _ - /*Greater than 0 proves that there is still a notification value that can be v4 F6 t4 L# J* L* w
- *reduced by 1. Equal to 0 indicates that no notification is available
3 G% j# }' |- w$ h; h7 A% j - */
% w4 l) s% _/ Y* e' t0 e - if(ulValue >0)! S. m/ U( K7 k6 s7 u
- {5 w: S k2 T: B( d4 |9 u% N
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);9 Y/ }& B: E, }" ~1 v' L4 l
- f_printf("LED Task PASS.\r\n");
% [( v% Y- k1 w& G, v; M - }
/ M! \* {2 J; F( W8 ]9 y - vTaskDelay(1500);
" g" c) U9 d5 V" E! K6 N5 M6 G; ` - }# p5 y2 M& h/ Q0 R& S
- }
1 M9 Z8 F% c7 N& p% T7 L
6 ~6 y5 l& @7 G; `" H9 Y7 e- /* USER CODE END 4 */
复制代码
+ p6 A* I2 y* v5 t0 W% c" |' R9 i代替事件组
! z9 G* V9 Q. R在FreeRTOSConfig.h里开启任务通知$ Q7 R3 {# I' l
4 T8 p2 h- W- a9 a" r$ B
- /*Turn on task notifications.*/
) G& M' E2 n7 r - #define configUSE_TASK_NOTIFICATIONS 1
复制代码
" c' q, v; t/ i; Z* U! v6 H, @3 w; t在main.c文件里面修改代码5 j4 [: h' z6 C/ j
N, s4 r9 W4 \9 a- k
- /* USER CODE BEGIN Includes */
0 c' `! e, g5 w& @
/ m. w2 _+ t8 I2 w1 A: I% J7 T- #include "FreeRTOS.h"
- W; {, _9 ^! ? B - #include "task.h"2 o2 F, w- a2 z! H" u
- ; u. n3 t- C, H$ y" i, ~% U. g
- #include <stdio.h>, j' t1 n& k8 B; B3 ?; l& }
- #include <string.h>
5 d+ d2 I {) L - Y! q$ U8 t* W" I
- /* USER CODE END Includes */) ]* a1 P+ H. c1 A/ F1 E# {
! {$ |/ W4 v1 h) e+ S- /* USER CODE BEGIN PV */
: K& Q# ?. D' D' @1 l; \ - static TaskHandle_t AppTask_Handle = NULL;7 t$ c- `; b# n( C4 h2 j1 t
- static TaskHandle_t KeyTask_Handle = NULL;9 `# M5 B& m/ l" z, v
- static TaskHandle_t LedTask_Handle = NULL;9 v8 j0 [* w& }. G5 p
+ R1 o, d( C+ x4 g" {& J1 i9 B- extern int f_printf(const char *format, ...);
$ K( `6 y7 [! v% E( A n - /* USER CODE END PV */
b( Y0 M h; D( C& V" B - 4 `, U& [; ]% y4 Q4 k
- /* USER CODE BEGIN PFP */
; [% B5 g1 i; f - 6 z% ~' f2 u9 t4 h/ w
- static void AppTaskCreate(void);, {5 C8 i5 T9 E
- static void KeyTaskCreate(void);* j) {9 Q- V/ r/ ~- X2 p
- static void LedTaskCreate(void);8 D: u- b, K- n; q
+ s" n8 S( B! C+ l1 a4 l$ P- /* USER CODE END PFP */' @* ~' t! m$ J* L. K
: I3 A! [; q8 ~1 B/ [) l/ v- int main()5 S/ E9 k7 B4 j7 a6 N7 r
- {3 n/ U( ~' ~% {+ g% P6 W! O1 I* a0 l
- /* USER CODE BEGIN WHILE */
- A1 [2 @6 o$ E: ^5 L, X - BaseType_t xReturn = pdFAIL;& S& x+ C# B& s Y- m+ q7 Q
-
# _6 d/ c6 S: m6 O( p5 g5 Z9 p - xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate, ^2 L* w$ b: A% g% Q: s
- (const char *) "",
% W* q- U0 J. b) t2 w - (uint16_t) 128,8 q" f! R) ^- J
- (void *) NULL,
: _2 o/ m8 ~4 q3 [ - (UBaseType_t) 1,
v' V* T3 ]0 {6 a& Q) v% D - (TaskHandle_t *)&AppTask_Handle);
0 ^ B# ~0 A5 |" G/ ?1 M1 p - if( xReturn == pdPASS)
. J7 y: q1 {8 f; g; g5 T& x& v - {4 V9 Z% n' ^0 J6 [1 i
- f_printf("APP Task Start.\r\n");
) p' o# _) R7 G& [2 n# [6 F1 R/ G" A - vTaskStartScheduler();
% E! u: P* q; e7 p6 S5 @ - }
L" g$ ~! t6 B ~ - % k$ z* i+ n7 f& V. q" n
- while (1), c* I: B. x C3 S: L2 {
- {4 P; O# |5 E9 ~; ]1 F6 B) ^
- /* USER CODE END WHILE */+ ^% D5 P- z" t* h, y o @; q
0 `5 w v3 V2 p: W. o- /* USER CODE BEGIN 3 */
. R; V6 R5 I Z, e - }* d( P1 c$ s; x( Y' N+ l
- /* USER CODE END 3 */
+ G+ [# h/ i2 U/ C - }
; ~6 a2 @) C! k6 P# t2 V - 6 o* O# y( N1 ?6 z: F4 D
- /* USER CODE BEGIN 4 */
# q! @% [' _, c6 Y0 T$ P5 `5 { - static void AppTaskCreate(void)" Q0 g7 q" {4 J+ p3 W) O
- {
4 K) L3 V2 L Q# L* O) G - BaseType_t xReturn = pdFAIL;
$ V2 g; _, c/ y - : E+ M) O }' x0 {% p
- xReturn = xTaskCreate((TaskFunction_t)LedTaskCreate,
& k5 `; O- @& ~$ T% e3 W; G - (const char *) "",
/ @ ^9 m! q' \( n - (uint16_t) 128,
7 h# b# U# b8 E& W - (void *) NULL,
0 O/ ^# Q) d7 P! d$ f8 ]4 P - (UBaseType_t) 1,
& J% H8 T | o) t- P2 G - (TaskHandle_t*) &LedTask_Handle);
: \& _% n- m& W+ P - if( xReturn == pdPASS)
; E# v( W [$ ^5 O! v% _ - f_printf("LED TASK PASS.\r\n");: r) g: r7 t2 l3 z G, \. e% U
-
/ [; {/ ^+ p# k% ]& N% R, P8 g( V - xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,
9 L( N" r0 I4 o1 {6 Z( v - (const char *) "",! ]" b2 M, \2 j8 R- i3 ]
- (uint16_t ) 128,
+ z# I: G( c" `3 i) Z A8 L9 r0 ` - (void *) NULL,9 w3 C) \* I7 A3 [+ k% F. u( x. a
- (UBaseType_t) 2, v- T: G9 Y3 U' S5 z
- (TaskHandle_t *) &KeyTask_Handle);
9 C7 f4 K- x* A# S2 G9 P# g5 I - if( xReturn == pdPASS)
3 O% g, i4 l% t7 b! F n9 g - {1 N, |& Z! h- W6 e F7 g
- f_printf("KEY TASK PASS.\r\n");
$ i7 Q1 }0 c6 Z- q2 i - vTaskDelete(AppTask_Handle);4 M2 F9 Y0 o7 s8 X, \6 a
- } 1 u; O$ s9 V- n+ u0 m# E3 N7 N
- }
8 @- F. o& W# o1 j* W$ i - static void KeyTaskCreate(void)
4 r/ z7 ?: G ]3 ]5 {6 L - {
3 N; P' y1 I7 j - while(1)
; `# [1 x" T, [ - {! p) ^/ e* L3 n# J' Z
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
$ ` v% ` n/ ]5 G# v- V8 Z% q6 N - {
! u3 Y' r* `* ?& I3 p4 G! y% s7 M - vTaskDelay(40);" x w! ^+ q; t# V. S
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))! m: A. M* H$ |
- {9 G l1 f {) R8 i6 c7 `/ c0 P$ A
- xTaskNotify(LedTask_Handle,0x00000001,eSetBits);
: f, c3 [0 A8 S+ B - f_printf("PA0.\r\n");+ Y' r, S. ~0 N6 k$ M; I
- }
% }0 ?( x, S$ @" v6 D: { - }
, y4 C& B6 Z2 a9 P( }4 [ - else if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)6 b! H" B8 v0 X2 u! o# j- c; ~
- {/ i- b! T+ y8 J4 q
- vTaskDelay(40);
- D6 Y9 b6 K5 R - if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_12) == 0)3 c! z# l& j) f9 z
- {
) Y; q* x0 S6 n6 N. G0 O - xTaskNotify(LedTask_Handle,0x00000002,eSetBits);( {1 U3 H) V& ^1 R
- f_printf("PC12.\r\n");
# {# W3 [. n1 s1 b - }, J3 l3 N& z3 p: T4 `$ I. x8 L
- }8 D7 w; e& O" X$ e
-
* x# B+ P+ \2 K4 F( | - vTaskDelay(50);7 C. z' X6 }+ ?' T- B/ j
- }' h3 r/ z; A" b: N9 A$ a3 r
- }
# Y) v" }9 L( A" F% T, b0 ~. g - static void LedTaskCreate(void)
5 m, v: W1 x* I8 @9 X - {+ f2 S8 \. o' J6 p
- uint32_t ulReturn = 0;
. g# w) @9 Y. [8 f% O! b - BaseType_t xReturn = pdFAIL;$ N, |* A9 _+ Q* M1 q
- while(1)! c7 G5 X1 m; {5 \
- {# D6 m. T' l6 w3 l5 W# I# C# g
- xReturn = xTaskNotifyWait( 0 , 0x00000003 , &ulReturn, portMAX_DELAY);
7 o9 N2 G+ i! R -
% t' x0 L% N' c+ V/ L( @ - if(xReturn == pdTRUE). L0 \7 C1 M$ F# [
- {7 B4 h M% a1 e2 S, g2 b/ h; d3 y
- if( (ulReturn & 0x1)==1)% Z/ D, k! i& T% h/ I8 c/ A
- {
+ d* Q( s" Q% E' P( W; C2 A% k - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
( H. l' t3 F* y1 |0 @% ] - f_printf("LED1.\r\n");
4 h& b9 W- Q4 C/ b9 z+ U$ K/ ?9 T8 y - }2 A7 k2 f3 j' ~# P
- else if( (ulReturn & 0x02)==2)
3 ~- B; v- U& f: n1 l - {
0 j' J1 Q Q4 |4 v1 t- D8 K4 ^ - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);. G% I/ ^& s- d- E5 e/ F
- f_printf("LED2.\r\n");
" P4 [( E8 d2 E4 {3 z - } |/ C2 k- H" w6 s8 M( |* ^1 }
- }6 t2 ]; H8 c& J( `8 x* i5 Q& O
- else* X, B& L; `! {# B) p
- f_printf("Read Notify FAIL.\r\n");# Z$ _6 R! l2 J
5 V' W5 L* Z& k6 K8 K! }- vTaskDelay(1500);% b- {! e. Q% d" M" ~" S
- }
% L* {1 `* [! B3 l5 F- j - }
, X# N6 F! X+ L3 p/ J) _ - /* USER CODE END 4 */
复制代码
% B3 |4 H2 I- z" k. k o代替长度为1的消息队列
3 ?6 x8 E a m; m5 w$ H! a在FreeRTOSConfig.h里开启任务通知( r$ N5 t& ]+ ^% B
- /*Turn on task notifications.*/$ j2 v" p# n( R9 O' |0 Z% X: i# C
- #define configUSE_TASK_NOTIFICATIONS 1
复制代码 9 Y+ h* n8 u7 ^# K% h" b, X+ u7 F" z
在main.c文件里面修改代码$ n) F% V0 x' \
( v0 k( C/ W8 `8 M. v
- /* USER CODE BEGIN Includes */. c& v* m, u( Y3 b) u- s1 o
% B+ l( v: R/ o- #include "FreeRTOS.h"
6 x [, A- q' j/ \( C6 ~ - #include "task.h"8 g( }* r' A( }2 L, h! R
- #include <stdio.h>2 o% u( ~; t9 Q/ l' m
- #include <string.h>
6 u' [3 b6 w- \/ c1 y* Q9 u
! t1 `/ o. b$ S' ?, X- |- /* USER CODE END Includes */6 R; [' l, I7 @ i$ ^6 K6 v
- . R, S; L, T+ y) I$ X. ?
- /* USER CODE BEGIN PV */
3 E+ c- S# S" o2 q" { - static TaskHandle_t AppTask_Handle = NULL;
3 f" N4 [& ]0 w: L - static TaskHandle_t KeyTask_Handle = NULL;
R- ]" h9 x" j6 ~. y* h/ k - static TaskHandle_t QueueTask_Handle = NULL;# }7 a' H0 W! a* d+ q
- static uint32_t Message = 0;! f6 h) r* ~9 c/ G) ~) f3 g
- static uint32_t *printf_value=&Message;6 A( [% I+ g) c
- extern int f_printf(const char *format, ...);! @; Y- o& }% [* c2 A" y# t
% }) D/ G! s, D5 g- /* USER CODE END PV */
2 F7 c5 ]( }/ G: k/ H# r, C$ w& Z
" K4 ^8 @2 N: U8 _" q4 G- /* USER CODE BEGIN PFP */
9 T" h9 q4 s3 [3 m; C - static void AppTaskCreate(void);2 ` n. s$ I" |* \/ y
- static void KeyTaskCreate(void);4 {/ j( c5 r, b' f$ n* `4 M9 W
- static void QueueTaskCreate(void);0 M: Z2 d+ x- ^# t: `) s9 Z; [6 q `
- /* USER CODE END PFP */
9 Z4 F9 O2 }% a y5 O
. X' b7 j" g/ I+ q- int main()+ t9 k. `/ ?; s* N; R3 r2 D
- {
$ k* \& D" `( I* g! Z4 r8 Q2 b/ o - /* USER CODE BEGIN WHILE */. d, _) N, U! }% {" z
- BaseType_t xReturn = pdFAIL;* _- p. m, Y* N/ x5 ^! E/ ^
- ! f j+ A7 \3 T5 x) X
- xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,
% Z, G4 _) @3 K7 t - (const char *) "",
" D" V) l9 H# q: ?8 ? w) @ - (uint16_t) 128,
6 d, M* P5 e( g - (void *) NULL,, Q9 [/ D/ o3 L$ C
- (UBaseType_t) 1,7 G% Q! d; P) d3 u
- (TaskHandle_t *) &AppTask_Handle);
; Y7 o. ]) \+ n+ ~3 i' `1 p - 5 m% W0 b$ w2 j! f& A
- if( xReturn == pdPASS)4 i- P- b# j" K8 n2 U1 K
- {
2 k0 Z# b/ n* P% I) M- H5 ?0 X2 p9 c - f_printf("AppTask Start.\r\n");! ~, M5 c; Z0 X) o+ j" w
- vTaskStartScheduler();
* m/ |5 A6 a; |) O$ @$ o - }$ E; r, [ C4 x' d$ l4 K1 T
- ' n, Q# @& ^2 o
- while (1)
) h6 P! y) v( J2 D0 V - {
. c5 V" N( n; I7 R0 x - /* USER CODE END WHILE */
! d# P. D9 s' p5 O9 ]% ` - 7 B0 J. g, I' f0 l @
- /* USER CODE BEGIN 3 */! T8 `' s8 ?0 n* W
- }
7 P$ R+ D" S4 j - /* USER CODE END 3 */
8 e, U) y7 F* _+ N' @8 Q, a - }6 ~2 S ~& K; R( P+ ?) h
- , T3 P; m( ^% V( P
- /* USER CODE BEGIN 4 */' v& d/ J+ m) Y* R* A
- static void AppTaskCreate(void)
, h" Y$ |6 {2 u# Q! E; A - {
( ] P2 g# o* X2 z# N9 U - BaseType_t xReturn ;
) s( X. p" G9 Q& L) E! d* W5 c -
i: }8 z: } J' l - xReturn = xTaskCreate( (TaskFunction_t)QueueTaskCreate,
; r5 F4 F# c, w - (const char *) "",1 m2 A1 L4 P6 Q3 D+ Q+ G. \
- (uint16_t) 128,: t5 V! a3 M' w; w- y: h
- (void *) NULL," S0 d8 R& q& n5 s, p$ d
- (UBaseType_t) 2,
# P+ v/ P( f: U# }$ e - (TaskHandle_t *)&QueueTask_Handle);1 D! W! h& N; S/ P R
- if( xReturn ==pdPASS )
* \7 t7 _0 I1 F- l7 x - f_printf("QueueTask Create PASS.\r\n");2 L# V/ h# i% T b9 M
- 5 \ d7 v4 T' h! {' T8 E
- xReturn = xTaskCreate( (TaskFunction_t)KeyTaskCreate,
9 {: ~0 S( q. v3 P! B: X: d/ ? - (const char *) "",1 X# s/ `% r' K: o" f( u% \4 r0 q8 m
- (uint16_t) 128,
% v8 v0 H3 N0 t8 H |; n; H - (void *) NULL,6 P- r h4 e. M& F+ F
- (UBaseType_t) 1,
3 r5 r _& K7 G; b' J Y. v: j - (TaskHandle_t *)&KeyTask_Handle);) O z1 Y, U9 K, |& r
- if (xReturn == pdPASS)4 g6 m$ w( Q' ^2 ~
- {
5 f( r0 l" c! i0 S2 B$ M# { - f_printf("KeyTask Create PASS.\r\n");
6 [+ a# N- v, v - vTaskDelete(AppTask_Handle);
; Z' c1 }9 Z6 {5 B4 h! e* s' r8 { - }
, W, q1 p& o& V- u - }
+ o2 ~1 c5 K n, a3 @: |- k. c0 p - static void KeyTaskCreate(void)
8 N y5 x- ]" b; r( ` - {
) U( c7 L( K6 R8 \6 H" k8 t& f - while(1)
- f/ _; N' Z: c" C/ z) F - {
6 X2 B0 S) U% v( w. y( G3 g- X - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)): R; k; q* x* _
- {( m# f9 i1 Q( [, [; ~0 C: X$ o
- vTaskDelay(80);
* y9 ~* \. E5 l) J% }7 H - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
1 m2 v9 n, W* v( `$ o0 A* \9 W& t - {
' x( l, z1 R. Q1 W - xTaskNotify(QueueTask_Handle, (uint32_t)Message, eSetValueWithOverwrite);
& \- n c9 M5 ` C - }/ f& M) k5 p% E
- }
8 Q2 \; ?+ }( W+ v2 }: S3 y - vTaskDelay(80);( N5 z9 S) I" d" ?' p# I( D' f3 y
- }
: X8 y4 B. l6 G6 B1 }2 C - }% U" p& N4 i8 r& G* f. i2 Y
- static void QueueTaskCreate(void) O( N+ I: s7 c9 V$ T5 E; O
- {: ]* }+ D$ m1 S1 s4 p9 u
- while(1)
8 {7 } X$ L/ Z: m - {, m- l0 _4 L* j+ g
- /*work.*/5 I( ?9 K2 |. b) Q) i, M/ t- D3 m+ k- b
- xTaskNotifyWait(0, 0xFFFFFFFF, printf_value, portMAX_DELAY);& v5 C) x9 H1 _1 Q, s. C/ p
- f_printf("Message is :%d\r\n",*printf_value);
# @) }; R; W) f# S - Message=*printf_value;) |+ C( |7 a/ @; @1 P( f
- , L' h6 u! t4 Q
- /*The second method works too*/
0 R3 [2 C( k; F% K8 _$ O: ^; V - /*
H9 ^4 p4 }2 O9 Y1 }: c4 e - xTaskNotifyWait(0, 0xFFFFFFFF, &Message, portMAX_DELAY);, A. [, W2 q, V% \
- f_printf("Message is :%d\r\n",Message);% o9 s4 ]. h4 w" R
- */
+ A+ e1 B+ V' v - Message++;
2 Z, L) l8 \. J4 l: t - if(Message > 10)! N- ~3 X: w7 }! b! l I
- Message = 0;5 s0 J2 t* ^" M, `/ v r
- vTaskDelay(1000);/ m: x7 }. m8 k0 o
- }
* |! q" {! l* _" O$ W3 y/ r - }
- t- n5 _2 Y* p: X7 U1 [8 X% b, ` - /* USER CODE END 4 */
复制代码
3 ]! w( [6 A- R0 e- i0 ?- U
% e( i+ Z0 B( \8 H7 I
( S( }& }0 R/ ?: Z7 v" O, S |