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

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

[复制链接]
STMCU小助手 发布时间:2022-6-18 17:00
01. 概述# T/ u( D. c0 l" F4 }4 Y( [+ M! X
FreeRTOS最基本的功能就是任务管理,而任务挂你最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:
# @- s3 N/ f& R, e+ R. z7 x1 V0 g: S" f& u" z' b& `/ |9 w3 r5 R
2020110909573996.png
; H9 x+ \; h; P6 k7 w6 ]
3 \  h7 T6 Q5 c3 a. `  y3 P/ ]: U02. xTaskCreate()函数
; x/ o& \8 c6 |5 M
  1. BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,1 X0 j) ]- Y6 t% N
  2.                             const char * const pcName,   
    / ]6 x, B+ Y7 O  k  W
  3.                             const configSTACK_DEPTH_TYPE usStackDepth,) b& Z; j9 D9 W9 V) s; z
  4.                             void * const pvParameters,) K: B& @1 n4 a
  5.                             UBaseType_t uxPriority,
    : t. k4 L" H- a# K; H1 n% k
  6.                             TaskHandle_t * const pxCreatedTask )
    # {$ \- H# u8 H; G, Y
  7. 功能:5 k) e* }- N: x$ G( s# \1 ^9 ]
  8.         创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话那么这些所需的RAM就会自动的从FreeRTOS的堆中分配。  ~/ q! Q6 x9 j( \" f9 l

  9. 3 K6 {5 n. x  Z  b6 J% }/ |
  10. 参数:
    3 j3 e4 W# F2 n% L. z" A: O3 s
  11.         pxTaskCode        任务函数
    : u. q+ m. i: n1 c
  12.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
    7 p( j) J- z* ]5 }0 K0 S
  13.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。
    0 i* R$ D: t  a5 j: n& z
  14.     pvParameters 传递给任务函数的参数
    ( a" ~6 S% s8 d$ h- G
  15.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1  t/ \) ^8 b! @7 l3 B0 t" Y& W
  16.     pxCreatedTask 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其它API函数可能会使用到这个句柄。    & [  M  ^2 @  o! G4 o
  17. 9 B" u2 H" x2 z9 h
  18. 返回值:
    8 J& C# t/ ^& v& H
  19.     pdPASS 成功创建任务1 o( b0 f- u; X6 q( o( U
  20.     errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 任务创建失败 因为堆内存不足     
复制代码
! ^  J4 r" Z8 F3 O$ j8 Y
应用示例
* j' c/ A4 l0 s% {5 z$ o, m. C5 J: u4 v9 m8 c$ \( B
  1. /* 创建任务. */1 ?! }6 t. b" l0 A7 h5 c$ N
  2. void vTaskCode( void * pvParameters )
    2 o+ C" a% e0 B5 ^
  3. {
    ' A3 W; U8 E$ x* V
  4.     for( ;; )( b% w' j$ C4 H+ Y- A  D
  5.     {
    $ u% C$ b  X( }
  6.        /* 任务代码放在这里 */* ], c% L7 I3 S
  7.     }" w! \+ o) {( P
  8. }
    , A1 Y# p) s8 s

  9. 9 X+ t& O" y+ \
  10. /* 创建任务函数 */
    6 @1 }7 h; Y2 ~+ ^$ ~4 l
  11. void vOtherFunction( void )" q' P/ N" a. r# L& K0 R
  12. {1 b$ _& X* G# Z9 ]/ E( I$ k0 U
  13.     static unsigned char ucParameterToPass;
    / P. i% v9 m, c: Q: O0 i+ H
  14.     xTaskHandlexHandle;
    7 y/ L7 D) v) P

  15. * ?7 l% s" I* N% n4 y
  16.      /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期,
    9 r. R$ |- U  J, o+ }2 Z
  17.         因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为
    9 ~2 D# A# w5 U+ F+ B
  18.                 中断和高优先级任务可能会用到它。 */9 i% K4 ]# x. h8 }9 g6 W1 n
  19.      xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle );! ?* M, e% ]! R  X, S" ?3 {6 G  |+ Q
  20. , e1 y9 ]; y8 b% ~
  21.      /* 使用句柄删除任务. */
    ' ]& C8 Q/ z5 g' ^3 s0 `7 a/ @5 H
  22.     if( xHandle !=NULL ). T1 X& o  Q' T( |! ~0 S$ h
  23.     {
    . @0 G) s$ O7 C  p
  24.         vTaskDelete( xHandle );# H' F; w& `/ A1 Z: i7 `
  25.     }* c7 p8 \9 d( C5 S, _# w
  26. }
复制代码

