上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
$ p4 D! ?( Y' ]0 Y& M' x/ r* e所谓的挂起,也可以认为是暂停,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。
4 E2 v6 c( t; [" D6 Y
; l8 R7 j# H5 E. |) ~( g# J在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。同样的,在文档中也可以找到恢复任务函数介绍。; Z+ \: U: N+ {8 K& Q% D
C4 J# {) u6 K, \7 w* [ Q4 b
; E* y2 ^* A1 G5 Y, j
/ }! U9 G0 y. Z y* R
" }) X, g E5 M2 f7 u: I% O) h# K; b
# F2 u! F9 T2 w8 ], H0 j接下来我们实现一个任务,目标是当LED1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。
/ u |; m$ x( E. _
8 q9 U2 D) U# a5 f, _: r- Q$ X- i我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。LED0在进行vTaskDelay时是处于阻塞态,因此我们只需要判断LED0是阻塞状态还是挂起状态,再进行挂起和恢复操作。* i2 i) u: E% Q4 N
; g. z! |/ D( y! z
! V/ H4 S+ }+ Z9 U
8 }! _" f3 H# }$ q因此我们的代码如下
9 k, _, M0 [( F. \- void LED_TOG2(void * pvParameters)//参数为 void * pvParameters- E, u, q9 E# t& P. U. w
- {
: [- q3 A8 n! F4 `3 G - while(1)# T" _3 R2 j/ N! h7 p% x" s7 [ O) U
- {
/ n4 c9 y' w/ ?+ { m: f$ M6 j - printf("LED_TOG2 running\r\n");//串口打印运行信息. {' u' @- T& \( ?+ u( U
- HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
! c. u# V e8 ?9 d3 X6 ~3 r% S9 l - LED2_Number++;//LED0翻转计数
) q0 ^; J) a# B - if(LED2_Number %10==0)6 h+ J1 r# L& X& t3 w3 _
- {) Q2 B8 }! q( r3 @. n! b! p$ N
- if(eTaskGetState(LED_TOG_Handler) == eSuspended)( s6 e' L1 O3 \. v' s, x
- {& r+ B% E! G8 i0 Y" @6 V
- vTaskResume(LED_TOG_Handler);//LED0任务恢复( C; u' Y' L+ u! i
- }% n" u3 Q. N8 p# h7 S8 o5 N
- + M# `4 Z. C' L) h) F8 D
- if(eTaskGetState(LED_TOG_Handler) == eBlocked )
E" {# g- q7 j! Z/ R - {
; m+ Q) A) h/ ~& H - vTaskSuspend(LED_TOG_Handler);//LED0任务挂起
) L. M6 ]( _! U/ k8 m - }/ M5 ^9 c( k4 ~
- W. p5 y) Q" {# Z2 B1 `( n% Z) M
- }
* V: G! L, N; G) t -
/ S/ n# k$ B6 G! S0 K2 b: \ - vTaskDelay(500);//延迟500ms
|6 L- H& n+ h& h( }7 N8 \ - }) M& m$ C7 Y/ V2 O0 o2 ?; @% l
- }
复制代码 7 z9 X$ l/ L/ M7 W( R2 Q8 [( r- e
* g6 l$ a- ~$ q6 a# l+ q/ C6 v
转载自:电路小白
7 I- B: j$ v% w1 L8 Q如有侵权请联系删除
6 B1 \: T9 F' Y- m) k, x
! O4 l- m$ G, N; v
2 H( D" v; i+ l2 Y |