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

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

[复制链接]
攻城狮Melo 发布时间:2023-10-19 16:09
上一期学习了任务的创建和删除,这一期学习任务的挂起与恢复。
8 k% W- Y& E$ X( v3 y
所谓的挂起,也可以认为是暂停,将运行中的任务挂起后,任务将暂停运行,直至系统恢复任务的运行。
2 ?' T$ u7 q9 Y0 o8 T' e5 U1 J
微信图片_20231019160904.png

( C; Q4 j* z5 [& ~# y3 r% l在FreeRTOS的API文档中找到任务挂起函数的介绍,函数需要的参数为我们想要挂起的任务句柄,如果传递为NULL则暂停我们的调用任务。同样的,在文档中也可以找到恢复任务函数介绍。, u! h' m4 c2 y# [1 @- p
3 d, l* Q1 t% O( E4 F* |

. s; c# y' W/ H' ^, G2 g$ e
微信图片_20231019160900.png

0 k$ C* u  s& U) a- m
微信图片_20231019160855.png
4 E) A3 _& X2 P3 h% k& J

$ T3 Y- m1 s8 Z) U! D/ H

$ L  P3 x" @  m  S( k' {1 ]7 }( e7 a7 H接下来我们实现一个任务,目标是当LED1闪烁5次后挂起LED0闪烁的任务,当LED1再闪烁5次后恢复LED0闪烁的任务。
' j8 G+ r# M! P$ j, c
: M; q* n: |/ }, B) t
我们在API中找到查询任务状态的函数eTaskGetState,该函数传入参数为任务句柄,返回参数为任务状态。LED0在进行vTaskDelay时是处于阻塞态,因此我们只需要判断LED0是阻塞状态还是挂起状态,再进行挂起和恢复操作。7 E  u$ L8 |8 O+ F4 L- p  z) g5 D( ~
9 r* W  q# j- J$ y, e$ R  S
微信图片_20231019160848.png
  j! D) s* b+ K* C; B
微信图片_20231019160843.png

& v8 J" G  B$ A8 R7 q) t2 U因此我们的代码如下! N& e7 C5 x7 x; C1 L1 X; }
  1. void LED_TOG2(void * pvParameters)//参数为 void * pvParameters3 y3 W1 A' W5 `% T) q2 E
  2. {
    / p. a# U# N8 G4 X
  3.   while(1)
    - v) h8 Y$ _. H: r1 q
  4.   {, q% }) f) V% [" a; O6 t
  5.     printf("LED_TOG2 running\r\n");//串口打印运行信息
    " Z9 u. ?/ q7 e7 [% i* E4 r' Y
  6.     HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED0翻转
    & p: r, r0 H9 l
  7.     LED2_Number++;//LED0翻转计数
    + I: ]+ t$ [/ m4 |9 P8 ~
  8.     if(LED2_Number %10==0)& v( o( ?- }. k3 n& J! A
  9.     {5 V6 s) n# \1 m" J
  10.       if(eTaskGetState(LED_TOG_Handler) == eSuspended). y- Q; m8 ~) M; J$ Z! q
  11.       {
    ( Q9 h( u+ K: Y, K: }1 M/ T
  12.         vTaskResume(LED_TOG_Handler);//LED0任务恢复  s8 F( z& H; M9 ]' v
  13.       }+ K$ T7 I' D/ s8 V1 p' x
  14.       6 \# m0 Y) D. @: ^* y0 o
  15.       if(eTaskGetState(LED_TOG_Handler) == eBlocked )
    5 N1 g9 @6 Y% Y, ]" U4 y, F
  16.       {
    , Z/ J  k1 j2 i/ z
  17.         vTaskSuspend(LED_TOG_Handler);//LED0任务挂起7 t/ G$ i, R/ [9 q3 c
  18.       }
    5 {4 ]# c1 f$ F2 Z. n% l( l- r# |
  19.       
    ! v- \5 ^; a- W5 C# P) [
  20.     }
    ; o/ R5 U/ }+ {" b' h+ k
  21.    
    % r$ I* ?5 @9 a9 ?& L, K  z
  22.     vTaskDelay(500);//延迟500ms
    , E- G' L0 z) _" w. j8 Q
  23.   }$ `- G$ C' u1 T% R
  24. }
复制代码
9 W9 R+ `* f$ e/ \0 d
  C+ q, `, M' F/ g! N+ ?" l
转载自:电路小白
8 K8 q3 l  e7 Q! K如有侵权请联系删除4 V9 G  p- }. ~7 s( E: \4 z
! }( N4 A' V' u1 j6 a2 N( j& o) I

0 p. z% Z! d: Q, f) B7 q
收藏 评论0 发布时间:2023-10-19 16:09

举报

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