( l# L3 E4 E- O8 T03. xTaskCreateStatic()函数
! b4 M. ?: E) q4 Q6 l! X* c
  1. TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,: q  m9 d7 ^- {4 ?' o
  2.                                     const char * const pcName,1 i: f  p( F& E1 P" ]% K
  3.                                     const uint32_t ulStackDepth,5 X1 b* ~* U* n- M
  4.                                     void * const pvParameters,% R. {* X1 k. ^( t/ d4 L
  5.                                     UBaseType_t uxPriority,. N+ v. [. n0 y* [
  6.                                     StackType_t * const puxStackBuffer,
      w! \6 A. |% C! A0 K
  7.                                     StaticTask_t * const pxTaskBuffer )
    7 j8 C# D; y8 T8 d" c+ T8 Q
  8. ; r1 H9 ?6 A3 ~3 N0 q
  9.     此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用户来提供。如果要使用该函数的话就需要将宏configSUPPORT_STATIC_ALLOCATION定义为1。' t6 P! d& j/ q) B' ~7 \1 s% i
  10. , N; u7 B* E5 Z- t' D$ j
  11. 参数:
    . s: T9 p1 `% m/ P& o+ |1 w4 ^
  12.         pxTaskCode        任务函数
    ! i6 t( l5 o! [8 A& Z
  13.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
    ; J- Z& X1 H  H# c
  14.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。
    9 n+ ]6 r4 N" y* P/ k* ~2 X
  15.     pvParameters 传递给任务函数的参数
    1 j6 `6 c# r* w8 G/ a$ Q# }( Z, {
  16.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1, U: s( X5 {8 z/ W
  17.     puxStackBuffer 任务堆栈 一般为数组,数组类型腰围StackType_t类型。  l$ |9 T7 |& b7 \1 a7 _
  18.     pxTaskBuffer 任务控制块
    + U1 w" y2 r) c4 t
  19. ( W- _+ a3 a3 ?6 W0 F* H

  20. % v, y: u3 K1 d+ L, \" G
  21. 返回值:
    7 J1 X8 l6 V; k, e
  22.    NULL 任务创建失败,puxStackBuffer或者pxTaskBuffer为NULL的时候会导致这个错误的发生。
    , r7 x5 E7 t! V  l5 x
  23.    其它值 任务创建成功,返回任务的任务句柄
复制代码
$ Y) j+ `6 r  `- A5 V6 V5 f. a
04. xTaskCreateRestricted()函数
* V: A( F7 h  E7 {3 i
  1. BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,# W& a- z* |% q3 Y- V) V* ?
  2.                                       TaskHandle_t * pxCreatedTask )
    7 F- Q% z( k% {/ u$ m
  3. 功能:, ]5 M5 ?+ A! x, c
  4.     创建任务,只不过此函数要求所使用的MCU有MPU内存保护单元,用此函数创建的任务会收到MPU的保护,其它的功能和函数xTAskCreate()一样。
    9 P& ^4 x+ `* U$ K$ c
  5. 参数:
    - a% J( T1 @7 d
  6.     pxTaskDefinition 指向一个结构体TaskParameters_t,这个及饿哦固体描述了任务的任务函数,堆栈大小,优先级等。' C3 f/ {9 a# F( z
  7.     pxCreatedTask 任务句柄! `3 E3 n$ B1 C6 `' i  g/ |
  8. 返回值:. |5 W7 [- g# N* X/ b# R
  9.     pdPASS 任务创建成功8 C( p! D$ L- d3 b$ d
  10.     其它值 任务为创建成功,很有可能是因为FreeRTOS的堆太小了。9 _& a0 }% T3 S+ I
复制代码
" T+ R& M: o+ v  s5 F) e/ m9 l
05. vTaskDelete()函数0 i+ A  k9 I8 i/ e  R+ P2 h+ @+ Y
从RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。
3 ^7 d+ J" I, C4 U6 T: ]) d; c2 D, O- `# \
注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。$ X: A# _) s8 _4 \

& [$ ]% D1 \5 O7 \$ q7 Y
  1. void vTaskDelete( TaskHandle_t xTaskToDelete )8 b3 c$ c' D  l4 M2 l, v
  2. 功能:
    $ N$ t  H4 O7 z
  3.     删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务。
    ( i% [; W7 ~* r& T# Z& `+ X+ `
  4. 参数:: T) P: j: x. Z0 M9 J$ l% p# y1 q
  5.     xTaskToDelete 要删除的任务的任务句柄
      A9 L0 {% B* a6 |. L7 Y
  6. 返回值:: M! y2 U7 v* t5 X5 F; A% E8 P
  7.     无
复制代码

# n$ i$ x7 b$ x9 G4 d7 j+ j, D# ?' l/ D$ b

6 r. V* o' _; J* O
收藏 评论0 发布时间:2022-6-18 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版