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

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

[复制链接]
STMCU小助手 发布时间:2022-6-18 17:00
01. 概述
$ k9 N5 y" h" i8 CFreeRTOS最基本的功能就是任务管理,而任务挂你最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:; F5 X& I9 `! f

5 m& c2 Z" c. [' y0 V$ U& ? 2020110909573996.png
; t8 p5 Z( @- b+ W  [# A( J$ o8 m6 I% p2 A0 t( `3 ^, X5 J
02. xTaskCreate()函数, s+ a- \5 s6 l5 N- F
  1. BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,+ ~! E9 s9 k5 e' x8 t; f
  2.                             const char * const pcName,    # z' m4 b+ Z3 _1 w0 C% R7 h
  3.                             const configSTACK_DEPTH_TYPE usStackDepth,/ o9 _8 Z) ^. j5 S4 U$ o" ^8 Q- {" N
  4.                             void * const pvParameters,. i; H8 a' N* H# i6 O
  5.                             UBaseType_t uxPriority,
    . m' D# G7 s5 \5 |( F
  6.                             TaskHandle_t * const pxCreatedTask )% H0 \7 U/ ?$ n5 u4 t
  7. 功能:* {! O6 j$ N3 z. Q6 ^! S% c
  8.         创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话那么这些所需的RAM就会自动的从FreeRTOS的堆中分配。
    8 O" I8 V* s* L0 j7 X8 O+ P
  9. / h5 z; S0 a5 o8 o* D: B
  10. 参数:, M* E$ {* P6 ^9 Q
  11.         pxTaskCode        任务函数% B* B: r3 H. }2 w
  12.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
    ( @+ w4 K- w8 L9 V4 a
  13.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。
    $ T& h2 K0 k- |, K! p
  14.     pvParameters 传递给任务函数的参数
    / f* _# S2 e4 d% G/ g$ y+ Z- h
  15.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1
    6 y. j1 O9 {; [1 H
  16.     pxCreatedTask 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其它API函数可能会使用到这个句柄。    # Z3 `" m& q& N4 ~+ m! `* F' B, ~

  17. + h; t: n( j# d6 m. q0 i
  18. 返回值:
    4 l0 g5 w( m9 Q# S: n0 t2 E' E
  19.     pdPASS 成功创建任务% z4 {2 I: c; n( E* P7 K* p
  20.     errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 任务创建失败 因为堆内存不足     
复制代码

$ W* x$ k4 X9 K  a  I& g1 P1 S: p应用示例
0 r/ q  |$ Z! S  Z; c8 G& o5 w  F8 @: f9 `
  1. /* 创建任务. */
    7 d- e6 h) Z% j" l5 V1 `
  2. void vTaskCode( void * pvParameters )
    / u# x6 X3 |( }; u; |; g' r* E4 i
  3. {/ }7 |  z$ z9 n( X3 m
  4.     for( ;; )
    . r; y9 G; B: G
  5.     {
    2 f, j" u/ L, I, Z
  6.        /* 任务代码放在这里 */
    ' ^/ n3 z  M4 W. @7 j: H" o
  7.     }& s6 O  W( J4 ]$ M# a( L
  8. }
    4 I% x8 `- T2 w
  9. ) T7 e3 s; u+ \' @$ Q5 f
  10. /* 创建任务函数 */
    + p- a" P+ }/ _3 ~& G/ h7 \; \! C( Q
  11. void vOtherFunction( void )9 T- x6 V$ N! z
  12. {
    8 f* [/ Q: }) q6 \3 l& t3 G$ |
  13.     static unsigned char ucParameterToPass;
    8 F. e; f6 K6 _& s
  14.     xTaskHandlexHandle;% J+ e  X8 @9 m) f, a

  15. # Q/ ]8 m$ }/ Q( k
  16.      /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期,; n: q! {2 s- Y. M! g! x; V
  17.         因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为
    0 I" v+ a3 K/ ^* U# L) ?
  18.                 中断和高优先级任务可能会用到它。 */
    : `9 Y4 W0 u: ^" m" T* M
  19.      xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle );; X# e: c+ V. C8 a

  20. + d4 V& a. r9 w8 P) ~9 I
  21.      /* 使用句柄删除任务. */! f4 x; ~' ^" S
  22.     if( xHandle !=NULL )3 ~' F3 e5 |  N2 ^: Z5 w/ j
  23.     {
    5 T# l$ F9 u8 [6 V
  24.         vTaskDelete( xHandle );3 N  e; D5 r! j
  25.     }
    - n; {* I3 O1 z+ E/ h
  26. }
复制代码
+ O; }, A5 L, E6 A& T$ \
03. xTaskCreateStatic()函数7 @7 F; h* z5 T
  1. TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,; y2 n+ u4 d4 g) U9 x
  2.                                     const char * const pcName,3 ^# v) v' R/ l
  3.                                     const uint32_t ulStackDepth,
    6 M) u8 B" i1 G; Z
  4.                                     void * const pvParameters,
    + U! u! M, k: V% N
  5.                                     UBaseType_t uxPriority,4 B. ~. _3 n. C  u; F
  6.                                     StackType_t * const puxStackBuffer,9 m, u1 u! q+ P* }* @. x8 Q
  7.                                     StaticTask_t * const pxTaskBuffer )
    $ r2 ^2 J: D$ ]6 Y: r4 B9 f, i
  8. 1 x( G8 Z! X+ v, b( S
  9.     此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用户来提供。如果要使用该函数的话就需要将宏configSUPPORT_STATIC_ALLOCATION定义为1。
    / W. x7 H" F/ e5 I
  10. 5 T; |4 O. M0 t/ @, T
  11. 参数:7 g+ F: C' b% ]. g' E
  12.         pxTaskCode        任务函数
    $ e' j. q0 H$ I6 j
  13.     pcName        任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
    % o6 }+ }6 L3 |! R" k# g" D
  14.     usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。( _: @& p' U$ i$ d) t  u& `
  15.     pvParameters 传递给任务函数的参数
    2 I* A$ u  [9 Z* s2 l# ?* O+ b
  16.     uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1
    3 M7 ^/ P0 e  V  |$ A
  17.     puxStackBuffer 任务堆栈 一般为数组,数组类型腰围StackType_t类型。# e# u6 r" E& r% Y1 m
  18.     pxTaskBuffer 任务控制块
    8 S% `5 y$ Z) H/ m

  19. * L' r" [9 M, G0 m
  20. ! N0 F8 a, f$ K  ]. C; b
  21. 返回值:8 [4 Q3 n  J/ ?7 ~# Z2 d
  22.    NULL 任务创建失败,puxStackBuffer或者pxTaskBuffer为NULL的时候会导致这个错误的发生。% E) W$ b: J  w7 F6 j
  23.    其它值 任务创建成功,返回任务的任务句柄
复制代码
& w6 [1 U" k( {9 b3 I' G
04. xTaskCreateRestricted()函数
& [* ^4 W: _) F! E4 j$ O" ~* ~6 b) \5 a
  1. BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
    0 A$ I$ |, g; h! f
  2.                                       TaskHandle_t * pxCreatedTask )2 g$ a8 i9 l' a# o& U: l9 J
  3. 功能:
    4 v3 q+ F5 o2 E
  4.     创建任务,只不过此函数要求所使用的MCU有MPU内存保护单元,用此函数创建的任务会收到MPU的保护,其它的功能和函数xTAskCreate()一样。' @$ E5 |, W; Q: F6 Q
  5. 参数:
    1 K( r9 X7 e0 z; }
  6.     pxTaskDefinition 指向一个结构体TaskParameters_t,这个及饿哦固体描述了任务的任务函数,堆栈大小,优先级等。
    : @8 L- y- i+ A9 d  P; A  z# {% E
  7.     pxCreatedTask 任务句柄- C7 r1 W5 i( ^) w) h
  8. 返回值:
    - |8 D' @, _0 Q, \' S, p- R
  9.     pdPASS 任务创建成功5 B0 W( `$ X0 B! }* [5 T9 d
  10.     其它值 任务为创建成功,很有可能是因为FreeRTOS的堆太小了。/ Q: D8 y( l9 D+ d
复制代码
# ]; @+ @, ~4 S! E  q' E
05. vTaskDelete()函数
# g3 n8 L/ t5 \% l/ S# P  M. l从RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。* N- m( E) {- r# E2 H
; O. A( I0 Z' V# s* a3 t4 u
注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。6 Y) T- p8 r( f1 f. R# H

6 h  K( j* k2 b
  1. void vTaskDelete( TaskHandle_t xTaskToDelete )% M) `3 O% d4 i' g: q
  2. 功能:8 O3 K) z9 F& `& f
  3.     删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务。
    & L! n1 \" p$ M  s9 u
  4. 参数:$ |) }0 d8 Z8 T( y" P$ {4 D
  5.     xTaskToDelete 要删除的任务的任务句柄
    3 J3 I# ?5 b2 \& c; i% @& U$ S$ F0 A
  6. 返回值:
    9 V  V$ y7 y# M$ V: n' n
  7.     无
复制代码
8 T, ^9 W. _) E5 s; I% M4 k% H

% ^+ B& @# n6 k8 ?) K" d% w2 w2 n5 _9 K6 j& U! B" E6 v
收藏 评论0 发布时间:2022-6-18 17:00

举报

0个回答

所属标签

相似分享

官网相关资源

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