你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F407的FreeRTOS任务的挂起与恢复(3)

[复制链接]
攻城狮Melo 发布时间:2023-10-19 16:09
上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
$ p4 D! ?( Y' ]0 Y& M' x/ r* e
所谓的挂起,也可以认为是暂停,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。
4 E2 v6 c( t; [" D6 Y
微信图片_20231019160904.png

; 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
微信图片_20231019160900.png

/ }! U9 G0 y. Z  y* R
微信图片_20231019160855.png

" }) 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
微信图片_20231019160848.png

! V/ H4 S+ }+ Z9 U
微信图片_20231019160843.png

8 }! _" f3 H# }$ q因此我们的代码如下
9 k, _, M0 [( F. \
  1. void LED_TOG2(void * pvParameters)//参数为 void * pvParameters- E, u, q9 E# t& P. U. w
  2. {
    : [- q3 A8 n! F4 `3 G
  3.   while(1)# T" _3 R2 j/ N! h7 p% x" s7 [  O) U
  4.   {
    / n4 c9 y' w/ ?+ {  m: f$ M6 j
  5.     printf("LED_TOG2 running\r\n");//串口打印运行信息. {' u' @- T& \( ?+ u( U
  6.     HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
    ! c. u# V  e8 ?9 d3 X6 ~3 r% S9 l
  7.     LED2_Number++;//LED0翻转计数
    ) q0 ^; J) a# B
  8.     if(LED2_Number %10==0)6 h+ J1 r# L& X& t3 w3 _
  9.     {) Q2 B8 }! q( r3 @. n! b! p$ N
  10.       if(eTaskGetState(LED_TOG_Handler) == eSuspended)( s6 e' L1 O3 \. v' s, x
  11.       {& r+ B% E! G8 i0 Y" @6 V
  12.         vTaskResume(LED_TOG_Handler);//LED0任务恢复( C; u' Y' L+ u! i
  13.       }% n" u3 Q. N8 p# h7 S8 o5 N
  14.       + M# `4 Z. C' L) h) F8 D
  15.       if(eTaskGetState(LED_TOG_Handler) == eBlocked )
      E" {# g- q7 j! Z/ R
  16.       {
    ; m+ Q) A) h/ ~& H
  17.         vTaskSuspend(LED_TOG_Handler);//LED0任务挂起
    ) L. M6 ]( _! U/ k8 m
  18.       }/ M5 ^9 c( k4 ~
  19.         W. p5 y) Q" {# Z2 B1 `( n% Z) M
  20.     }
    * V: G! L, N; G) t
  21.    
    / S/ n# k$ B6 G! S0 K2 b: \
  22.     vTaskDelay(500);//延迟500ms
      |6 L- H& n+ h& h( }7 N8 \
  23.   }) M& m$ C7 Y/ V2 O0 o2 ?; @% l
  24. }
复制代码
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
收藏 评论0 发布时间:2023-10-19 16:09

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版