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

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

[复制链接]
STMCU小助手 发布时间:2022-3-26 14:00
01. 概述- B% q7 `" x) q, n4 T
FreeRTOS最基本的功能就是任务管理,而任务挂你最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:9 m7 Y$ W! `& ]2 A9 y

- [% a' [# o) G) _( o  H 2020110909573996.png   A9 B& j& E* }; E

# m8 \. N7 {) v! h02. xTaskCreate()函数; @2 K6 y  o, @. q: \- B) B' F/ ]; V
  1. BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
    " |: Q/ n8 O5 I1 ?
  2.                             const char * const pcName,   
    - e% l3 L6 z% j/ Q- N  {
  3.                             const configSTACK_DEPTH_TYPE usStackDepth,, M2 g: j" [( |* k: z
  4.                             void * const pvParameters,1 N- e$ V# v) f" \0 E8 T$ W
  5.                             UBaseType_t uxPriority,
    5 ?2 ~, J6 C) ^1 [1 i
  6.                             TaskHandle_t * const pxCreatedTask )
    9 Y2 R( w5 _2 x9 Z7 ^# s
  7. 功能:
    & L0 M: L, _7 k" F/ T; g
  8.         创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话那么这些所需的RAM就会自动的从FreeRTOS的堆中分配。
    & P6 g$ T- w# `6 n" d
  9. - B* _6 z4 T4 K, A2 }& p$ w
  10. 参数:4 i, I, w% r3 Q& E1 C+ ~
  11.         pxTaskCode        任务函数2 m: t9 _. ?; v/ U7 H) q
  12.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
    ! Y* M* i+ d  u7 N6 R
  13.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。6 |$ D% J& W2 G0 n
  14.     pvParameters 传递给任务函数的参数8 y% Q& f3 T- ~  b2 H) Y: I
  15.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-15 L' I) ~( y: _: Q. J2 {  e
  16.     pxCreatedTask 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其它API函数可能会使用到这个句柄。    . v  \3 `) T) R8 J
  17. / ^+ }7 ~; ^1 Q3 ^# V- e1 C
  18. 返回值:
    ( L: j1 F! ]* P! v0 `! X; D& k
  19.     pdPASS 成功创建任务
    6 Q$ @( E5 G" @$ Y. I2 w2 x
  20.     errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 任务创建失败 因为堆内存不足     
复制代码

! j& |) G7 s' P3 x0 z& {- f5 q% M应用示例
3 o8 |- E( B7 ?$ u& ]
  1. /* 创建任务. */
    " O) ^$ |; j" L1 c7 B
  2. void vTaskCode( void * pvParameters )
    % I* R. `5 P' ]  y6 o/ t
  3. {
    ; v7 v: G: c, c* t# G
  4.     for( ;; )
    9 M  M& h( J  O: n1 S
  5.     {
    * g  J8 u0 y& H# r- i
  6.        /* 任务代码放在这里 */  W5 a. r" P1 s  ?& N  w3 F: b
  7.     }
    ( O  y# A: l& h
  8. }8 {9 M; f, z6 @( a% G* z4 S/ {

  9. 5 ~! I4 C, c: e& Q
  10. /* 创建任务函数 */! I7 m! h' d) |; E0 L8 _. H
  11. void vOtherFunction( void )
    : o( s2 t* X- F6 G
  12. {
    % Z+ `2 E8 k4 L$ B) v* E
  13.     static unsigned char ucParameterToPass;
    7 D5 z5 O+ G- z" v
  14.     xTaskHandlexHandle;6 t; d0 h5 m+ q( c4 F9 v* _: E$ \8 n
  15. . w+ O1 O4 L. j3 A3 A. |
  16.      /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期,
    ! A5 o2 s) Q6 A( h4 u% P: o
  17.         因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为4 k% c/ b! @- P. R. d' j
  18.                 中断和高优先级任务可能会用到它。 */
    : ?  x3 t* L* O5 N5 `. v
  19.      xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle );0 A1 L, p# a$ l5 M9 b" d9 J
  20. ) N0 F( {- u) g! L
  21.      /* 使用句柄删除任务. */
    ! T0 y& l3 c# z( y/ f
  22.     if( xHandle !=NULL )4 M+ z1 x8 Y) Q* ^7 f4 b
  23.     {+ y/ y/ }/ q0 ^6 l  o
  24.         vTaskDelete( xHandle );
    ) k; D/ G$ F7 ?7 E& U, Z. n
  25.     }0 {8 R/ C/ b9 Q
  26. }
复制代码
0 g0 g: n/ ^+ n: Y) @* }
03. xTaskCreateStatic()函数$ B0 X4 }. Q- n
  1. TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
    . n# w1 b% p( P9 [& {! e
  2.                                     const char * const pcName,% k5 m/ S+ ?2 ?( Z+ E
  3.                                     const uint32_t ulStackDepth,
    8 k7 w1 B, m. _0 u- {& x2 v
  4.                                     void * const pvParameters,
    # F# N! r1 X" y' V
  5.                                     UBaseType_t uxPriority,
    4 l5 Q) S" X- J  K2 d) A
  6.                                     StackType_t * const puxStackBuffer,
    , V2 H7 l4 \( U. Z- z3 V
  7.                                     StaticTask_t * const pxTaskBuffer )
    + C3 }  z7 ]( y$ d& T* I. ?

  8. ) h# B4 g* D( z' |( P8 G, {
  9.     此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用户来提供。如果要使用该函数的话就需要将宏configSUPPORT_STATIC_ALLOCATION定义为1。: B4 w% O3 c& {7 o! z- [  j

  10.   r" j. M, ^: B5 y
  11. 参数:
    / p0 ?3 @8 ~* t3 Y7 v/ i; D
  12.         pxTaskCode        任务函数. b% K* A) E: D5 Q, X+ l
  13.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。  U4 I1 ^2 k: v7 n# t
  14.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。
    ' Y1 X. l& X; y: Q1 |( M" i  g
  15.     pvParameters 传递给任务函数的参数0 V* y! @3 e6 ]7 @8 S9 G
  16.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1
    4 \5 n( I1 w+ `5 o
  17.     puxStackBuffer 任务堆栈 一般为数组,数组类型腰围StackType_t类型。
    - |$ P( M# M1 Y" K3 g  p
  18.     pxTaskBuffer 任务控制块
    4 ~% g5 H+ {& p; X; }

  19. - B4 E8 _# c& p1 L, J1 @

  20. 6 v. ^" V* }$ D" Y
  21. 返回值:
    , Y" F  C/ `! |2 F! ~& x" F
  22.    NULL 任务创建失败,puxStackBuffer或者pxTaskBuffer为NULL的时候会导致这个错误的发生。
    ! _8 k; @7 Q1 e8 A+ V5 `
  23.    其它值 任务创建成功,返回任务的任务句柄
复制代码

% H' `, `' h. z" {5 L- U04. xTaskCreateRestricted()函数
0 w! g  O0 H0 @8 Q# `: A- j$ Q
  1. BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
    ; X, M9 G+ i6 m3 R6 I
  2.                                       TaskHandle_t * pxCreatedTask )1 G) x- |3 y6 V# i3 M2 d- M
  3. 功能:
    ' P) ~: t. C9 B6 E
  4.     创建任务,只不过此函数要求所使用的MCU有MPU内存保护单元,用此函数创建的任务会收到MPU的保护,其它的功能和函数xTAskCreate()一样。7 N2 L) ]7 t, ^* t
  5. 参数:" C* i; i/ c7 _
  6.     pxTaskDefinition 指向一个结构体TaskParameters_t,这个及饿哦固体描述了任务的任务函数,堆栈大小,优先级等。
    7 s& Z) W- o- f5 I( x4 M0 L
  7.     pxCreatedTask 任务句柄- f. d: ~  {6 F9 p: F/ N( ~  a5 ?2 P
  8. 返回值:
    3 H; r, A. |9 L) x( _
  9.     pdPASS 任务创建成功7 Q8 u+ w& M, ~9 T8 t3 D9 M2 [
  10.     其它值 任务为创建成功,很有可能是因为FreeRTOS的堆太小了。
复制代码
- w; }. j6 E* F5 I
05. vTaskDelete()函数
9 \( A, q' a" \  N从RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。
  ^$ Z' d5 u! U* s% G) F" V0 U1 r1 G
注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。
7 L# M# l+ t* l2 T- b7 ?' ?' d  }( E; S
  1. void vTaskDelete( TaskHandle_t xTaskToDelete )' w$ O2 l8 F5 Q, ]6 J
  2. 功能:
    : c! K0 f" V/ t: ]
  3.     删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务。
    ' P" K7 ?  _2 e" x5 S  k  a
  4. 参数:
    % b7 ~/ A! k) H. u, ]& Z1 ^7 N
  5.     xTaskToDelete 要删除的任务的任务句柄
      G  y. e) o& Y) C* q% R
  6. 返回值:+ k3 B, ~/ A( h
  7.     无
复制代码

7 d2 _/ T2 l6 _" J) d; [+ [, {& u( M+ V$ S4 m
# w% S& X: o8 ~! [, [& D5 r) m( O
赞 收藏 评论0 发布时间:2022-3-26 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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