二值信号量的用法示例
& j* O1 u2 j C7 V1.创建好带有printf-stdarg.c的FreeRTOS的工程
( p; w4 s) s. a+ T# c# m* }& [9 @3 ^7 R1 s* {% g
2.修改main.c文件
8 u' x% v" l/ g
- ^& G4 o& ]3 F5 `) x/ T- /* USER CODE BEGIN Includes */# S. K! m) ~: C. @- f# t- f
% A6 n j+ f* o+ F- #include "FreeRTOS.h"
4 }4 X: m3 ^! _7 |- r - #include "task.h": D2 ?2 J% \* y) K6 ^) {* R
- #include "queue.h"9 K* j: l5 ?2 y) T2 ]
- #include "semphr.h": j0 L- ]7 E% g1 M- C6 T
- #include <stdio.h>
o" }0 ~* ~. Z - #include <string.h>
1 D8 Z% R- E2 g: A, S7 w - 3 j8 ~& I' t' h" K/ M
- /* USER CODE END Includes */
$ @6 }5 D1 M+ B/ q4 \9 Z - /* USER CODE BEGIN PV */
# V/ w! f3 n, f S" P: g
- ]4 l4 y0 I- L) d- static TaskHandle_t AppTaskCreate_Handle = NULL;
1 S' j6 I9 m9 e9 F5 H: v - static TaskHandle_t KeyTask_Handle = NULL;+ _4 j$ |5 a: W" G
- static TaskHandle_t Led1Task_Handle = NULL;+ |$ u) @% @7 o* y7 H) N0 g. R y
2 b7 \) A* n' H( i& W- /*Create a binary semaphore handle*/
: ~3 ?, r+ { ~0 V - static SemaphoreHandle_t Binary_Handle = NULL;
& r7 b* q8 b% B' [0 c1 Q - ! M5 A5 J K; f" M0 V# M
- extern int f_printf(const char *format, ...);9 B0 _2 X5 ~+ v+ K
5 e( }* r7 R8 x- /* USER CODE END PV */0 P8 }! L0 I$ z% u& _5 Z- R
- /* USER CODE BEGIN PFP */, A% y9 H8 J9 g1 K+ K/ @; ^9 ?
- + |+ g+ m( X' {6 |
- /*Create a task function*/2 Q5 j9 Q- f% U Y- W
- static void AppTaskCreate(void);' V. n# y2 N0 n' ~" r
- static void KeyTaskCreate(void);* [. O" k$ |7 W5 v" V- J5 G
- static void Led1TaskCreate(void);
" Q: d3 y( Z c% q) A
: Y; T1 p0 F; s; I0 d) ]4 @- /* USER CODE END PFP */
1 y) e0 A6 \2 m' ?, } - 0 D2 t( ]# g' U, h' q$ B R
- int main()
; l0 S" s; l( Q$ f! d1 I6 N/ Z - {4 a" m# E2 [0 |" q3 B& B3 U* w
- /*
; r6 |- L8 ~1 o5 c - *$ [$ i- K5 \2 K; O
- */ o3 I5 ^2 G) E' H/ n3 n; k! T4 [
- /* USER CODE BEGIN WHILE */
3 i3 \6 J m" z+ Y, g& g/ i - UBaseType_t xReturn = pdPASS;9 d0 D: n, [) _% m5 \
-
2 A4 W+ b: N7 f - xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
* H# S, O0 k H5 ~9 v$ s# F - (const char *) "APPTASKCREATE",8 J: y+ z& P/ M* h* K: C) ?) g
- (uint16_t) 128, _/ f) N; I4 R
- (void *) NULL,4 p8 ?. H' q) M. @3 I y
- (UBaseType_t) 2,
: c5 j. D& C) \. Y" K! ]: G - (TaskHandle_t *)&AppTaskCreate_Handle);
9 c. n& ^6 `) b h2 u% F - if(xReturn ==pdPASS)
B+ k- ^3 r: `' e& J, r - {) i4 @' u+ F; ?* S% s, _
- vTaskStartScheduler();1 O; E$ i% x; H4 S$ l
- f_printf("start..\r\n");1 d3 |! x, k6 U
- }
7 K7 Z8 d8 ?( @' ?; h' h - while (1), B* R* ~" f8 i
- {
) P2 @' l/ {* h9 b- n - /* USER CODE END WHILE */
6 L5 O+ c, h3 T1 m% p
' d u7 U; ^3 _3 h; f- /* USER CODE BEGIN 3 */
5 z0 ~2 q& `( D3 Y - }
9 Z) i' b# o# F% }: F7 C& G m6 D - /* USER CODE END 3 */. Q" k$ [! O8 P" Y
- 5 d7 p7 Q* u2 E. B9 H3 b# E
- 5 \2 B0 m' T& C( x8 J+ f4 W
- }
) f+ A- {7 K+ P8 Q. J- N# z6 q3 J! W
6 c: E" `0 Y" l- p- 2 @; _5 D: G- |$ _( s x# I
- /* USER CODE BEGIN 4 */: A9 R+ B3 D5 k5 q
- static void AppTaskCreate(void)
+ [/ O9 Z, s& ]* H" A - {
& Q5 J: C T. L0 B* K - UBaseType_t xReturn = pdPASS;# L& [( Q! x" u) K7 U% }8 \; y9 l
- 7 [7 U: [* O: K* p
' R5 l% i. E: h3 ?: K- xReturn = xTaskCreate((TaskFunction_t) KeyTaskCreate,! A2 ^8 |! o' @8 \8 {6 G( B1 j
- (const char *) "KEYTASKCREATE",. D, S* Q3 S; |8 q
- (uint16_t) 128,5 Y( w& |4 w; c
- (void *) NULL,5 Q9 _2 Y3 W% O! h% C% X2 A
- (UBaseType_t ) 2,/ a" a V0 I" o; X, D" F# }
- (TaskHandle_t *) &KeyTask_Handle);! m( n3 E+ o4 a E* {3 R) d3 U
- ) f% W% I1 f; o q5 H1 e
- xReturn = xTaskCreate((TaskFunction_t) Led1TaskCreate,
0 G" e0 K q% D- e6 t8 B1 j1 C - (const char *) "LED1TASKCREATE",- k# ^2 L$ s% Q5 l
- (uint16_t) 128,: W( n! k' M0 z( `3 Y# v
- (void *) NULL,
- G9 w- r* N+ h" Q - (UBaseType_t) 1,; L( i/ E; k* m W- F; _
- (TaskHandle_t *)&Led1Task_Handle);; m9 Z1 u8 T" E5 R0 X1 n+ _
-
8 ^/ s0 m* C, C1 P - /*Create a binary semaphore*/) d' f* c2 O2 o. d
- Binary_Handle = xSemaphoreCreateBinary();
9 p6 j6 C7 C4 R& o/ L' j6 _ - if(Binary_Handle !=NULL)
9 M6 C6 Y# t; W* @- m y* ~ - f_printf("Create Semph_Binary PASS.\r\n");
3 B/ v9 _) K: o! n - ! `/ y7 P% @: i' N
- if(xReturn == pdPASS)+ g2 t8 _; [) D
- vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);
# r3 N2 c) o9 i" c* j' m6 ? - }! P m8 q; ]# y* `/ G
1 Z, i- x& U5 L! B+ X- static void KeyTaskCreate(void)
4 n" e# @% g3 D& M- c: c - {6 n6 D. ]; O" M f! A$ A$ S* l9 }
- while(1)
' C$ H8 l4 T& X% n - {' s7 i8 Y {; e7 h) a
- UBaseType_t xReturn = pdPASS;
4 m/ d% e/ X1 j) P8 x& u: E - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))* }; J* |2 G. Y- V6 a, N
- {' } L$ H" B, V% @2 q
- f_printf("KEY TASK PASS.\r\n");
: w9 R1 O8 u- b3 w6 ]4 ~ - vTaskDelay(100); I2 }) t9 L9 X
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)): e9 U% _6 ]( V( s* Q4 ~- _
- {6 s( u* T1 g4 `* i) T
- xReturn = xSemaphoreGive(Binary_Handle);
. N) z0 v9 F# j& F4 c - if(xReturn == pdPASS)
! Z+ c( ^) U. n: N: ` - f_printf("GIVE BINARY PASS.\r\n");
2 J$ o! ]7 f# G. y! G) ^4 s - else if(xReturn == errQUEUE_FULL)) `! N6 H$ j# e) y" D- ~- ^+ c- A
- f_printf("QUEUE IS FULL.\r\n");
4 n7 R3 B$ }) E" \# A! b+ U - }# x& @) p! F% `0 A3 Y; v- W
- }
+ }7 O# V# j. ?0 A; L% ` - , G" I& @( o& J+ U
- vTaskDelay(100);
( w$ Y' d6 H9 v - }
0 ?5 e: n$ e9 T" b6 [& Y
1 L; V: f" Y1 @- k* O$ B, [- }
' @5 Z/ c: d/ p - static void Led1TaskCreate(void)( ]" I% x2 M3 j Q9 q% k1 h- ?$ K
- {
7 _) y+ u" i! L, {0 ~0 u4 S - while(1)
" h& l" }6 ?5 _# n; K- F0 K* t - {0 m- s# r; f7 `$ }( m
- UBaseType_t xReturn = pdPASS;+ a l6 Y R5 `- ~
- 7 B* i/ ^: x# J$ S' G6 a. J
- xReturn = xSemaphoreTake(Binary_Handle, portMAX_DELAY);
" x+ f; \, Y! b - if(xReturn == pdPASS)" o, ^% G2 d' l3 R$ t8 U) u
- {
B. h* J% T8 v. v1 s - f_printf("TAKE BINARY PASS.\r\n");0 o/ G5 W) r: b$ _% J P/ S
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);: R# b: _9 H; D. W$ _7 t
- }
r: @" a! @4 B# \! C - ) n; @1 }8 K% j" l$ n8 ?) t. \
- vTaskDelay(100);
/ q$ W, L: Y- A - }
- A: H Y1 m& Z( s' t2 z - }, A% Q% J) z) t& Z( c4 j$ |' ?
- 5 r7 r, @, ?! `6 d- H$ A( d
- /* USER CODE END 4 */
复制代码 # H+ t8 x: y. f! @" |3 K& d
计数信号量的用法示例% w+ A3 ^/ i) U; k. G
1.创建好带有printf-stdarg.c的FreeRTOS的工程
, V( b' p N+ q( o
3 ?. u+ E+ ^) B1 H! R4 o6 r2.修改main.c文件$ `4 W8 ^9 a: n% M" ?$ Z2 _
7 D! W8 V1 V/ d
- /* USER CODE BEGIN Includes */3 d/ z& t6 v) {1 r0 Q+ V U: B0 \
- ! P2 E3 T0 m( n. C# v& {9 T8 y
- #include "FreeRTOS.h"
- ?8 S6 ^7 x9 K, R - #include "task.h"
0 w) |' g/ E- f/ c. c - #include "queue.h"
" u/ t2 I F) Q7 R2 ` - #include "semphr.h"
8 V8 i1 ?+ e( I7 x( }' F& j - #include <stdio.h>6 T$ p/ Q* w. ?% c" R- d
- #include <string.h>
6 w) [2 h7 I& q' t - # M$ d6 O# E& f5 _( j8 ~0 V
- /* USER CODE END Includes */" I0 v4 L% G; z( }( a9 F5 O
- /* USER CODE BEGIN PV */
4 |+ t4 A! ~) S6 h) H& p. ~ - static TaskHandle_t AppTaskCreate_Handle = NULL;( K: I T7 ]8 q! b3 \
- static TaskHandle_t KeyTask_Handle = NULL;5 d: R4 g6 K9 E
- static TaskHandle_t Led1_Handle = NULL;+ m0 M( B/ L! h) U
, q) D- s* }, D( b* `' b& f- SemaphoreHandle_t SemaphCount_Handle = NULL;3 T: W2 F& o6 V* y& e
- 9 w5 ]1 q/ M+ ]+ b
- extern int f_printf(const char *format, ...);
# E/ m- R7 w& s3 [' N |, t
0 S+ Z* @! C& Y/ n8 m- /* USER CODE END PV */
0 u a/ F8 {: u - ! R1 v4 I5 `6 o5 D6 B
- /* USER CODE BEGIN PFP */+ d, R, W. b% _& D7 H1 b9 `
; s9 O) V! [& J; j$ `7 B- static void AppTaskCreate(void);
" n" Z: Y$ C5 I6 K' x/ q9 U - static void KeyTaskCreate(void);
6 G/ ]& ]2 U6 h - static void LED1TaskCreate(void);& ?1 x9 w k. N; S% W
- $ h5 y! ]5 X. `1 F* N$ a v: k
- /* USER CODE END PFP */
9 Y% t( q3 @: g+ {5 J
5 K' j& B3 k& |, Z" t- K- int main()1 Q) Y5 F# v* }
- {9 y0 s6 X8 L. ~& X0 s
- ***
. G7 X, r' G5 H! U! b5 m - ; a! [/ A1 s5 Z' M# X; R
- /* USER CODE BEGIN WHILE */
, z4 x6 y1 A2 v3 o4 p
7 b. N/ F, _8 _. [, @6 K3 x- UBaseType_t xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
& u! P& F# ~" P+ @0 j3 H - (const char *)"APPTASKCREATE",0 q/ M$ Y# o% i/ Q/ _
- (uint16_t) 128,
n2 [$ w2 A/ L* k) o" i3 D9 ] - (void *) NULL,' X2 U' x6 E x! C
- (UBaseType_t) 2,2 {' I5 {& {& Y4 k4 ~. F
- (TaskHandle_t *)&AppTaskCreate_Handle);
0 B7 C+ V1 b( c* U - if(xReturn ==pdPASS)
" O5 p9 x" R! S/ j# c - {8 {/ Q4 |- j0 P: x. e2 O) y
- f_printf("TASK START.\r\n");: h" t6 G7 y, d8 {
- vTaskStartScheduler();
2 A9 [2 t$ C x7 ^. S - }+ e1 ?0 ?, N f! q6 i
- while (1)7 j) R r$ A+ n( N3 C2 T i: W
- {
- N" ?: ^# ^/ ?8 R. _% ~ - /* USER CODE END WHILE */
6 K% i8 M* ~5 J
) O5 ^, J& n) ?* g/ \/ F- /* USER CODE BEGIN 3 */
5 Q/ C9 c6 |+ X- O! t2 N7 ? - }
* U J* a8 ?4 `) v w4 H - /* USER CODE END 3 */
6 Z( L+ S4 C+ k4 ~2 v7 v; A$ x - }. n+ b9 A8 V) J4 d% A2 Y& {
/ H$ H- h+ h% x! }* k6 c. {: a+ k- /* USER CODE BEGIN 4 */2 ~0 S- E& G( a6 r, [- a& b+ {
- static void AppTaskCreate(void)
; l( l- d4 d' ]6 B! T+ Y - {
3 M( {$ I' _$ w6 W7 Q5 [, { - j3 e. l+ A' e5 t3 G* K
- UBaseType_t xReturn ;
1 n2 t( @# D. S( ~' c2 ]" t - xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,! N4 _8 D4 |: g9 @ X/ w+ p
- (const char *) "KEYTASKCREATE",
) Z9 ~' [. A, E, H0 C8 ~$ ? - (uint16_t) 128, l h3 @* L) j# X3 Z& _9 t3 M" U
- (void *) NULL,
e: p3 E7 F! [- z6 g: ^7 J - (UBaseType_t) 2,
2 S4 I4 p" F1 ]' U7 C; B/ j* _ w - (TaskHandle_t*)&KeyTask_Handle);
1 p6 d! i1 f- n+ L% H6 m" S - if(xReturn == pdPASS)
4 S1 B4 U# H4 E$ P2 v8 l - f_printf("KEY CREATE PASS.\r\n");5 O5 t: }& z. B. g* E# F6 R
- ' h; K( x% ^* @( L8 F
- xReturn = xTaskCreate((TaskFunction_t)LED1TaskCreate,
: a C1 h) l# A - (const char *) "LED1TASKCREATE",
8 c; V; L6 Y: s d - (uint16_t) 128,
" L3 O: ]4 M& v8 r; h8 i - (void *) NULL,
7 G D: C7 h4 a" h8 A [: q' P - (UBaseType_t) 1,
$ W/ r @# E0 U# k) F4 U8 n - (TaskHandle_t*)&Led1_Handle);4 b" \- t1 I4 `1 O+ ]% O# Y
- , l+ u: h" l3 ^8 }
- SemaphCount_Handle = xSemaphoreCreateCounting(3,0);' t/ F. t) |$ U4 S
- if(SemaphCount_Handle != NULL)$ l( `+ k7 |$ C) L, ?3 O
- f_printf("SEMAPHORE COUNT CREATE PASS.\r\n");; w N$ U2 n$ [; Y; `) ~8 O' J! u
-
' c4 M2 j1 y9 O/ J3 C( p2 ~2 i* | - if(xReturn == pdPASS)
/ o7 z8 q/ m% I - {, c E) x7 m8 E* J
- f_printf("LED CREATE PASS.\r\n");
/ g8 a& k# j/ Z9 N6 U1 i3 h - vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);
2 r1 N& H$ ?. P; z* _% w; ~ - }
, J+ r, G, ]& P3 t. ^6 Y9 T1 ]( v. z& r - }. z, g9 m; y. n' R; @2 i
7 J! }% {$ F: j+ H- 0 ?7 j% E7 `! _4 X
- static void KeyTaskCreate(void)) E, X4 ]4 Z( C
- {( a! a+ k# o; R# `9 t1 X0 ^
- while(1)" m% e' |' S0 V Q& v7 a* |
- {" ~& ?/ n+ J5 F+ ^9 G
- UBaseType_t xReturn = pdPASS;
5 \/ T( a4 P" Z' Y" Z - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))4 B4 F2 p5 a; w1 D+ N$ P. R+ v+ s
- {! u3 P8 z4 q6 k! u+ h$ n/ x1 H
- vTaskDelay(100);
' D8 Q8 @/ }# F2 s: h2 Z - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
& F, L7 r$ g; g - {, { H' \ V+ T/ U
- f_printf("KEY PRESS.\r\n");: k% q# {1 r4 M1 S1 U6 }1 r1 [
- xReturn = xSemaphoreGive(SemaphCount_Handle);
" p% d$ h; V( A% R6 h, Z) n6 I - if(xReturn == pdPASS)
9 v1 ^& |% W: f- F! V$ g9 m - f_printf("GIVE COUNTING PASS.\r\n");; ]8 \" [8 |" p+ p
- else if(xReturn == errQUEUE_FULL)
, l* V" V$ Q- I( n* d - f_printf("QUEUE IS FULL.\r\n");
! M% D$ b" b: B+ ` - }
3 j/ v" i' g. y2 Q7 \ - } " v, x( K* z$ U! v
- vTaskDelay(10);3 f1 u) v7 T0 M
- }8 o, m W4 U9 J% o. D' l' M
- }
e; ?3 d6 i5 W+ F, |" E" P: ~ - static void LED1TaskCreate(void)
1 c% h* z3 q* ?) { - {
% Y5 Z% J" q3 a5 s$ n0 p* M - while(1)& ?1 A$ [9 l- Z4 l: z. l
- {
/ V7 `) y+ G6 y# v1 o8 A) [" O( \ - UBaseType_t xReturn = pdPASS;
/ m4 j6 y" A- ?, S$ g -
5 Z# p2 W+ W. d# v1 t - xReturn = xSemaphoreTake(SemaphCount_Handle,portMAX_DELAY);" h* J9 Q& M2 R9 [
-
$ B) I+ w4 V: o. k - if(xReturn == pdTRUE)* m2 c; j0 g2 D& X& g6 w: c6 x
- {
& n6 V- J0 p& t6 J- B! B - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
# ~7 a6 v1 i; O - f_printf("Counting Take PASS.\r\n");: k, i8 [. \& f
- }0 ] n5 O( |* G% X; h
- else if(xReturn == errQUEUE_EMPTY)1 |( C/ ?6 d- I1 d T3 y1 V/ N
- f_printf("semaphore is empty.\r\n");6 r& R# W C) _& e$ {
- vTaskDelay(2000);6 J# q3 j6 l) M% D0 d
- }
$ r' W/ m" v4 k# \1 e( r; O" } - }/ L. r& q) i M1 a9 [9 N) `" n
- /* USER CODE END 4 */1 ^# V# L1 a {" ]( ?9 X6 Q) j
- 8 y: V! }% l( B3 K: s
复制代码
9 s+ O' n8 u0 h0 L$ ]! ] |