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

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

[复制链接]
STMCU小助手 发布时间:2022-6-18 17:00
01. 概述
# U2 T1 ]: \9 F" xFreeRTOS最基本的功能就是任务管理,而任务挂你最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:
: ]( G* I! i, l0 B: j' x. I7 C( ^, \
2020110909573996.png 0 a$ w0 e  n& S6 u
( b2 @4 o9 K4 Q; m. @3 z
02. xTaskCreate()函数5 s% [; P: B5 Y6 Q' w0 S
  1. BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
    % e$ h6 Y. E) f* I4 I" ~: D; v2 V7 R" B
  2.                             const char * const pcName,    ) F( C2 n6 q- d2 i
  3.                             const configSTACK_DEPTH_TYPE usStackDepth,% g) F) s' B0 _3 }2 E
  4.                             void * const pvParameters,8 W4 g8 s9 E3 s8 o5 I
  5.                             UBaseType_t uxPriority,  K0 B# d; e$ _% p  m" m
  6.                             TaskHandle_t * const pxCreatedTask )1 C( b) y) p! H- f* ?
  7. 功能:
    # b% G/ n6 Q- M6 C& b: v
  8.         创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话那么这些所需的RAM就会自动的从FreeRTOS的堆中分配。9 R; f( G6 z& K: L

  9. + i) f; m: e! i. x
  10. 参数:
    / _2 I# J9 r4 L
  11.         pxTaskCode        任务函数+ {+ e! p, C0 O  K0 ?
  12.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。, L! F- o# R0 M4 z# f2 ?
  13.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。
    7 C: F. S% w* c7 }
  14.     pvParameters 传递给任务函数的参数) E+ Z% T8 I/ W! I7 x) M( d
  15.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1/ H( V) W9 n8 U' b0 A/ d! |
  16.     pxCreatedTask 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其它API函数可能会使用到这个句柄。   
    " T! J* \- B- ^- i" l
  17. 2 @* {( s- W- x7 n+ }3 u
  18. 返回值:
    8 M- `) P3 r6 o6 \* q
  19.     pdPASS 成功创建任务( U5 \9 H5 E9 y
  20.     errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 任务创建失败 因为堆内存不足     
复制代码

) S1 H; P+ Y( m5 ^6 N, U' S& D应用示例
- a  W. o+ C' ^, A0 j
/ ^' W  W! ?: R- }
  1. /* 创建任务. */
    1 q+ \7 d+ l, n1 s. y7 N9 {
  2. void vTaskCode( void * pvParameters )7 M* a  {+ b& i; V3 u
  3. {) J2 }9 q: C. a% G
  4.     for( ;; )
    - y- m9 C% K' x
  5.     {
    0 `/ `3 F; L9 Q+ [# T( C
  6.        /* 任务代码放在这里 */* S* f$ E& d! s4 p4 M
  7.     }
    ( ^9 f9 i" A( u
  8. }$ J) H% L6 U0 |+ R2 x

  9. + O# u# O0 k7 x
  10. /* 创建任务函数 */
    % ~2 h) r2 j5 }8 ^" f2 s
  11. void vOtherFunction( void ), U! |, Q3 C1 m) Y( K
  12. {
    5 ?3 }9 `5 K( U$ y
  13.     static unsigned char ucParameterToPass;% X: r# K! O& k. r% Y' R% p
  14.     xTaskHandlexHandle;, c3 d0 p/ [# J% s

  15. 9 d2 l, E( F) I7 V7 h' d
  16.      /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期,4 L$ |0 _+ S1 t
  17.         因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为2 O6 l; B( \1 j7 a) [9 z0 e! H
  18.                 中断和高优先级任务可能会用到它。 */
    & V* d' T" f4 U
  19.      xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle );
    1 t4 v1 n6 `+ f2 P8 u6 i
  20. 5 i' j" h' J$ ?4 k) v5 Y8 s7 q( }# m% A
  21.      /* 使用句柄删除任务. */
    & R: R1 W% q* C$ o1 c" l
  22.     if( xHandle !=NULL )
    ) P$ K3 c* c* L+ U$ m
  23.     {# j" E' `6 E" U+ N
  24.         vTaskDelete( xHandle );0 T' n6 Z% C" c! o" T4 N8 z
  25.     }
    6 {" Z' T( T8 C' X4 I  F* K
  26. }
复制代码

0 a/ j& c. P- y& z03. xTaskCreateStatic()函数+ ?3 U' _  {  A# Z1 w# o
  1. TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
    " ?. r9 Z: |% n3 d$ J
  2.                                     const char * const pcName,0 A8 w( g( p$ E
  3.                                     const uint32_t ulStackDepth,6 V6 y7 @: S* k8 w& U
  4.                                     void * const pvParameters,& q- |6 m+ i1 n/ O) B
  5.                                     UBaseType_t uxPriority,
    ; D  \; ]1 k2 I
  6.                                     StackType_t * const puxStackBuffer,3 g2 h9 G7 q* M9 ~. \# k
  7.                                     StaticTask_t * const pxTaskBuffer ) , C' x3 A  W% c5 z. W$ t
  8. + R! f! B! w# w- w8 k
  9.     此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用户来提供。如果要使用该函数的话就需要将宏configSUPPORT_STATIC_ALLOCATION定义为1。9 m# s* {# U: x. `  q

  10. * v  _! N. X% l( C6 R/ k8 U  _! B
  11. 参数:" o; |1 }+ L4 `
  12.         pxTaskCode        任务函数1 |4 m: ?. l2 c4 o7 p) d9 r
  13.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
    ) I# A0 @6 @' n& ]; P- r- x
  14.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。# D1 e4 O! P1 M5 w
  15.     pvParameters 传递给任务函数的参数
    : X1 T0 `9 J) L+ n/ I+ [
  16.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1# X1 B! Y' J3 s' Q) h
  17.     puxStackBuffer 任务堆栈 一般为数组,数组类型腰围StackType_t类型。
    + N4 q4 `7 I" U
  18.     pxTaskBuffer 任务控制块
    ! l" d% q4 W* f" P; V

  19. : l. g7 }8 h& D0 u; l

  20. ; T$ t/ H+ O& b7 k2 Y1 v
  21. 返回值:3 P0 ^: P( g2 A6 i- O+ |1 ?9 [
  22.    NULL 任务创建失败,puxStackBuffer或者pxTaskBuffer为NULL的时候会导致这个错误的发生。+ [3 T( W, P( j& X3 n9 [
  23.    其它值 任务创建成功,返回任务的任务句柄
复制代码
8 m; M3 r) M4 A) U' s3 {
04. xTaskCreateRestricted()函数

3 |) ]! g4 }  }1 s* j' ]# o6 o
  1. BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
    / {9 i: G7 n  N! k6 t! ~
  2.                                       TaskHandle_t * pxCreatedTask ); ?# ?, Y5 a, z6 D7 [! A& B
  3. 功能:
    % Q: q& `3 b; Z) m# P2 j: l
  4.     创建任务,只不过此函数要求所使用的MCU有MPU内存保护单元,用此函数创建的任务会收到MPU的保护,其它的功能和函数xTAskCreate()一样。( m1 f5 u0 O, R9 H* L3 P% y, J
  5. 参数:$ e" j0 a6 A# q% ]
  6.     pxTaskDefinition 指向一个结构体TaskParameters_t,这个及饿哦固体描述了任务的任务函数,堆栈大小,优先级等。3 U, f1 B+ \" V
  7.     pxCreatedTask 任务句柄1 P6 z7 m% f" W) l9 V
  8. 返回值:& D' S3 z# E- M* m. Y! P
  9.     pdPASS 任务创建成功
    - [/ C! [$ G* {2 B7 s$ X: n
  10.     其它值 任务为创建成功,很有可能是因为FreeRTOS的堆太小了。) p' A1 {7 L2 m: T/ ~" w
复制代码

: {' L' V1 Y* t" c( r05. vTaskDelete()函数
* h6 _8 b* Q- Z" P* [从RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。8 m0 s  J3 M! |2 {. _

( K3 l2 Q( t; r( R2 o注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。& q3 r$ \/ V* Y3 E& }( [% H+ I" {
2 ]3 f7 z2 K4 O5 r
  1. void vTaskDelete( TaskHandle_t xTaskToDelete )4 P, g6 {  d1 X9 |
  2. 功能:
    . \3 }# F  b+ z/ U
  3.     删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务。  T" v* f- k+ |* J/ _$ c& V
  4. 参数:
    4 j4 b5 ?% }! M$ g; G% R' q  ]
  5.     xTaskToDelete 要删除的任务的任务句柄  l7 b6 u3 j2 _+ H' {5 W
  6. 返回值:% C5 z. u" W2 y& U! @
  7.     无
复制代码
6 ]3 d+ D; P$ b1 K& A  B' ~

- ~" I1 r% C0 U) i) e9 c  \
+ A3 A* z- ?1 b8 A1 g
收藏 评论0 发布时间:2022-6-18 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

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