二值信号量的用法示例
! J& n, i- Y* c) D1.创建好带有printf-stdarg.c的FreeRTOS的工程
- Q1 P c5 Y, q# R0 X
0 E8 Q6 d4 c; h' y2.修改main.c文件
7 p1 C3 r. P2 n
! v5 j$ q) L) r) ?+ O- /* USER CODE BEGIN Includes */: U |5 N. u8 {7 Z0 _. d
0 ^$ a2 F0 L+ } _2 q: b6 Q: j( E- #include "FreeRTOS.h"
9 i6 E. n; E3 u/ P" F - #include "task.h"5 N8 C# @% p' I& E( b. `
- #include "queue.h"
3 t, d$ w8 `# d8 _1 x/ A) \' b - #include "semphr.h"/ K) W) y# F5 I
- #include <stdio.h>
+ V! p* x* p& O/ d1 N, B - #include <string.h>
9 V) b }# U& R" D& s - s2 R9 M, |& A7 m8 B! q( d
- /* USER CODE END Includes */
}( h3 L% t7 e. d1 z9 J) N - /* USER CODE BEGIN PV */3 h( \$ o+ s- U
- 5 E4 `# x/ s' \; u+ v
- static TaskHandle_t AppTaskCreate_Handle = NULL;! S/ E* F/ `9 X' p7 r
- static TaskHandle_t KeyTask_Handle = NULL;- C) G% R' @* S1 W" D7 }. ~3 o* }* r
- static TaskHandle_t Led1Task_Handle = NULL;5 X. V+ u" x0 j9 C0 X
1 v/ ^) f% G y5 x- /*Create a binary semaphore handle*/ }; n( i7 `& c: d; c. k7 F
- static SemaphoreHandle_t Binary_Handle = NULL;
9 @+ j4 j+ y& }7 `& Q
7 X6 \) I% [4 A- extern int f_printf(const char *format, ...);
4 [5 Q2 _+ m5 ?5 V - : l: |+ v8 z: g- }# {% N
- /* USER CODE END PV */
7 V4 l- U! {8 |( B$ G1 C3 j - /* USER CODE BEGIN PFP */
3 g$ X+ ? C: ^' F, t" a L
! O0 s- G0 U) i0 a& \, z: w' q1 d- /*Create a task function*/
- A0 ~6 K; ]0 b( \: a$ l- ?# ? - static void AppTaskCreate(void);
7 |3 _0 e9 m7 K) N7 ^ - static void KeyTaskCreate(void);
% j6 ` @$ p. \, G6 v/ t [ - static void Led1TaskCreate(void);$ Y1 D- U2 `6 w! `9 m7 d3 L" V# \' M
- / {- S* [- U9 T4 ^: Z5 j& G7 {
- /* USER CODE END PFP */
' i5 d9 H: G1 W9 |6 ~
! n, {& i# S9 p8 _6 p- int main()) E: U9 ]' D: k' G
- {0 f, o2 `; T$ Z x# ?! t
- /*9 ] y+ ?1 C! }3 I' ^6 q7 {6 b
- *
' b# n) Z6 t/ T" q; i' _8 k0 n! L - */: M" t, G3 w5 k c/ b" ?
- /* USER CODE BEGIN WHILE */
" ]& E v$ [' R: D0 u; Y8 V - UBaseType_t xReturn = pdPASS;
3 }# f' Z$ Z5 m5 T2 S - + S- i" c' F% r1 n8 a; |
- xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,. h& @4 e+ W% s/ T" ~, J( h# X
- (const char *) "APPTASKCREATE",
5 O' N3 F% J9 v& X. W* @) H - (uint16_t) 128,
/ ]; J/ A, J4 n3 f, L - (void *) NULL,
0 t4 ^, R2 J5 n2 L4 z - (UBaseType_t) 2,
" U- x* e$ D4 v! ?$ P# G) J - (TaskHandle_t *)&AppTaskCreate_Handle);
( \) s2 R! f% k - if(xReturn ==pdPASS)6 i# g5 L& I- R6 c6 e) t2 Y* Y
- {6 ^ v; |9 x, |
- vTaskStartScheduler();; s, b, [# P" Y" n6 }! e. L
- f_printf("start..\r\n");; H+ `9 t& M$ B+ z6 `+ X( r
- }9 f: R: c' x6 U1 `
- while (1)
# _' L8 P0 B* }' m* B - {
% y. O+ k3 c5 l6 m* m9 m8 G - /* USER CODE END WHILE */6 a5 o0 i0 l! s8 S8 A9 b
. L [, i4 m. s- g: ^* `1 `- /* USER CODE BEGIN 3 */
U. [ C& o* i6 s3 ~0 D; d - }3 I* j7 o, p \ {4 y
- /* USER CODE END 3 */
$ s0 S+ a6 m' F) _5 y
$ D! { v1 Y1 b! z+ o1 S
$ ]3 X; f7 ]; R& @! u1 y8 S/ E) ^- }
* }' f) O& m9 J' M; F) U4 [ - & y: ^6 b2 z2 C4 J; h7 g
- e X6 y$ _" H, R( c- M- /* USER CODE BEGIN 4 */8 s: Y0 k9 M( L) z0 U, H
- static void AppTaskCreate(void)( o8 O5 }; v# I
- {
, h( e0 B4 A' A5 T - UBaseType_t xReturn = pdPASS;
2 B) D+ H: W! C- s+ Q" ]/ f - 8 G K5 f8 u# J! w8 Q
# H% M1 W3 t- g; o. B' y; W# g- xReturn = xTaskCreate((TaskFunction_t) KeyTaskCreate,8 P0 f6 y5 J% J: |2 e. a
- (const char *) "KEYTASKCREATE",: T3 d3 J' f' m0 m8 |" G+ |. a
- (uint16_t) 128,+ C, m; v& R7 N# Z
- (void *) NULL,2 Z: {% I* U; A. f# J8 J- F
- (UBaseType_t ) 2,
/ [& \* f* Z Q5 j3 ?3 m$ ?. S - (TaskHandle_t *) &KeyTask_Handle);
& F4 I+ x C, I" o9 _. G# p; E - + T+ p7 \: Z5 F2 \4 x% |
- xReturn = xTaskCreate((TaskFunction_t) Led1TaskCreate,' S, g9 {9 e) {8 B! f6 m+ G, K
- (const char *) "LED1TASKCREATE",+ S# ^0 U9 Y3 Q- t# Y1 u, L3 i
- (uint16_t) 128,
6 r& e V6 G, j, g. |# Q* ~ - (void *) NULL,
5 K0 i7 Z% Z& y) y! U - (UBaseType_t) 1,
3 E9 Z' Y" m3 @8 V% e( L/ d. i2 ~3 e - (TaskHandle_t *)&Led1Task_Handle);6 T) y" @, |8 H, j0 U
-
& h3 o6 t, k6 B; n, R! G0 r - /*Create a binary semaphore*/
& I D; x Y% |. Y. L- B - Binary_Handle = xSemaphoreCreateBinary();* ?( C% w# ? z$ ^
- if(Binary_Handle !=NULL)3 ] G7 R; `9 A3 I: G- W( G# O6 W1 ?4 n
- f_printf("Create Semph_Binary PASS.\r\n");0 A( s* t8 [0 o. s" {
-
/ C0 n# G3 I# d4 D! c9 U$ j - if(xReturn == pdPASS) C8 {2 |8 {! y! D: O; k
- vTaskDelete((TaskHandle_t)AppTaskCreate_Handle); + `7 \' s! R& R2 G& H# H
- }
0 g1 `, V: g3 n - 3 g' S9 u* M; w" @- O* V R# s6 ^
- static void KeyTaskCreate(void). J4 l* i) S. K0 P/ L; j% ~" ^
- {
o& g* n1 G D1 z& u/ Z; f- x - while(1)+ ~. C( [* y3 s) F% f- }
- {1 N5 t# K/ e8 i$ T/ F
- UBaseType_t xReturn = pdPASS;
# I" {& P6 O- \% ` r - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)), W) |8 y' N0 m% n; f
- {
* y% a" w& `# R- Q4 r( k2 g0 A1 E - f_printf("KEY TASK PASS.\r\n");
+ w1 @1 T8 n, D8 c - vTaskDelay(100);
/ u2 q! [# }+ \" u5 R1 N* I% u7 J! t - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
/ _3 K0 {% a$ z$ }- _% M# t z - {
9 h, i2 J1 ]" b+ c. V1 r2 i) p+ ` - xReturn = xSemaphoreGive(Binary_Handle);
6 Z) V0 r; V$ G& p6 |5 r/ ^+ ~ - if(xReturn == pdPASS)
7 e9 L. d b; t" q+ ~6 j - f_printf("GIVE BINARY PASS.\r\n");( y, j" e8 V R/ W; S$ S2 e
- else if(xReturn == errQUEUE_FULL)1 M6 P1 k6 L2 l4 _+ [1 V+ `
- f_printf("QUEUE IS FULL.\r\n");
/ J" u* X" s$ Z) i* H - }# K5 f0 P- D1 Y3 {" R- A
- }
7 Q, S4 k$ {5 ~, n+ O! A( F/ d; U+ H -
% E2 h/ N% d; I) r% K - vTaskDelay(100);
/ C: U2 D5 Z! I$ [- C! m - }. k8 y2 B$ m$ p7 P, d$ e3 Y0 c
- : p' \& Z& z$ G% W; B8 k. A
- }
& f( S2 d! E! t/ |; {- }* L - static void Led1TaskCreate(void)
% F. Y n+ ^! M: X! |; g' o% Z/ E - {
9 _, t/ W# Q' A( ^1 j) }& ~ - while(1)0 I9 V' q7 |- |, ?
- {
; N" o7 h/ Y% D& V - UBaseType_t xReturn = pdPASS;
( L- p; a% S% O2 p9 H2 y! Q - 2 I7 @% t8 z d. l+ \, B% B& J5 v
- xReturn = xSemaphoreTake(Binary_Handle, portMAX_DELAY);9 Z# J! f7 h0 @* A, m I6 x
- if(xReturn == pdPASS)
0 L+ R% l% _ \0 P - {
" S' ]4 ^6 \# N- T& |" z5 ~# e" u - f_printf("TAKE BINARY PASS.\r\n");
5 T: F/ \9 | T5 k/ D7 a6 K8 a: E - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
; Q$ a+ x5 ?, c3 T/ I; F# d) B - }
; ~# T4 w2 n" T" f -
S& L7 S7 {$ H, t; A5 h$ w: i" Z - vTaskDelay(100);
# G) L5 I T' W c8 M! M; n, u - }
; ]7 G7 U8 ?5 |/ Q ? - }& v3 j0 y7 Q0 x
) H) Q' i0 E* b: t' _: n- /* USER CODE END 4 */
复制代码 8 k7 j* ~$ W9 G6 ]9 K r' Q
计数信号量的用法示例$ J2 U0 j1 s$ N' l$ L
1.创建好带有printf-stdarg.c的FreeRTOS的工程 q- y% o. E3 P# X/ C6 h$ @8 u
1 ]0 k$ }# J7 z1 W7 D2.修改main.c文件
; U! V: m9 c+ W7 R. ~3 r% ?! q3 P' I7 } C# |" \
- /* USER CODE BEGIN Includes */
3 c& @# |) d) |+ H% V' g1 Z
3 w2 I, i; z- W4 c7 m- #include "FreeRTOS.h"$ J+ z* v3 h* v: R- i3 N4 o
- #include "task.h"
+ v/ p. r i0 G - #include "queue.h" Y0 I! q# C; Y1 H+ k( F* \) f
- #include "semphr.h"% i; j( @3 O8 |9 n; S
- #include <stdio.h>
l. ?4 U& \9 W# n2 n- u3 L - #include <string.h>
; e- j4 _( k. k& I - * R2 w2 v0 t" O1 Y. P9 a4 E, n
- /* USER CODE END Includes */
3 c; f5 {7 o( c- T3 t; l - /* USER CODE BEGIN PV */
. m5 E$ `; |" N7 `* D - static TaskHandle_t AppTaskCreate_Handle = NULL;
9 b& {1 B$ x4 F2 N' x4 m - static TaskHandle_t KeyTask_Handle = NULL;
: U4 E# R' h; a' I/ m+ r# V - static TaskHandle_t Led1_Handle = NULL;( K8 S, A1 Q0 Y: \6 P \
- 0 b- u3 ^. `. V
- SemaphoreHandle_t SemaphCount_Handle = NULL;( [ t. a+ r9 ]8 {
- # L! N( V3 r- q' A8 t
- extern int f_printf(const char *format, ...);
6 {7 m2 z0 s* f, f- }, k
, i0 c) R' C8 E' Z d- /* USER CODE END PV */
( L1 J9 y y1 O9 c" U - / k" k* j L3 u* k9 q
- /* USER CODE BEGIN PFP */
5 a/ z; X, @# O4 O0 l' t5 V - # q# m1 Z* Z: `4 p& L
- static void AppTaskCreate(void);
& X8 g) `6 V& ^! o. B7 O - static void KeyTaskCreate(void);6 W& r) x9 s0 t
- static void LED1TaskCreate(void);
, G1 y! a4 C3 V9 `; c6 |+ ^ - 5 }$ Q ~$ c# X4 }& r! K
- /* USER CODE END PFP */
2 ]0 i( C5 m w( \: d4 p4 f8 ^ - - o: P* e1 d8 M% ]- g
- int main()8 k) T) g9 v0 b0 L
- {5 k& X q; W6 O; p* I9 I) C
- ***
: }& T2 C# M1 e, f
% O |3 O- \0 W7 \/ R" j) i- /* USER CODE BEGIN WHILE */
7 S" T& s3 t# O/ l: f
. Z$ s Z8 @3 C0 K8 ~8 e- UBaseType_t xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
W+ ?! T" A$ N+ c- b& X9 {/ d - (const char *)"APPTASKCREATE",8 Y' F5 h" ^& k0 v8 X
- (uint16_t) 128,2 _5 Y6 J2 Y! q
- (void *) NULL,2 q \& g/ q* j5 i5 W/ P
- (UBaseType_t) 2," [! w1 i& T) [9 c* W: v0 G* I
- (TaskHandle_t *)&AppTaskCreate_Handle);9 U7 J: L% ?, @8 _& L3 U! N+ H, R
- if(xReturn ==pdPASS)+ }' ]- Y3 ^! X# M- |6 B* H
- {
/ v' R u* d9 o u - f_printf("TASK START.\r\n");
k& E6 h1 n$ u4 P3 D$ t3 y6 Y - vTaskStartScheduler();
3 G& d0 g" L: o8 g" N - }
# @7 y/ d3 F* \/ p: ] - while (1)( i; C: k1 [1 _
- {$ }; }% J) e& K
- /* USER CODE END WHILE */) I7 u; ~. _; M' Z7 @* g
- , T4 X" A: V9 I& [. U- Q" ]
- /* USER CODE BEGIN 3 */& r3 M5 v M/ a( q
- }2 {6 S, F3 \- |: C
- /* USER CODE END 3 */2 E8 J5 f9 c" I0 ~
- }
z6 a* I; r' ^: [. i$ O, I
0 ?" i* @5 x, E s- e! [* A- |9 I- /* USER CODE BEGIN 4 */+ _& u! O S8 o" B# g2 x2 n
- static void AppTaskCreate(void)
) D, V. \7 I' B& ?, s2 t - {7 K: P" k* `: ?/ Q* d
6 e, f( F8 k2 B- UBaseType_t xReturn ;
9 ^ v* K! F% n4 U( Z6 s. T9 ^ - xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,
* M2 H% u) I$ x6 s7 f+ d- ]* I% m - (const char *) "KEYTASKCREATE",
- Y ~- Z/ k* {* U - (uint16_t) 128,% ?. l0 e2 W4 D: h N
- (void *) NULL,; R3 r* ~2 b- \) S& [
- (UBaseType_t) 2,* U) c" s6 u+ @& I4 E$ S
- (TaskHandle_t*)&KeyTask_Handle);" x% E( ]8 j% h- ]7 Y4 ?
- if(xReturn == pdPASS). V3 D9 h$ p2 Z$ y6 ?& _" Q% w5 ^
- f_printf("KEY CREATE PASS.\r\n");
4 L* k! `$ A \- ?5 {. D3 ~4 h/ [ - ( x8 @: n! u5 G b& t J, u
- xReturn = xTaskCreate((TaskFunction_t)LED1TaskCreate,% u6 L) E1 f2 B( n/ v
- (const char *) "LED1TASKCREATE",
) _ r( [. Y7 G+ Q: p% B - (uint16_t) 128,
7 i, z! L' } U - (void *) NULL,+ W! Y' M% C, U S
- (UBaseType_t) 1,
3 w, d8 [9 w0 K - (TaskHandle_t*)&Led1_Handle);
/ x1 K0 i* }2 [ - ! f5 K# I2 X ~ u
- SemaphCount_Handle = xSemaphoreCreateCounting(3,0);9 W k+ h# J, B: y4 G1 z, }$ Q' W# P
- if(SemaphCount_Handle != NULL)# a9 Z, s8 O9 h- j% ~
- f_printf("SEMAPHORE COUNT CREATE PASS.\r\n");* @! n* {, M& A! L
-
# V3 L- P" ]$ {' z- D - if(xReturn == pdPASS)% P6 j9 n' s p* k" J* T' J4 C; Q
- {
8 s; ?. @6 |, I- \ - f_printf("LED CREATE PASS.\r\n");
' c( u- R) C) c! n" I8 @8 s, Z5 z/ j - vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);
- P7 G5 u+ L% h5 c( C - }3 F5 E0 O" D# q; W
- }. P3 k/ L$ Z3 H9 P! G) ?
- : {& r2 n* u% i
% J4 W3 j. k9 a: x2 G: D" c9 {- static void KeyTaskCreate(void)1 [) w' Q+ w3 \( ~5 @0 d
- {
' s2 b" C% H: D% v7 P+ Q - while(1)( `- U) |& D8 Z$ W0 J4 S( V
- {0 Q7 Q( J( K9 _2 o$ v" b
- UBaseType_t xReturn = pdPASS;
, I* G( t) J3 \" P5 \. k - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))! N, \) O, F9 y2 j
- {4 T6 ^4 d8 T" T0 q/ R. ]. P
- vTaskDelay(100);
H* |) V/ ~6 F) \& r - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
( b9 B/ u1 P& l! B; K0 L( o - {" ^5 }! ]$ L/ i# g2 D
- f_printf("KEY PRESS.\r\n"); X1 o+ b8 y& o5 ]: `% J$ i
- xReturn = xSemaphoreGive(SemaphCount_Handle);
- @; K0 r: ~. h8 z& n - if(xReturn == pdPASS)( ^) l+ f5 m! B
- f_printf("GIVE COUNTING PASS.\r\n");
. J3 F# ?; U4 L2 V4 n - else if(xReturn == errQUEUE_FULL)
3 J$ ]. N1 Q1 a7 {8 j - f_printf("QUEUE IS FULL.\r\n");
% Y; ]4 {. s. ~: x. E1 f5 Q - }
. l* C7 g! s; p8 v+ }3 e: q - } 3 M, }, ]* q# U+ z0 z
- vTaskDelay(10);
( \% W! z4 t, `; ~4 a7 v/ } - }
5 z! u+ s0 ], W& ]& o) O - }+ h ]0 [* k1 e0 c
- static void LED1TaskCreate(void)" Z1 Y+ j5 }9 M0 C( y8 D
- {
) ^, r" m* N* I" ?$ n7 S6 A1 ] - while(1)
% C% C: I6 l" K2 e1 Z - {9 [. v4 f- U# F+ H
- UBaseType_t xReturn = pdPASS;
+ r7 v! g: a9 r. U7 c( n -
! \( U, J' L( h! |* W* |: f% ~3 O3 y! ` - xReturn = xSemaphoreTake(SemaphCount_Handle,portMAX_DELAY);
3 g0 M; e3 N+ J/ D2 s: j -
- X% F) y j- m8 D3 u - if(xReturn == pdTRUE)
4 ^: q' o9 Q* N7 A6 V5 W - {
' F/ Z( I# W3 y - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);/ f6 R' c9 o4 o$ d
- f_printf("Counting Take PASS.\r\n");
% ]8 w/ E6 ^% p& K. ?3 w - }
# T3 D) H# o% I7 Y4 M6 d8 f - else if(xReturn == errQUEUE_EMPTY)* |- V ~. r3 W& n5 S2 o4 y
- f_printf("semaphore is empty.\r\n"); ?; b7 k( r6 Q+ d3 [1 q6 V) b
- vTaskDelay(2000);2 ?. E7 \* k. O$ Z% M
- }. a0 |. _6 P- V# z: }" d
- }3 K0 O1 S, J+ ~/ y" I# i( B
- /* USER CODE END 4 */
复制代码 9 _# r2 J9 z' ]- ~
4 Z, m6 V& F. ~6 F" I0 v$ l: G6 N————————————————
5 M8 \& E& P# l/ F( ^版权声明:SCCELE1 G- u4 l/ U c) o6 `" a
) V2 l8 \3 W: X! N4 v |