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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-19 16:09
上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
* r$ B: M0 ?, b) S2 g0 K1 L
所谓的挂起,也可以认为是暂停,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。0 L  b" _1 g' s5 z
微信图片_20231019160904.png

! l$ _3 O. V! i9 [/ O8 n在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。同样的,在文档中也可以找到恢复任务函数介绍。7 q& G. }  J# m; U
; M+ g3 ]0 _( m; w  n
$ t9 }+ {) v. b7 {' H, Z
微信图片_20231019160900.png
7 f0 A. \; t" M  b- u! a! D+ ^. D
微信图片_20231019160855.png
. _  C% c3 O9 Y" P' C; b

7 i! k& ~" Z4 p3 N, O" }
. H6 i7 g6 U7 C" C1 r6 ~, f  t6 k
接下来我们实现一个任务,目标是当LED1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。

! N$ B1 O7 Y  H# [* [" f. t) C/ w# Q2 \: y$ I0 V  ~
我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。LED0在进行vTaskDelay时是处于阻塞态,因此我们只需要判断LED0是阻塞状态还是挂起状态,再进行挂起和恢复操作。8 ]) b; t6 d- `7 I$ p( z! T- u, r

$ t5 T& L1 Y& ^- i. a) r$ u  }& `
微信图片_20231019160848.png

6 _" i# `) h2 l* ^1 ~2 E1 V, J
微信图片_20231019160843.png

% ~, u! l* x- N, m$ Q$ X! r# q因此我们的代码如下
% H& v! @) C# T6 S: Q
  1. void LED_TOG2(void * pvParameters)//参数为 void * pvParameters* p* a/ |4 S' r; c& u) m* ]6 s
  2. {* U' M* r0 H7 b: @0 [- d- ~
  3.   while(1)5 o( P1 K( `0 w+ J3 d, I
  4.   {
    9 ]5 _" N- W% V0 @; @! D9 B
  5.     printf("LED_TOG2 running\r\n");//串口打印运行信息
    ( ^! S# k, P6 I! f8 a$ \( B
  6.     HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
    + [' U$ |6 g5 J. T
  7.     LED2_Number++;//LED0翻转计数0 k. R/ k$ f0 N8 W! N
  8.     if(LED2_Number %10==0)
    1 |: I8 r& I& v# G
  9.     {
    / N. Q8 z" p$ o& [& a) Z& P
  10.       if(eTaskGetState(LED_TOG_Handler) == eSuspended)8 T' _* Q; c1 _" T* M3 U
  11.       {* B' ^4 I; j. h5 O
  12.         vTaskResume(LED_TOG_Handler);//LED0任务恢复) T" `6 E  E# a1 ~# c) `
  13.       }
      q7 v3 G( G1 M. P6 j
  14.       
    2 {$ V6 m' x9 Y$ h4 k! V
  15.       if(eTaskGetState(LED_TOG_Handler) == eBlocked )2 x0 d* b. ]" o: I9 K; ?+ \
  16.       {; S+ b/ T6 x8 Z
  17.         vTaskSuspend(LED_TOG_Handler);//LED0任务挂起
    - J" A1 i: h5 R& D: c% B# G* E
  18.       }+ E" T  w1 t0 |, y
  19.       
    3 ~0 R! ^: S# J
  20.     }
    / Z6 b. V$ n" L& g4 j7 q, C
  21.     9 s0 m! w8 a  B& L( c7 w' v) H* G
  22.     vTaskDelay(500);//延迟500ms* [; d/ D1 q# a# f
  23.   }$ y8 }# n* p( J1 j3 F
  24. }
复制代码
  |% P* _7 ?4 _/ P; @. ?: M
: c) u% u0 f4 {- ?) V  Q, V  a
转载自:电路小白3 c: u! N/ p, G8 {" l  W& L
如有侵权请联系删除
9 g8 H3 g, w$ K% t; ]+ _# X7 Y: u( ^2 l  u7 ^1 P# a% X
! h2 U* l8 r7 k+ B: Q% {# r
赞 收藏 评论0 发布时间:2023-10-19 16:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版