上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
0 _" a/ L5 ]4 r5 q! `. I所谓的挂起,也可以认为是暂停,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。* Q$ U$ d) Y6 r. e3 d1 v3 R1 M
2 Y5 w# j3 G! X: J( f- G) X' U在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。同样的,在文档中也可以找到恢复任务函数介绍。
' `. h# I8 x: O1 I# W5 S( _5 d/ ~- r6 X$ F9 N+ X% K7 C2 p
$ W, K) W8 t( B) J1 U1 a) V& z! e3 ~. N+ f/ m
1 C, i& X; r+ T+ T+ J0 s6 h( y& I8 |" w+ ?* c# ?1 E) R' s/ n
6 |, C5 l: T: C
接下来我们实现一个任务,目标是当LED1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。8 c- p( Z1 [7 ~+ C( A) ?
5 F0 }" A$ [0 F" [9 o
我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。LED0在进行vTaskDelay时是处于阻塞态,因此我们只需要判断LED0是阻塞状态还是挂起状态,再进行挂起和恢复操作。
' n6 ?) Y1 A1 G6 Y2 H
5 Z' ~2 Z' Q4 n9 F* M8 ]+ E) I2 E
9 m! t6 K2 v7 D' T3 W# F/ F3 Q. e( o+ o# F6 v
因此我们的代码如下+ u; U# e1 `* k- }# P& A: B
- void LED_TOG2(void * pvParameters)//参数为 void * pvParameters
4 g& m9 [6 p% [1 C" ?$ C - {
/ P4 G0 J+ Q/ r! G% Z: x - while(1)- s$ m" Y3 u! Z; D! q9 K
- {$ k& L6 X# x1 s# E: ]9 B. h
- printf("LED_TOG2 running\r\n");//串口打印运行信息6 G- O! Q1 N( }! E: l
- HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
& ?" }9 W+ B' x - LED2_Number++;//LED0翻转计数6 e) B/ m6 Y' c# C9 S% }( f
- if(LED2_Number %10==0)
* y1 o0 Z. V5 D7 E& a - {+ y1 `" {) L9 x/ f* U8 P
- if(eTaskGetState(LED_TOG_Handler) == eSuspended)7 A: ~* p7 [* f4 q/ O- q
- {
: @- D6 o5 G. ` - vTaskResume(LED_TOG_Handler);//LED0任务恢复
: o% s- a; u6 `2 Z: T5 k - }- L+ P, c! z- s* i% m1 q2 [" ?
- 4 K9 {+ k }+ \6 e Z; j; W$ _
- if(eTaskGetState(LED_TOG_Handler) == eBlocked )
: A2 t& v. d" E9 R0 E - {2 F/ q J& V8 ~3 U3 B
- vTaskSuspend(LED_TOG_Handler);//LED0任务挂起6 p0 z7 j+ Z+ s' L+ E1 S- i& K% b( I
- }/ K0 U s& Y3 d2 k- [; P
- $ c4 f7 V& G. ~( v
- }
: O5 n: L4 L& s: T -
) h) O0 A- d5 d - vTaskDelay(500);//延迟500ms
- j& R# y) }' {4 r5 y) D7 B2 g - }
1 W5 ?3 Q) q9 \, d$ n" | - }
复制代码
- Q8 [$ M! P: L& p, x
* X" O4 w2 x4 n! r5 s$ ]转载自:电路小白+ C; W0 r/ j% B3 q
如有侵权请联系删除
0 r; w: u# E& V, x; ~' O6 ~# |
6 b) m8 a* b6 v
4 e" F) K7 Y1 s1 u. O( V# R |