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

【经验分享】STM32 FreeRTOS任务相关API

[复制链接]
STMCU小助手 发布时间:2022-6-18 17:00
01. 概述
8 ?8 h7 f  K) p1 `' n9 XFreeRTOS最基本的功能就是任务管理,而任务挂你最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:
8 U. |2 Y6 M; _, P+ e6 m0 ?
2 L; b* f4 g) u( V9 K3 Q 2020110909573996.png * c( E9 X: P* A' c
$ |9 X" E7 ~; G0 a3 X- e
02. xTaskCreate()函数
. X0 L* X* @+ B8 Q- G. U/ B
  1. BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
    . y/ ?; G; {" E- A, f
  2.                             const char * const pcName,    / {  P: F* Z  n7 J
  3.                             const configSTACK_DEPTH_TYPE usStackDepth,0 |+ Q* K& l$ J& A( [4 J
  4.                             void * const pvParameters,
    $ `+ \2 i$ k- I# \: D. t- J; o
  5.                             UBaseType_t uxPriority,3 g0 U/ T, B* Y) g. Z& g* K
  6.                             TaskHandle_t * const pxCreatedTask )+ i$ b( n  E/ a% \, M! I3 m1 F
  7. 功能:9 a. R4 T4 M& U* \: b) P& W
  8.         创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话那么这些所需的RAM就会自动的从FreeRTOS的堆中分配。1 P8 O1 r% T! a+ L
  9. - o' H9 m8 `& A( z2 ^
  10. 参数:
    0 K" P6 C  z; J7 d' g  q8 O
  11.         pxTaskCode        任务函数( n) ]6 C  f  ]1 B% d
  12.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。' a6 e/ m0 L. k7 o
  13.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。
    * X$ a& |" y: k4 h
  14.     pvParameters 传递给任务函数的参数
    # B" R9 U. o1 X% }
  15.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1; P9 u) M8 ^9 W! V! H8 w
  16.     pxCreatedTask 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其它API函数可能会使用到这个句柄。    " L/ W8 Q; V) a3 x

  17. ) n- R7 j, P; E  `- `! {
  18. 返回值:+ s2 l! N3 Y% I6 d; D. Z9 g
  19.     pdPASS 成功创建任务1 L+ o0 g4 A% U* `* c
  20.     errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 任务创建失败 因为堆内存不足     
复制代码

6 w7 w. ^( s" ?' u/ f# z应用示例% @: _- q. v( i
2 l( {( b# D# L) `1 ^0 ~% {( ?
  1. /* 创建任务. */1 C: y0 k- ?' y& ?8 h) T& U: I) n
  2. void vTaskCode( void * pvParameters )
    3 l6 r, Y" N+ c; O. x6 x# A
  3. {" v5 j, k( O9 B1 \
  4.     for( ;; )
    1 Z; v' g" [" \3 K. w
  5.     {
    % T0 l9 r. U3 v: @8 ?
  6.        /* 任务代码放在这里 */! r3 u' Y) S3 K' F, p6 r6 a
  7.     }
    7 r! p6 \& p( n) Y. [9 s, K
  8. }
    + b( E8 G1 r: ^

  9. , S1 d$ R. r  N, J, u
  10. /* 创建任务函数 */
    - T5 C. S. q( O! u
  11. void vOtherFunction( void )6 n! T/ i: q. M
  12. {
    8 r& s) g# E, t
  13.     static unsigned char ucParameterToPass;
    % ^. N5 W8 q* h4 |7 _4 a
  14.     xTaskHandlexHandle;$ a! L( c0 _8 C% @; [; ]5 j- N
  15. 7 Q% w# k. L" b2 V5 X, y0 V& r3 L' l
  16.      /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期,
    5 y: G+ v) ]2 m5 p
  17.         因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为
      s4 u# L! K0 O) w  F
  18.                 中断和高优先级任务可能会用到它。 */
    + R* R/ v, k: f7 G; t
  19.      xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle );5 t3 x4 ^; ^- t# u8 R6 k/ m

  20. # X1 C0 n6 G9 j& s3 I# @
  21.      /* 使用句柄删除任务. */. m! r: l& T2 ^- y; U
  22.     if( xHandle !=NULL )
    8 v# y' A% }4 Q& B. c
  23.     {
    0 o" i3 P! o1 d  j; }8 i
  24.         vTaskDelete( xHandle );; g; j! o8 c0 g3 {
  25.     }
    ; r4 m8 f8 Q7 `) P  `, J3 S: N
  26. }
复制代码

. q- O; k* P6 b03. xTaskCreateStatic()函数& L4 s4 x, i" K* d/ e% N
  1. TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
    ; X6 c1 {  s( p$ c, ]/ E- b5 K' j
  2.                                     const char * const pcName,* d8 G, T' r+ J) ~
  3.                                     const uint32_t ulStackDepth,
    7 m0 w! y& }$ Q3 m9 q* [
  4.                                     void * const pvParameters,
    , ]: I4 B$ B; V3 b/ L
  5.                                     UBaseType_t uxPriority,& T" y7 [- n$ J; Z3 I2 K  X( z. U0 ~7 v
  6.                                     StackType_t * const puxStackBuffer,
      a, l0 g4 m, Q
  7.                                     StaticTask_t * const pxTaskBuffer ) 8 W2 y) A, P, I! l& M- `" [. ]

  8. 2 x; v9 |& t& P/ g& o
  9.     此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用户来提供。如果要使用该函数的话就需要将宏configSUPPORT_STATIC_ALLOCATION定义为1。
    & x" p( y0 `6 e5 c7 B7 j. L

  10. ( n( b7 _1 I7 d0 y6 {
  11. 参数:5 d" m1 r5 l6 p3 s# `
  12.         pxTaskCode        任务函数+ G" Z2 E. w0 O' U
  13.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
    , X" s4 S- u( |& L6 {+ S
  14.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。# o6 k1 U- `# C7 |+ B
  15.     pvParameters 传递给任务函数的参数
    - T0 F7 y, j6 B5 c  N
  16.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1( L( f5 o( F- f! y3 G' H% ?
  17.     puxStackBuffer 任务堆栈 一般为数组,数组类型腰围StackType_t类型。! c0 i- ^; Z" C- m! t  ?
  18.     pxTaskBuffer 任务控制块( _3 Y" E% I1 i
  19. & U! h+ \  x( L7 P) o( ?

  20. / `# Y) D4 ~3 S# r
  21. 返回值:7 p) ?% J" Y$ E, J+ Y' Z) t
  22.    NULL 任务创建失败,puxStackBuffer或者pxTaskBuffer为NULL的时候会导致这个错误的发生。
    , Y3 g  Y$ p5 ?; C" p
  23.    其它值 任务创建成功,返回任务的任务句柄
复制代码

# t6 z9 E  {- x0 ^04. xTaskCreateRestricted()函数

) [0 b* {. Y$ }" ^4 L8 Q
  1. BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
    9 G  Z8 n  p; S* E& }
  2.                                       TaskHandle_t * pxCreatedTask )# }# _9 m) L$ T  z
  3. 功能:
    / I0 i! {6 k7 M% z: Q. i2 o6 u0 B
  4.     创建任务,只不过此函数要求所使用的MCU有MPU内存保护单元,用此函数创建的任务会收到MPU的保护,其它的功能和函数xTAskCreate()一样。, |$ }, f! }0 z, i% Y5 D3 |6 b, C
  5. 参数:
    ' m* Z7 }% R. \' G
  6.     pxTaskDefinition 指向一个结构体TaskParameters_t,这个及饿哦固体描述了任务的任务函数,堆栈大小,优先级等。
    ! v/ _3 t/ C  T3 p# m- l2 D& t6 u: i
  7.     pxCreatedTask 任务句柄
    6 w6 z) b  U! H4 h  T9 p
  8. 返回值:. O3 O- V! P$ @) L! b/ m, }
  9.     pdPASS 任务创建成功
    ; U7 [6 L' |( d7 Q( T$ K
  10.     其它值 任务为创建成功,很有可能是因为FreeRTOS的堆太小了。1 }6 @, X3 ?; f: U
复制代码
1 E: I% ^6 O; a
05. vTaskDelete()函数$ I$ U' h0 a9 O' n2 ]+ c' E* O( U
从RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。! l3 G! K* w" P+ [5 m
4 y% Y: J& v5 x5 F
注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。
7 l9 Q" ?  Z2 p7 S" ]
% g  t0 D9 z4 H
  1. void vTaskDelete( TaskHandle_t xTaskToDelete )) ?4 n6 N7 P& {6 X2 A' L
  2. 功能:
    * o+ [/ m5 i6 B/ V' N6 ^) S
  3.     删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务。6 r4 c" b% X' T2 s6 Z5 S
  4. 参数:, Y- C4 q2 E* i' `
  5.     xTaskToDelete 要删除的任务的任务句柄
    " F- j  r6 z, e+ A% [4 `
  6. 返回值:5 y* P& R4 F( _( a( P
  7.     无
复制代码
- r* k- ^- E! i
" e# _0 m7 B7 `

1 ~# U* K: S% Z& a
赞 收藏 评论0 发布时间:2022-6-18 17:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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