二值信号量的用法示例% @6 J9 L( z6 _8 H8 N0 s
1.创建好带有printf-stdarg.c的FreeRTOS的工程
: B, A7 ?( p; n# F g* p0 t* }- }, u( t5 @" k, h: \: ~- y
2.修改main.c文件
/ b' r: Q. A( o& K$ Y1 z& k r
: ?! {; H O9 {- /* USER CODE BEGIN Includes */
9 p2 ]2 z+ O) a
0 j2 q& z7 R, A; B' h2 q. S" [- #include "FreeRTOS.h"
" d7 X* L. i* A: Z, Q( u - #include "task.h"
% P* l) e' p) K: x - #include "queue.h" A) u; h8 z- |* y# i; v
- #include "semphr.h"1 K& |9 Q7 p3 O; J: C
- #include <stdio.h>
4 T+ I4 F* w. j. i5 `( | - #include <string.h>
) j2 G% D3 n" D* o6 F, } - % ~' U4 s7 u, Z1 ?
- /* USER CODE END Includes */( Q e; e# X, \, ]! p
- /* USER CODE BEGIN PV */
" k9 H8 r. ~, R9 B
7 w% ?- q; |% L' A) s I* q+ Z- static TaskHandle_t AppTaskCreate_Handle = NULL;
" A7 l/ X3 ^+ f - static TaskHandle_t KeyTask_Handle = NULL;. V* a5 {( f8 U& T/ Q4 ?6 K/ ?$ _
- static TaskHandle_t Led1Task_Handle = NULL;
3 S$ M+ e( B, M3 x+ g, e - / I# i1 S0 f7 G6 ^
- /*Create a binary semaphore handle*/
, s! g# @! I# E( S - static SemaphoreHandle_t Binary_Handle = NULL;2 v) j M+ B3 r# j, y. f3 n
/ d! i# G' b0 I: { h- extern int f_printf(const char *format, ...);, q, W0 r- L9 V8 `: {" w9 G- }3 h
, \" s2 \/ k( R2 p q+ B- /* USER CODE END PV */
3 l2 U4 O# `( i, Q9 e - /* USER CODE BEGIN PFP */
* e$ X h# f" `0 ]
1 \: \8 g# D! y6 X( ^2 i" e" Q5 o- /*Create a task function*/
0 k$ P+ R! z1 ?. v" v# M - static void AppTaskCreate(void);
7 S- d, W- |: ` - static void KeyTaskCreate(void);
! s' s6 }! i( J0 c* i+ [ ?1 S - static void Led1TaskCreate(void);
" @+ }5 {6 P" N+ {; [ E. K4 I
: c5 z: w# B. y7 M, `0 q- /* USER CODE END PFP */# |6 {) c$ F3 n
- 0 c: G n: V* k# r5 O
- int main()
: v$ y' K5 I3 w& F) W: Q% u - {( w2 x8 w( J3 X1 \
- /*
1 {/ k$ @7 `2 {( `( Q3 U9 p - *
4 L! \3 a3 |3 | - */
) _2 J" R' f- _! t! b; K" U - /* USER CODE BEGIN WHILE */
' m* F1 U4 W3 T - UBaseType_t xReturn = pdPASS;# ^! [! O, p- W0 k, d5 t: m1 z' y
- & {) h! X: g: v
- xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,# I Q& l# Q% Z v
- (const char *) "APPTASKCREATE",( J8 X) i" _6 L! n: H0 L# N4 E- v
- (uint16_t) 128,
" H& K3 ~( O/ t8 ^" h - (void *) NULL,
& }' `0 ?: E9 J - (UBaseType_t) 2,3 g, U9 V% u% N+ L
- (TaskHandle_t *)&AppTaskCreate_Handle);
, b6 o8 @/ \0 V' I! a2 ~ - if(xReturn ==pdPASS)8 P' L2 [" n. d0 L$ q
- {
3 ]* @7 H$ }3 X6 z8 z - vTaskStartScheduler();0 g0 `# H5 Y: b9 z; ]
- f_printf("start..\r\n");
2 V) M7 {5 I- v( W W2 [1 p- N - }
. _$ I" H$ b- @0 r - while (1)8 s; L3 k' {9 B9 T, M5 L6 P
- {
2 H/ A4 u1 \) y) S; a - /* USER CODE END WHILE */
+ O/ L" t1 O' ] D! a x - # r' E% S9 j$ ^5 S9 m
- /* USER CODE BEGIN 3 */! ?, k6 I( ]4 u4 m8 {
- }
( T& B2 o+ S- u: ]8 U$ g - /* USER CODE END 3 */
- d& c1 F: s' ^, B, A8 k. E
6 f1 j2 y, C4 Z3 e; ~( f* H8 q
" t* P% p$ Y, V5 N( {- }" u) f) c" n$ X* \9 M8 a& N
7 q3 y8 @2 u3 @: L3 F- 5 S& U1 S; X" D& Z7 F) M, ^
- /* USER CODE BEGIN 4 */% W% {0 U* {/ w* F- C
- static void AppTaskCreate(void)
. D. @. i$ r! Z( I* Z - { ^8 a6 r/ f1 S7 d a- g" [
- UBaseType_t xReturn = pdPASS;
2 M) R- P0 P6 P' K7 s1 c+ {# S - 4 e. I8 I+ `. ^( R
- : f$ j0 @' u. g2 n" _
- xReturn = xTaskCreate((TaskFunction_t) KeyTaskCreate,
8 r( f' i( K4 L4 W9 c8 ~$ e$ l - (const char *) "KEYTASKCREATE", }: N- _ M4 @ M- t8 I, t
- (uint16_t) 128,( M. [9 A7 t9 c" T, U& l% V
- (void *) NULL,
; X2 L+ N7 Q8 j! P9 H+ i0 T - (UBaseType_t ) 2, L0 y% Q9 V1 R" Y) t: q# I
- (TaskHandle_t *) &KeyTask_Handle);
# K" w# m$ S" o( i" {: L/ Y
9 F! ?) G3 W# Z6 T: v6 C% \- xReturn = xTaskCreate((TaskFunction_t) Led1TaskCreate,
6 Z* n1 a8 e/ Z% d/ y4 h - (const char *) "LED1TASKCREATE",1 A& }1 K- c$ |; v) ~
- (uint16_t) 128,6 o/ Y& N7 H6 G; y/ {! k
- (void *) NULL,
7 i9 l! K& H) e' ~, x5 O/ E - (UBaseType_t) 1,/ |4 T d8 X s* j. U0 h8 M! W6 i
- (TaskHandle_t *)&Led1Task_Handle);
% Q& P @; H/ p -
6 R. |8 Q. W9 j# s" z* Y& V - /*Create a binary semaphore*/
, _8 a8 T' w7 s4 k2 Y - Binary_Handle = xSemaphoreCreateBinary();
) b6 \8 E) T6 h$ w _ - if(Binary_Handle !=NULL)
k' K! D4 g' G - f_printf("Create Semph_Binary PASS.\r\n");
6 ]' F! a4 X8 `+ j - ' A& I0 y; N7 o* }
- if(xReturn == pdPASS)
" f- _9 e5 |6 s6 ~ - vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);
, X5 h$ `. a/ H* m4 H - }! n9 S6 Z1 x/ h8 c$ m
# T+ r9 {/ z% A- static void KeyTaskCreate(void)" f) G3 a, U: f, r
- {
; A& k3 E& M; @9 ?, ]1 m - while(1)7 h u% O6 z: r( w- A" d6 w5 F0 `
- {0 E3 G1 W! N+ s: N3 H" ?, d) N
- UBaseType_t xReturn = pdPASS;
* \# e' c- @, C- D& i! u R. `8 H - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
0 n, P; q6 h) |# @2 W - {
; r/ j9 u) r. l* u* g - f_printf("KEY TASK PASS.\r\n");, \5 s, D! ]7 E K7 [
- vTaskDelay(100);
3 {8 e7 N5 }" _ - if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))
3 F# T7 @) i9 C9 T9 F8 W - {
- H, T2 W* @5 G- `: X8 U6 E - xReturn = xSemaphoreGive(Binary_Handle);
/ e' Y# _6 y! A! F) j W% Z* [1 B - if(xReturn == pdPASS)) H+ k, ~5 ~9 N2 B6 m
- f_printf("GIVE BINARY PASS.\r\n");6 B) ~3 T" D- Q4 }, ^+ V
- else if(xReturn == errQUEUE_FULL)
$ k- T% L1 Y2 e - f_printf("QUEUE IS FULL.\r\n");
/ C/ u5 Z# W- B1 ^ - }
9 z: z$ ^ r+ e7 `9 y3 e - }
$ @7 S( q/ S% o, } - 8 _' x- X' g. K z4 `: D' m. f/ G
- vTaskDelay(100);
% \3 ?% |+ k: ?6 @5 q - }
6 U2 E+ N" n( u# B' M
* [& R4 \; f% n$ @- U1 U- }
! C% J- s' D5 ^2 g1 p, y - static void Led1TaskCreate(void)
4 O, @, o5 n9 u2 N2 i - {, h) U' y8 L0 C* N. n
- while(1)
9 p3 G% J9 e3 n$ L" [ - {
8 j; ]/ m: v5 O' @7 c - UBaseType_t xReturn = pdPASS;
' A5 r2 y$ C; q, Q' X - " t' t. K/ U3 L. @7 E5 [
- xReturn = xSemaphoreTake(Binary_Handle, portMAX_DELAY);' B8 m: n7 h/ y( q2 p$ a
- if(xReturn == pdPASS)1 U5 V/ F. q* e Y
- {8 u* v/ B& g; ?' r7 i7 Y: |. @) T
- f_printf("TAKE BINARY PASS.\r\n");6 y7 H" r8 J/ h1 g# t
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);2 m2 a0 w5 ^. p4 |7 j, j
- }0 d- C5 _, d \5 t
- - @; f1 k* P# {/ b
- vTaskDelay(100);" B( K' C8 n$ H9 b( y6 A3 x
- }
: C X8 q; G! }$ s9 {) ~# L, U2 O - }3 L# u# R! M0 s/ c
- ! u. [8 O% M9 K, g, j
- /* USER CODE END 4 */
复制代码
4 I0 l4 a. ~! p) g( N/ L' H计数信号量的用法示例
/ @3 a& {; J8 G) b! _& a1 C1.创建好带有printf-stdarg.c的FreeRTOS的工程" w8 A6 g' S! }* b1 Q
Z- T0 |0 C0 o8 A) E2.修改main.c文件
. ]* @2 Q2 `/ E- o' g$ \* L- w
- K( V0 y" ?! ^+ L9 Y- /* USER CODE BEGIN Includes */6 x) i9 p% l! Z t: y
- . ~0 w( u3 c: G) X! i
- #include "FreeRTOS.h"
+ r, P7 W% `! @: R - #include "task.h"
8 R c/ ]/ \. _$ n; { U - #include "queue.h"
& w. P$ L/ ]& Z - #include "semphr.h"- T" O; M, [( g& O* @; N+ g; R
- #include <stdio.h>
9 }1 Q3 t( \' r* p1 o. O& } - #include <string.h>
$ y- X$ h$ E9 L O - - O4 o; T6 p* i# O' _
- /* USER CODE END Includes */- z4 @2 ?- S9 m: U/ m1 S
- /* USER CODE BEGIN PV */. M: d: m) _- g& Z) T2 N
- static TaskHandle_t AppTaskCreate_Handle = NULL;
6 Y/ _ X. ~+ N: B! F ? - static TaskHandle_t KeyTask_Handle = NULL;! |9 i, k7 ?( }! v9 h
- static TaskHandle_t Led1_Handle = NULL;7 F9 l% F4 n7 e/ l" [* x
8 M% M) v; z \9 y) W- SemaphoreHandle_t SemaphCount_Handle = NULL;# x. \3 i( _. A0 A- Y. w, t M/ d
+ f$ g) l: f, o: V% ~8 K+ z- extern int f_printf(const char *format, ...);! i- y- a6 \. j. h( s$ r* t p
- 6 C8 |, k4 B5 \. w. j6 Z2 r1 x. _
- /* USER CODE END PV */' I9 A2 A* V! O# D
- - B7 Z' t$ Z+ x& H
- /* USER CODE BEGIN PFP */
7 ?( I: p& o d9 F | t - 5 ]4 N8 \4 T' C9 ~
- static void AppTaskCreate(void);' U9 P" u, a) m
- static void KeyTaskCreate(void);$ i( F8 P. R5 _8 j, ?' L1 l: g/ \
- static void LED1TaskCreate(void);
) C# x9 h. H; O+ {% p v
) |7 `% ^0 C w+ S1 E6 @3 d- /* USER CODE END PFP */
' N2 j, `: m) i9 G& B6 K z8 A) | - : } M* k( [. C% ~' B, S, D
- int main()) I6 b) ^" S" R+ l+ z
- {4 w5 f9 _! }" v7 p& t0 D
- ***
" g0 v7 a% u' j* m8 z- w9 p - 6 w* I# Y. D# P
- /* USER CODE BEGIN WHILE */ B# P* W" u% v2 [/ T u% K
- K' K$ b5 F3 X$ Z- UBaseType_t xReturn = xTaskCreate((TaskFunction_t)AppTaskCreate,( V; ?! v" I( e8 K3 A/ ^
- (const char *)"APPTASKCREATE",
) m) q* D* c: [- _1 A" Z- s) Z - (uint16_t) 128,* Q& P, \9 h3 y6 A' R6 m1 U1 L4 e
- (void *) NULL,
1 b8 B) u& s- h# B: q - (UBaseType_t) 2,2 O% G7 x# s& f6 s8 N4 t( u
- (TaskHandle_t *)&AppTaskCreate_Handle);
( T+ O* t; x, m9 R - if(xReturn ==pdPASS)
- S w- P% ?! @5 e - {+ E/ I% p1 i5 e3 b, d4 @
- f_printf("TASK START.\r\n");
0 U' ?) Z. Q/ [6 ^ - vTaskStartScheduler();* L. I" @. P& n! x* K o
- }
9 j# b* D4 G3 q3 [2 B _& I - while (1)3 f5 a% y+ g/ p& z' Q
- {
_6 t% C8 L; a, B$ y: ?# T9 @ - /* USER CODE END WHILE */
6 T: h% d% R" b$ O z+ s# q0 k
8 L+ Z) V4 H' G4 Y ]( E* x/ ?- /* USER CODE BEGIN 3 */
/ t4 N9 E. e1 q/ ]. @ - }
0 b X4 a# W1 c" t2 Z; u - /* USER CODE END 3 */
7 P4 t* l& J6 b2 U \7 f" s - }
8 Z( p, q |! S1 p - 5 x4 c# {- U4 q/ x( i) D
- /* USER CODE BEGIN 4 */
' e$ }9 @ p# T. _, b# d$ t - static void AppTaskCreate(void)
7 c2 Z' t" Q+ y# R - {. D; O8 C0 n9 \- D( @
- ) N+ E! y% ~4 l$ ^ ~& E
- UBaseType_t xReturn ;; j/ C1 B" A: T) B
- xReturn = xTaskCreate((TaskFunction_t)KeyTaskCreate,
, U. @3 R$ Q1 \1 D - (const char *) "KEYTASKCREATE",$ {* l, _4 o5 E1 g
- (uint16_t) 128,
7 g+ L1 ]5 z$ I - (void *) NULL,
7 Y2 e* }$ E' [+ i% Q - (UBaseType_t) 2,/ L) N; t% n0 w. \% @8 r1 M* C$ B P3 r# k
- (TaskHandle_t*)&KeyTask_Handle);
9 o3 } f0 b: n9 ~2 P* p- r) I3 x' H - if(xReturn == pdPASS)/ e ~3 E/ d3 I" v( f7 v; h8 i
- f_printf("KEY CREATE PASS.\r\n");
7 w; l, P+ N6 i) l
9 } ^4 X3 |! [2 o( z5 m' L- xReturn = xTaskCreate((TaskFunction_t)LED1TaskCreate,
$ u5 I' t: w8 j7 ?1 e, Z. J - (const char *) "LED1TASKCREATE",& a- s; X! m4 z0 W# O
- (uint16_t) 128,$ V$ o( g" U c$ `1 F }' t
- (void *) NULL,& u: }! E1 ^! |- N6 ]
- (UBaseType_t) 1,+ ]# b) o. P7 V) P7 H2 O; F
- (TaskHandle_t*)&Led1_Handle);
" S( t9 a- `9 ^/ Y" E" H" f - 7 z" i8 I2 k; U' k, B$ B6 u$ X
- SemaphCount_Handle = xSemaphoreCreateCounting(3,0);
, c" X- H% H5 c - if(SemaphCount_Handle != NULL)
" r5 S! B: ]+ t* s$ [ - f_printf("SEMAPHORE COUNT CREATE PASS.\r\n");
6 F; C; y0 a$ x4 O7 J2 F - * ^/ b3 v$ Q4 [) F
- if(xReturn == pdPASS)
' A4 S% g0 K' x k - {" W+ ~% ?/ W2 R
- f_printf("LED CREATE PASS.\r\n");
3 `: q( I; _2 z4 T1 a - vTaskDelete((TaskHandle_t)AppTaskCreate_Handle);
8 E t$ A+ h. G' U5 [, ?' S8 [ - }/ ?& o2 {6 `% _" m; ~4 C7 N8 q, e
- }
' k" R0 C- Y0 }" h, E' f - / d# {, |2 E; X$ M; \5 J; p
- - l, x( W' K' j& x5 b
- static void KeyTaskCreate(void)
! k, ]0 O# u' H" x, Q - {# j7 v* s* r7 l# z+ [ J
- while(1)
% j/ x, ?5 H: o. e" B# l; e - {
% C9 F2 S; T# r - UBaseType_t xReturn = pdPASS;" E4 N5 t6 L+ a: `% I5 K
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))$ N" `3 r8 i6 \9 }; W4 a/ l" z
- {( a8 f( K; D2 i! M
- vTaskDelay(100);+ j: a, X9 Q/ w* P$ a7 L2 d9 \# I
- if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0))( r1 Y0 l) {( R$ T& f, o
- { D W, e: D# ?. ]& s3 T
- f_printf("KEY PRESS.\r\n");
* U! Y; I% L+ x% T+ Z" P - xReturn = xSemaphoreGive(SemaphCount_Handle);1 }' z! O& ]* p
- if(xReturn == pdPASS)( M: E" W# T# k; g* B4 S' A, Q
- f_printf("GIVE COUNTING PASS.\r\n");
9 k! ^! |1 r- I - else if(xReturn == errQUEUE_FULL)0 C: A6 d0 K0 R: X0 I
- f_printf("QUEUE IS FULL.\r\n");4 n4 L( A0 \ o, `2 c; L
- }
0 [& ^' H& A. d# }8 O+ R0 `$ o. j - } & z) m5 o# [0 W7 Y5 N8 D1 V1 o# }) H
- vTaskDelay(10);7 j0 ~4 A3 \5 q+ v. `
- }
7 y6 t0 Z: I3 c1 S/ ?* A N' _ - }# I. |! T/ }1 t( j" }, }- f* K
- static void LED1TaskCreate(void)
8 R F5 H% t% j - {
h* K5 ~0 b0 r m - while(1)* Q/ U9 G4 z* ]- ?$ x: h" T( T" f
- {# S: b, x! h% E$ u n# u+ }
- UBaseType_t xReturn = pdPASS;2 p* Z+ ^8 P0 }; n) s4 l2 g
- 7 a( c: a$ Y* R- w1 }8 `" g
- xReturn = xSemaphoreTake(SemaphCount_Handle,portMAX_DELAY);
$ q6 K) d- a9 Y: X" k5 v - 9 `) T/ V8 [* q3 k4 a( M" ?5 B! b
- if(xReturn == pdTRUE)+ I( P, s) A8 I1 X& a7 l
- {, p% Q. n$ c+ @8 D
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
7 n" ]/ R( s& ]4 k - f_printf("Counting Take PASS.\r\n");
8 J3 ^! {# l7 `4 i# W! @! R - }4 o' U9 T- r9 {9 \+ z
- else if(xReturn == errQUEUE_EMPTY)+ E! Q2 t8 w/ a2 k# @
- f_printf("semaphore is empty.\r\n");
0 i0 j# B7 T8 ? - vTaskDelay(2000);" C" `* E0 G7 H) S- K2 ~( N
- }; z; ]7 {8 J' [1 @* p' G: Q' O! X
- }2 }! t1 U2 ~% u$ ~# U+ z
- /* USER CODE END 4 *// K2 h" [' }; M
- 7 f; h1 b* c) `; j1 z( A6 M5 O
复制代码 : k# G! W/ t* s# ~- L" m- q8 c
|