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