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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-19 16:09
上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。0 z) ~" H3 t7 n/ F, D
所谓的挂起,也可以认为是暂停,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。9 U4 L& K* f' }+ x: w
微信图片_20231019160904.png

! Y5 s6 R4 x5 I! L5 {; P" h' g在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。同样的,在文档中也可以找到恢复任务函数介绍。2 Z: a4 w" J& n8 r( J
1 N4 l6 l3 `- H) D8 l
5 `% `* q1 y0 N4 T' m1 C+ n
微信图片_20231019160900.png

" k7 J; E. F7 w5 j& I" v5 T
微信图片_20231019160855.png

! J9 D& D7 o1 P# B2 Y
' C/ P7 N3 h; ~) L; v

: I' m7 ?! q+ g1 Y! _接下来我们实现一个任务,目标是当LED1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。
: I; M  }+ F- [: G2 `4 r: \
9 f7 C: G& k* C: s8 e
我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。LED0在进行vTaskDelay时是处于阻塞态,因此我们只需要判断LED0是阻塞状态还是挂起状态,再进行挂起和恢复操作。  u1 N, a- g7 \1 k& Z2 |5 J
8 M6 Z3 o: L3 }" ]
微信图片_20231019160848.png

" y3 ]5 D9 v% V4 A4 ?4 Y; m
微信图片_20231019160843.png

3 \- j7 X5 ~8 @! m7 ^因此我们的代码如下0 K; Z  b* K4 `4 e& W  s' T
  1. void LED_TOG2(void * pvParameters)//参数为 void * pvParameters
    ; c1 g# o, a% O7 L0 v
  2. {8 ~9 p. J3 _! m( G- G& A: a0 a
  3.   while(1)8 K1 H7 D' N/ k
  4.   {, e" q8 d$ t8 I; p+ u1 `
  5.     printf("LED_TOG2 running\r\n");//串口打印运行信息
    & E% k8 x* Q8 a- W
  6.     HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转# p4 {- E. l1 ~; d, C# R( f, ^
  7.     LED2_Number++;//LED0翻转计数
    ' t: }9 S& d# A7 M
  8.     if(LED2_Number %10==0)5 d! U% f  T9 R7 t2 i
  9.     {
    & y" H6 F$ ?8 ~
  10.       if(eTaskGetState(LED_TOG_Handler) == eSuspended)6 ]8 \) p9 J. D! p
  11.       {8 a- u5 J" b9 T
  12.         vTaskResume(LED_TOG_Handler);//LED0任务恢复
    6 f* t( X4 d4 U! g! X
  13.       }, W7 J* p( N; J  p8 P+ |
  14.       ' G+ O3 T% }! `# D( \- n
  15.       if(eTaskGetState(LED_TOG_Handler) == eBlocked )2 V" p' w  w" w$ B! s1 u( F
  16.       {
    3 g' |0 O8 J- N( ?0 v
  17.         vTaskSuspend(LED_TOG_Handler);//LED0任务挂起
    7 X) h! l" s5 Y; U% L! ~
  18.       }1 ^4 w* Z+ X9 @: i% L
  19.       . }7 ^0 T" ^- ^
  20.     }
    % Z/ _& ]/ M0 x7 e( `
  21.     7 @: ?4 ^# w2 t0 J
  22.     vTaskDelay(500);//延迟500ms
    4 u5 @5 s1 i6 R* I
  23.   }7 H4 h4 |  ~, O% r
  24. }
复制代码
/ O9 n& P6 j  A& N2 X8 q, h2 d

- c& h* u: b& l7 W5 J/ Z转载自:电路小白
% j. u/ x$ s1 [& R; g- N如有侵权请联系删除; t2 P4 x% O1 U: W& f
+ \5 b  p0 T7 {

7 r* G' y7 f( k) G* a2 E4 J5 T' l
赞 收藏 评论0 发布时间:2023-10-19 16:09

举报

0个回答

所属标签

相似技术帖

官网相关资源

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