上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
9 }7 w1 l: B5 z2 o$ C) ]4 r# [所谓的挂起,也可以认为是暂停,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。& F3 c* V0 g! g0 T9 u
0 f& |, r- M, m9 O: ?在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。同样的,在文档中也可以找到恢复任务函数介绍。
+ q- v7 H5 K) p
. l: G) T& `, W, \, I- ?
* h& u, a$ U7 M. S
6 Z; o' ?. B; h2 ~1 g! Q: k( m* |& ~- X' m" Q! N& r
0 Q0 Q- K/ Z# M& Q+ k- V
! d5 G/ `0 v) q: t0 A接下来我们实现一个任务,目标是当LED1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。/ m' E1 x2 m% `+ }
% o0 Y7 l' E: z" f* L% @我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。LED0在进行vTaskDelay时是处于阻塞态,因此我们只需要判断LED0是阻塞状态还是挂起状态,再进行挂起和恢复操作。
# M8 v0 U- t7 P' G3 d9 e
/ w9 q: ^5 ?% c$ @% F% q4 @5 V( Y. Z* m
% L) o l: ^7 c2 Q1 v8 Z/ _
因此我们的代码如下; ~0 O) c9 `. `) P. r# \& L( P+ i
- void LED_TOG2(void * pvParameters)//参数为 void * pvParameters
3 j8 O9 g+ b1 J3 w$ C5 x - {/ G) R& y9 J2 ?* t+ s* H
- while(1)
! B* O4 g$ A: n. G - {: _. Q- e' \# u7 x- ^: k3 @" L5 z1 y
- printf("LED_TOG2 running\r\n");//串口打印运行信息6 o; R) y8 q6 M
- HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
% I2 ]8 p$ o( w' q; {' D' [ - LED2_Number++;//LED0翻转计数8 ^- l( K v* _! O4 P) k/ u4 V9 Y
- if(LED2_Number %10==0)% H( a& C/ s( S$ v- ]9 ^0 m
- {
% {, R# D# W! U3 E% o - if(eTaskGetState(LED_TOG_Handler) == eSuspended)
8 k- z! u, |% ~& y2 L7 ^6 G - {$ z" T M$ G! X
- vTaskResume(LED_TOG_Handler);//LED0任务恢复1 B5 k. o% l/ J; j5 q% p# a$ m
- }8 ?% B4 e7 A( e, \' L
- 4 a1 _) y+ R/ `4 p, E$ i7 v( |
- if(eTaskGetState(LED_TOG_Handler) == eBlocked )7 R; i; @/ G4 y( v8 ?
- {. q2 s' a) f8 u q- {
- vTaskSuspend(LED_TOG_Handler);//LED0任务挂起
) T- o$ U7 M& ^ R* D - }
! i& b: C0 h) A. E, {+ w0 X: |1 ?9 R - 3 w" C$ y5 G: h0 Q; O& h9 L5 R* f
- }
4 ~* a7 S- v3 N - 0 J4 q" b% c3 P4 Z8 Y u
- vTaskDelay(500);//延迟500ms" q+ W" F2 ~) b. Z2 p- @
- }
5 @. m! B! ^0 L - }
复制代码
( d# W1 \6 M* f' }" e% C* J9 _7 j2 {1 {/ _& l. O
转载自:电路小白$ a" j* I; P8 n) k& u; ~
如有侵权请联系删除0 B3 M/ T6 B" }* x7 Y4 E9 O4 a; @
4 w' o- i& W& n) D1 J1 X$ \
. b! ?; F9 P1 Z y |