二值信号量的用法示例" w( J# ?% `5 Z5 d. ^3 w" |. J
1.创建好带有printf-stdarg.c的FreeRTOS的工程
+ y5 f' Y- J; C, M. A% R5 R3 y' {* X9 a9 |; C: e
2.修改main.c文件
8 L, ~4 w' w3 r
0 k7 D1 Z! m$ {; L# ]- /* USER CODE BEGIN Includes */
% d" T+ J s4 @$ b - ' l& S- ^0 N4 B7 r
- #include "FreeRTOS.h") ~2 R2 E+ Y0 x, O% [( z! Y
- #include "task.h"! ~. `: R, S5 u) V1 c
- #include "queue.h"
C2 b* j- l5 \7 Q$ R9 n$ j; K - #include "semphr.h"7 U/ U9 d' m/ s" B' [( e
- #include <stdio.h>
0 G* ^$ w4 I& m, \1 n5 R - #include <string.h>, Y/ g3 l- d n4 g9 W5 u
- 2 ]" D) ?1 d. H" c. i' f, P
- /* USER CODE END Includes */
" B7 _4 t7 o, U# O - /* USER CODE BEGIN PV */
8 i& ]) }" \" B) p5 L! C9 y - 6 c3 X' @ i( b! w) q E* p( s
- static TaskHandle_t AppTaskCreate_Handle = NULL;1 S( w; ^9 F( R6 n
- static TaskHandle_t KeyTask_Handle = NULL;
- n" H' Z s. D# N6 | - static TaskHandle_t Led1Task_Handle = NULL;. v# ?2 s% k8 x0 @' n
: b3 J9 O) i1 R4 [! X- /*Create a binary semaphore handle*/; q8 C6 A; i; C
- static SemaphoreHandle_t Binary_Handle = NULL;2 J* n) N+ X6 i6 O
0 M0 g8 f( h# I- extern int f_printf(const char *format, ...);
+ O4 z* A! H# Y7 F( K! [7 j
4 w2 w$ F# g; h* S+ k8 Y- /* USER CODE END PV */
5 A( k4 z% A9 U3 ?/ a2 W - /* USER CODE BEGIN PFP */
1 s+ S5 U; [7 ~
' P4 ?+ q# m+ ~7 k- /*Create a task function*/
1 P9 n1 [4 h7 p3 T3 S - static void AppTaskCreate(void);, v3 R/ @& X" ?1 j) @: P9 U
- static void KeyTaskCreate(void);
, N$ u5 w9 T2 L5 H+ q7 y+ t" W - static void Led1TaskCreate(void);( x- E* L* b4 J
2 ~/ G4 a4 w& R8 C2 Q: I- /* USER CODE END PFP */
# @+ ?. Y; Z3 S! q$ S: u0 B
5 w) K# o' f1 }5 q- int main()
5 X$ p" n$ @! e( { - {
" d; ]4 E/ @, _% Q - /*
$ A2 y7 Z; J$ [) D7 Q/ c9 a - *
+ Y! @+ J* x; K5 c! C G - */
$ g7 u# u) Z5 M# b' J1 W - /* USER CODE BEGIN WHILE */
( |# b8 z, w! F' \) K - UBaseType_t xReturn = pdPASS;8 b: \# q6 \) i- m, \9 g' D L
- 5 \0 b4 \" ?* m& f1 N+ G
- xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,: ]$ N0 Y' O4 @# `6 y
- (const char *) "APPTASKCREATE",+ ?7 _4 K! o* Y. I1 R/ \
- (uint16_t) 128,. b& j5 f9 O" e2 U X1 x
- (void *) NULL, T+ r" F2 o9 k# a
- (UBaseType_t) 2,- q0 K2 i( M; |; L
- (TaskHandle_t *)&AppTaskCreate_Handle);% _8 }) R$ l' P* k4 Z/ c @
- if(xReturn ==pdPASS)+ Q( U+ g; b4 u) x
- {
0 A. ?+ t' ]% v5 G; L' ^ - vTaskStartScheduler();$ S3 H5 v, [) @" N" i; |: R4 c6 K
- f_printf("start..\r\n");
# J/ e+ X7 ~6 {. ^9 Y1 K - }
9 D4 A. B4 o& e6 X- O - while (1)
. n$ I$ w2 s( u6 p- V - { \: o9 f- }) A( ?0 H
- /* USER CODE END WHILE */
* s$ H. K7 h4 q3 J - 7 {) {3 T6 k1 K) S; j$ ~7 q
- /* USER CODE BEGIN 3 */5 v# F% J& ?3 j) F3 I1 y
- }
. G9 ?* V6 C- q- L: j - /* USER CODE END 3 */
: n1 d E8 _4 a# A7 |+ g - ' h2 G" _- G; o y9 Y" W) q. [
% o2 ^7 T+ Q5 ]) n0 S y# H- }
* X+ E/ w, ~* ^ M4 w/ q# j; K
2 u9 \& P3 d! o: v+ @- , J4 [6 a7 w* l* w# G7 ~1 t
- /* USER CODE BEGIN 4 */# v0 G& J0 g7 |9 @" r% N! \$ w Y+ W
- static void AppTaskCreate(void)
# S$ i8 M1 u. M5 t- o - {
- w, t* I+ C5 ~$ i) ` - UBaseType_t xReturn = pdPASS;
" @3 L6 e/ r5 L- k% E - 4 R9 @- t% G% K3 _ a
- ( R( B7 U+ b7 T# n0 t+ X
- xReturn = xTaskCreate((TaskFunction_t) KeyTaskCreate,
9 E9 e- N$ N& B. N6 D) Y - (const char *) "KEYTASKCREATE",7 x& K/ o+ X9 ^- g5 Z7 ~
- (uint16_t) 128,3 u. ^7 H5 ]4 k8 ^% w0 E0 G# e
- (void *) NULL,6 F5 c" r0 U2 e( S( _( K0 }- c
- (UBaseType_t ) 2,
4 r% x! X" G& @5 g q6 w - (TaskHandle_t *) &KeyTask_Handle);
- o- E9 R1 ?$ X* W3 S. n- `
3 x- m$ e! h6 g1 ], u {% n6 [4 z- xReturn = xTaskCreate((TaskFunction_t) Led1TaskCreate,
l7 }1 W3 l+ u: O7 z - (const char *) "LED1TASKCREATE",
D+ P& q; _# W% {4 W. \8 c; \ - (uint16_t) 128,
9 @( y) X6 F" o0 @8 L3 k - (void *) NULL,
D v$ @$ j, q" } - (UBaseType_t) 1,
; [ g- |1 y. H! J! ~& `3 i2 v9 N - (TaskHandle_t *)&Led1Task_Handle);, _0 V! G+ w0 s4 Q
-
' \* E0 u+ _1 Q' x$ w - /*Create a binary semaphore*/
4 \: E) K# U1 e+ n3 h3 D1 k# _ - Binary_Handle = xSemaphoreCreateBinary();
; x3 ~0 G) `- b/ F! ? - if(Binary_Handle !=NULL)+ D2 z$ x! B& h* X
- f_printf("Create Semph_Binary PASS.\r\n");
m' y. X7 N: M3 @+ [- R -
X9 W5 c; J8 `3 V# k - if(xReturn == pdPASS)
' U' I5 Y% a* Q/ P. Z - vTaskDelete((TaskHandle_t)AppTaskCreate_Handle); / ~! q- ?( @8 e1 E7 Z
- }* B0 [# W# m# m$ m
6 s* o- j: t8 G/ C9 a. G- static void KeyTaskCreate(void)- S1 b7 h; ]2 A+ M0 _6 w0 D: w/ j
- {$ ?) ^# O1 @! j$ j9 o
- while(1)# w8 j! d$ l7 C; [
- {! X+ F# y* Z9 g; G8 J5 Y% w1 @ K
- UBaseType_t xReturn = pdPASS;
( z2 n3 E9 D; o3 W) F - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
. o* `# K8 h" @( c( D0 z. k# F2 J% b - {8 J9 }" a. {) A. K$ B% h
- f_printf("KEY TASK PASS.\r\n");
! I/ l$ o# X- x1 T8 k- F' p' l' _ - vTaskDelay(100);8 E+ N* b x) ]; l! U
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
7 w+ ^" O6 c7 S# t - {. X6 d3 B5 p. h) W& r
- xReturn = xSemaphoreGive(Binary_Handle);
6 T( c- S& p9 [: F: @" K& @- N5 k - if(xReturn == pdPASS)6 S% s$ h0 W! v4 }. ^
- f_printf("GIVE BINARY PASS.\r\n");
4 {: i' I3 v3 K - else if(xReturn == errQUEUE_FULL)
1 E J! a& ?7 o/ a S4 H; P! W- V - f_printf("QUEUE IS FULL.\r\n");# G- }; n' F1 j5 w9 n
- }
% s$ V, ?: a; l/ f - }
4 @2 H$ A: W# Y" u7 m G: B z - 4 _% Z+ h) m, V
- vTaskDelay(100);. H$ t, [. e# P
- }
; _; m! ?6 q& D7 d: c/ V: c8 z - , Z$ H3 n& ?5 n3 T" }
- }
: P6 Z+ ? I+ @9 T; e# f - static void Led1TaskCreate(void)
6 T( G* ?6 E m& G! ~0 G - {" }3 ^# y. n% N+ c1 k8 @
- while(1)& } X+ z& g% Z% |! {! h3 ?
- {
( x9 V! m) W" Z/ e' h. u# a - UBaseType_t xReturn = pdPASS;
* I$ y) W" }+ N) j! `1 Y - ( D" x3 F0 t/ V9 m* m
- xReturn = xSemaphoreTake(Binary_Handle, portMAX_DELAY);8 i8 H7 W* W! l, P' A- I& N1 G
- if(xReturn == pdPASS)
8 ^* {7 C! v$ l3 O) g0 ~( L - {( E9 E8 r! [( C7 E' j+ u
- f_printf("TAKE BINARY PASS.\r\n");7 M' c' P1 w1 n1 Y. P) y
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);9 P5 x1 s% c. O& a+ ?
- }
) }( M W1 `- T; `1 X+ c - 7 R$ \' t+ M" Y n7 g
- vTaskDelay(100); U! K" u i4 L& d
- }, I C5 t1 y* }2 S
- }
# Q# A" E; a; u3 A& w
! m$ \( ^8 b7 ~5 ?, S! ~- /* USER CODE END 4 */
复制代码
! a# R# ?0 Q b4 S计数信号量的用法示例
" v) _! V. a% e; Q2 A: h3 z7 j1.创建好带有printf-stdarg.c的FreeRTOS的工程
" N3 Q9 x; L6 n; W
' f/ G/ ]/ G* r! u, J2.修改main.c文件
! H) v8 \, F, C7 i! ^& t! `4 g
+ J9 B- ~2 w9 l- /* USER CODE BEGIN Includes */$ f- D; R* t. E- s5 D' s4 F
6 x* k7 s8 M% x- r* F- e- #include "FreeRTOS.h"
' J- n! N. ]3 g/ d. F' C; f) Q" ` - #include "task.h"
3 G+ e2 T3 a# m7 k+ N! o) z$ c8 O - #include "queue.h"* w7 F) t0 V( V0 L- \. j7 W
- #include "semphr.h" n+ ?: @* X2 P/ K
- #include <stdio.h>6 {5 F- ]) \1 m0 O6 j, J& T
- #include <string.h>
, w/ A( C. [- T9 u# z - 7 p& `3 B% x T- G5 c* E" t; K
- /* USER CODE END Includes */. b. Q- ^. x/ x+ b9 B8 {; g
- /* USER CODE BEGIN PV */
5 a5 \- A" J( r7 d- y5 T6 T3 W/ x - static TaskHandle_t AppTaskCreate_Handle = NULL;
7 A! ?8 t8 D- S/ e& b% L - static TaskHandle_t KeyTask_Handle = NULL;: P V0 s9 B+ a% d$ T
- static TaskHandle_t Led1_Handle = NULL;1 L/ [, S3 w; U) l
- : Y, j3 n% g; A, m H1 c
- SemaphoreHandle_t SemaphCount_Handle = NULL;
$ l! l, V4 R: j4 U - ; W8 a( W/ q/ {- o+ a* {8 @, a
- extern int f_printf(const char *format, ...);
' C% n5 K* j9 [) y8 P - * k1 h$ n1 B- {3 J
- /* USER CODE END PV */- \+ o3 Q/ L: K; s. [1 F
- 5 x: a: U3 {# r7 ^& I: J6 ^
- /* USER CODE BEGIN PFP */; x# G- A4 |* x
- " C& e. G' A7 c. i8 d4 z, b8 F
- static void AppTaskCreate(void);! Y* p* V/ ^4 D% C% a! T
- static void KeyTaskCreate(void);" a/ x. ^1 k5 B0 n V
- static void LED1TaskCreate(void);- O6 M6 ]& \0 X6 Y: C9 h
- / j: I9 K$ i9 g* e! P# p
- /* USER CODE END PFP */
9 r* `$ ^/ {2 j+ n: T1 ^ - 8 j5 _2 @! X* o3 L* y
- int main()
% Q$ P u% u' h# \ - {7 w( r& y1 ?, a* q6 [6 u0 \ e) T; G
- **** W$ }" D5 X! _" i% w! l7 a
; O( b d8 N) h v, H T5 B- /* USER CODE BEGIN WHILE */
7 }0 e! a; t7 {6 {' Y
- {- N/ t" s3 {4 z3 U- UBaseType_t xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,
0 U# {5 O( O- N |0 a. p( @8 | - (const char *)"APPTASKCREATE",5 T( }/ P: E& {8 g0 i7 l+ `
- (uint16_t) 128,2 `4 S& S# U, t9 V2 u! w
- (void *) NULL,
( P! W& ^' U! ?$ q2 d! n- V - (UBaseType_t) 2,
( X# \3 F9 ~3 Q5 ~* y, b' } - (TaskHandle_t *)&AppTaskCreate_Handle);: `& l( _: Z+ d6 \) O& Y
- if(xReturn ==pdPASS)
9 y1 d/ N6 E/ w" ^2 K* V - {& ]6 e5 f1 C6 N* Y
- f_printf("TASK START.\r\n");
, k- |) |8 \ o3 `% X# q* s - vTaskStartScheduler();
! y5 z+ c& V; J9 ^2 I% s) ] - }8 q1 {( F0 j' Y7 ^7 @3 A
- while (1)3 M' ]+ f. [$ X! A' |- z
- {
& N9 g" d+ i2 O2 j* \0 ]: {% T$ l - /* USER CODE END WHILE */. i X$ {$ d2 @7 _+ \+ [; W
- 7 ~/ c* U+ g. T9 D% m* F, `: o
- /* USER CODE BEGIN 3 */; A1 u. f# G+ E" e
- }* j" i- M+ i4 g. a0 v, n! M
- /* USER CODE END 3 */
) h, L- a2 c1 P, v h. I1 q" a7 E - }
7 o, ^) k. d0 q" ?
0 K2 H0 l5 T2 B' u/ K1 [5 E6 V& `- /* USER CODE BEGIN 4 */) Z6 f0 A `2 v! w# x* B) n
- static void AppTaskCreate(void)1 `) E( V2 J. F
- {# O4 v( T2 \' z, p0 [2 _1 n) f
. ^% J% Q7 W L, W; n6 I- UBaseType_t xReturn ;4 H' Z7 r7 ^% z* n+ z& z; f
- xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,' |1 {* V# X ?; u
- (const char *) "KEYTASKCREATE",, C4 `% Q M6 G1 @; J
- (uint16_t) 128,
* x) ?/ [- e1 @' ^9 Y$ n# e - (void *) NULL,
; @- Z+ P8 l3 Y4 q' e$ e - (UBaseType_t) 2,
+ v, u+ Y" {4 g - (TaskHandle_t*)&KeyTask_Handle);8 M5 {; N2 E, ~
- if(xReturn == pdPASS)
! t& Q8 y2 G, d0 `. ]; s - f_printf("KEY CREATE PASS.\r\n"); ^* M1 ?! S+ M A: ?
# a6 ?: Y9 W; s, @) J6 E. _) x- xReturn = xTaskCreate((TaskFunction_t)LED1TaskCreate,# |- e8 G z1 L
- (const char *) "LED1TASKCREATE",
: O; a& [7 q8 w - (uint16_t) 128,
z$ v5 n' @3 U( }# l5 g - (void *) NULL,
# @: X) x6 B0 H - (UBaseType_t) 1,
$ r3 q3 I0 c* }' f# q2 k/ O' H - (TaskHandle_t*)&Led1_Handle);
6 c, x# P7 w! f6 k" w( b9 H* C& `/ o* t; U
0 c2 [3 f4 I7 h: g* J% {) e1 Z" I- SemaphCount_Handle = xSemaphoreCreateCounting(3,0);
) @1 r$ w( _( {1 c* Y8 B: T( n3 [ - if(SemaphCount_Handle != NULL)/ p$ R* j& u" P6 k) y
- f_printf("SEMAPHORE COUNT CREATE PASS.\r\n");
/ f7 |( ]0 ^$ v+ E -
/ u% y1 M; y( S' T! w - if(xReturn == pdPASS)
3 G- h8 I9 K: g' ] - {
: k! P' J7 |+ p* a - f_printf("LED CREATE PASS.\r\n"); ( P/ `* w9 H# h# S5 P4 t8 ^& i
- vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);+ F& l8 ?- Z9 |& j: d h' A+ _, u% w
- }
! n9 m2 d" l5 T+ i* r$ ]7 C, W0 \ - }
7 }0 x0 }2 a$ \ - : z$ m6 R% {; _2 b
- 7 F/ `6 q1 H/ e4 A! F& p' [
- static void KeyTaskCreate(void)
" X9 ~+ m/ v2 N- B: } - {
4 e2 j( M2 ~- M, x) \1 q4 a - while(1)6 w1 c0 ?" g) k. F |
- {
( r8 G; H" z) E& _ H! _, H - UBaseType_t xReturn = pdPASS;. q3 A* d6 ], P' R& }9 f
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))3 y$ j7 ~2 V9 j _+ N% R" d& L! v
- {
, g N& g3 `/ X+ W - vTaskDelay(100);1 R, V, y. \3 \! L6 {) S6 G
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))! M V: k; V. h: ]4 r# _1 I8 p
- {
0 ~4 {; V. k0 H# b# W. W - f_printf("KEY PRESS.\r\n");) X5 p2 X! [- |# J x6 J7 ~
- xReturn = xSemaphoreGive(SemaphCount_Handle);! A$ D. X+ z F `7 i/ t
- if(xReturn == pdPASS)
' G0 x! v9 _! Y% c! Y# { - f_printf("GIVE COUNTING PASS.\r\n");5 h& E, g4 S- q8 n5 T
- else if(xReturn == errQUEUE_FULL)- c4 d: j6 Q- z7 Y3 u. W
- f_printf("QUEUE IS FULL.\r\n");5 D2 j) X4 E: x! L8 J
- }5 f- b7 m1 F, ]5 d
- }
$ u% I1 |, H2 j5 @) q) u - vTaskDelay(10);
5 v' @# T, }; f - }, f: q! B# [6 t; @( \
- }) w1 v# D! k' A4 L" U
- static void LED1TaskCreate(void)/ p' a+ E* T( z
- {: y0 |# x2 P- {
- while(1)
/ D& j& w% U7 B: q - {1 L- ], `2 Z( V6 \9 [
- UBaseType_t xReturn = pdPASS;- h, f i$ G0 \) C7 s
-
' e; p; u* N+ |: a; Q B3 G5 s - xReturn = xSemaphoreTake(SemaphCount_Handle,portMAX_DELAY);3 F, R" L$ e2 H3 m* v
- 3 v# S8 K- W( v. X! T
- if(xReturn == pdTRUE)- B7 a. Q' `/ l3 U- w4 @
- {3 k1 d8 B. y' T7 A6 m8 A
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);2 Y" b' m% n# M; _7 b
- f_printf("Counting Take PASS.\r\n");1 V9 s: ]/ a& a1 C) ~) C( w
- }
. G5 D8 Q1 _. Z - else if(xReturn == errQUEUE_EMPTY)
Q/ {, e, C. ] I" f7 W- b - f_printf("semaphore is empty.\r\n");/ U7 s6 {! Z. B, Q
- vTaskDelay(2000);
_$ ], ^7 L1 n - }/ R- S; ^1 G$ |# ?1 A5 C" u- S4 Y
- }* \" ?& X7 C6 B3 p6 }; D
- /* USER CODE END 4 */( `8 ~9 _* d* W( P/ r
- , f7 C; ]" j; W U/ w
复制代码
; ?% ~+ z. Q& k9 [1 h |