上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
8 k% W- Y& E$ X( v3 y所谓的挂起,也可以认为是暂停,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。
2 ?' T$ u7 q9 Y0 o8 T' e5 U1 J
( C; Q4 j* z5 [& ~# y3 r% l在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。同样的,在文档中也可以找到恢复任务函数介绍。, u! h' m4 c2 y# [1 @- p
3 d, l* Q1 t% O( E4 F* |
. s; c# y' W/ H' ^, G2 g$ e
0 k$ C* u s& U) a- m4 E) A3 _& X2 P3 h% k& J
$ T3 Y- m1 s8 Z) U! D/ H
$ L P3 x" @ m S( k' {1 ]7 }( e7 a7 H接下来我们实现一个任务,目标是当LED1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。' j8 G+ r# M! P$ j, c
: M; q* n: |/ }, B) t
我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。LED0在进行vTaskDelay时是处于阻塞态,因此我们只需要判断LED0是阻塞状态还是挂起状态,再进行挂起和恢复操作。7 E u$ L8 |8 O+ F4 L- p z) g5 D( ~
9 r* W q# j- J$ y, e$ R S
j! D) s* b+ K* C; B
& v8 J" G B$ A8 R7 q) t2 U因此我们的代码如下! N& e7 C5 x7 x; C1 L1 X; }
- void LED_TOG2(void * pvParameters)//参数为 void * pvParameters3 y3 W1 A' W5 `% T) q2 E
- {
/ p. a# U# N8 G4 X - while(1)
- v) h8 Y$ _. H: r1 q - {, q% }) f) V% [" a; O6 t
- printf("LED_TOG2 running\r\n");//串口打印运行信息
" Z9 u. ?/ q7 e7 [% i* E4 r' Y - HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
& p: r, r0 H9 l - LED2_Number++;//LED0翻转计数
+ I: ]+ t$ [/ m4 |9 P8 ~ - if(LED2_Number %10==0)& v( o( ?- }. k3 n& J! A
- {5 V6 s) n# \1 m" J
- if(eTaskGetState(LED_TOG_Handler) == eSuspended). y- Q; m8 ~) M; J$ Z! q
- {
( Q9 h( u+ K: Y, K: }1 M/ T - vTaskResume(LED_TOG_Handler);//LED0任务恢复 s8 F( z& H; M9 ]' v
- }+ K$ T7 I' D/ s8 V1 p' x
- 6 \# m0 Y) D. @: ^* y0 o
- if(eTaskGetState(LED_TOG_Handler) == eBlocked )
5 N1 g9 @6 Y% Y, ]" U4 y, F - {
, Z/ J k1 j2 i/ z - vTaskSuspend(LED_TOG_Handler);//LED0任务挂起7 t/ G$ i, R/ [9 q3 c
- }
5 {4 ]# c1 f$ F2 Z. n% l( l- r# | -
! v- \5 ^; a- W5 C# P) [ - }
; o/ R5 U/ }+ {" b' h+ k -
% r$ I* ?5 @9 a9 ?& L, K z - vTaskDelay(500);//延迟500ms
, E- G' L0 z) _" w. j8 Q - }$ `- G$ C' u1 T% R
- }
复制代码 9 W9 R+ `* f$ e/ \0 d
C+ q, `, M' F/ g! N+ ?" l
转载自:电路小白
8 K8 q3 l e7 Q! K如有侵权请联系删除4 V9 G p- }. ~7 s( E: \4 z
! }( N4 A' V' u1 j6 a2 N( j& o) I
0 p. z% Z! d: Q, f) B7 q |