01. 概述
$ k9 N5 y" h" i8 CFreeRTOS最基本的功能就是任务管理,而任务挂你最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:; F5 X& I9 `! f
5 m& c2 Z" c. [' y0 V$ U& ?
; 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
- BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,+ ~! E9 s9 k5 e' x8 t; f
- const char * const pcName, # z' m4 b+ Z3 _1 w0 C% R7 h
- const configSTACK_DEPTH_TYPE usStackDepth,/ o9 _8 Z) ^. j5 S4 U$ o" ^8 Q- {" N
- void * const pvParameters,. i; H8 a' N* H# i6 O
- UBaseType_t uxPriority,
. m' D# G7 s5 \5 |( F - TaskHandle_t * const pxCreatedTask )% H0 \7 U/ ?$ n5 u4 t
- 功能:* {! O6 j$ N3 z. Q6 ^! S% c
- 创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话那么这些所需的RAM就会自动的从FreeRTOS的堆中分配。
8 O" I8 V* s* L0 j7 X8 O+ P - / h5 z; S0 a5 o8 o* D: B
- 参数:, M* E$ {* P6 ^9 Q
- pxTaskCode 任务函数% B* B: r3 H. }2 w
- pcName 任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
( @+ w4 K- w8 L9 V4 a - usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。
$ T& h2 K0 k- |, K! p - pvParameters 传递给任务函数的参数
/ f* _# S2 e4 d% G/ g$ y+ Z- h - uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1
6 y. j1 O9 {; [1 H - pxCreatedTask 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其它API函数可能会使用到这个句柄。 # Z3 `" m& q& N4 ~+ m! `* F' B, ~
+ h; t: n( j# d6 m. q0 i- 返回值:
4 l0 g5 w( m9 Q# S: n0 t2 E' E - pdPASS 成功创建任务% z4 {2 I: c; n( E* P7 K* p
- 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 `
- /* 创建任务. */
7 d- e6 h) Z% j" l5 V1 ` - void vTaskCode( void * pvParameters )
/ u# x6 X3 |( }; u; |; g' r* E4 i - {/ }7 | z$ z9 n( X3 m
- for( ;; )
. r; y9 G; B: G - {
2 f, j" u/ L, I, Z - /* 任务代码放在这里 */
' ^/ n3 z M4 W. @7 j: H" o - }& s6 O W( J4 ]$ M# a( L
- }
4 I% x8 `- T2 w - ) T7 e3 s; u+ \' @$ Q5 f
- /* 创建任务函数 */
+ p- a" P+ }/ _3 ~& G/ h7 \; \! C( Q - void vOtherFunction( void )9 T- x6 V$ N! z
- {
8 f* [/ Q: }) q6 \3 l& t3 G$ | - static unsigned char ucParameterToPass;
8 F. e; f6 K6 _& s - xTaskHandlexHandle;% J+ e X8 @9 m) f, a
# Q/ ]8 m$ }/ Q( k- /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期,; n: q! {2 s- Y. M! g! x; V
- 因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为
0 I" v+ a3 K/ ^* U# L) ? - 中断和高优先级任务可能会用到它。 */
: `9 Y4 W0 u: ^" m" T* M - xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle );; X# e: c+ V. C8 a
+ d4 V& a. r9 w8 P) ~9 I- /* 使用句柄删除任务. */! f4 x; ~' ^" S
- if( xHandle !=NULL )3 ~' F3 e5 | N2 ^: Z5 w/ j
- {
5 T# l$ F9 u8 [6 V - vTaskDelete( xHandle );3 N e; D5 r! j
- }
- n; {* I3 O1 z+ E/ h - }
复制代码 + O; }, A5 L, E6 A& T$ \
03. xTaskCreateStatic()函数7 @7 F; h* z5 T
- TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,; y2 n+ u4 d4 g) U9 x
- const char * const pcName,3 ^# v) v' R/ l
- const uint32_t ulStackDepth,
6 M) u8 B" i1 G; Z - void * const pvParameters,
+ U! u! M, k: V% N - UBaseType_t uxPriority,4 B. ~. _3 n. C u; F
- StackType_t * const puxStackBuffer,9 m, u1 u! q+ P* }* @. x8 Q
- StaticTask_t * const pxTaskBuffer )
$ r2 ^2 J: D$ ]6 Y: r4 B9 f, i - 1 x( G8 Z! X+ v, b( S
- 此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用户来提供。如果要使用该函数的话就需要将宏configSUPPORT_STATIC_ALLOCATION定义为1。
/ W. x7 H" F/ e5 I - 5 T; |4 O. M0 t/ @, T
- 参数:7 g+ F: C' b% ]. g' E
- pxTaskCode 任务函数
$ e' j. q0 H$ I6 j - pcName 任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
% o6 }+ }6 L3 |! R" k# g" D - usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。( _: @& p' U$ i$ d) t u& `
- pvParameters 传递给任务函数的参数
2 I* A$ u [9 Z* s2 l# ?* O+ b - uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1
3 M7 ^/ P0 e V |$ A - puxStackBuffer 任务堆栈 一般为数组,数组类型腰围StackType_t类型。# e# u6 r" E& r% Y1 m
- pxTaskBuffer 任务控制块
8 S% `5 y$ Z) H/ m
* L' r" [9 M, G0 m- ! N0 F8 a, f$ K ]. C; b
- 返回值:8 [4 Q3 n J/ ?7 ~# Z2 d
- NULL 任务创建失败,puxStackBuffer或者pxTaskBuffer为NULL的时候会导致这个错误的发生。% E) W$ b: J w7 F6 j
- 其它值 任务创建成功,返回任务的任务句柄
复制代码 & w6 [1 U" k( {9 b3 I' G
04. xTaskCreateRestricted()函数& [* ^4 W: _) F! E4 j$ O" ~* ~6 b) \5 a
- BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
0 A$ I$ |, g; h! f - TaskHandle_t * pxCreatedTask )2 g$ a8 i9 l' a# o& U: l9 J
- 功能:
4 v3 q+ F5 o2 E - 创建任务,只不过此函数要求所使用的MCU有MPU内存保护单元,用此函数创建的任务会收到MPU的保护,其它的功能和函数xTAskCreate()一样。' @$ E5 |, W; Q: F6 Q
- 参数:
1 K( r9 X7 e0 z; } - pxTaskDefinition 指向一个结构体TaskParameters_t,这个及饿哦固体描述了任务的任务函数,堆栈大小,优先级等。
: @8 L- y- i+ A9 d P; A z# {% E - pxCreatedTask 任务句柄- C7 r1 W5 i( ^) w) h
- 返回值:
- |8 D' @, _0 Q, \' S, p- R - pdPASS 任务创建成功5 B0 W( `$ X0 B! }* [5 T9 d
- 其它值 任务为创建成功,很有可能是因为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- void vTaskDelete( TaskHandle_t xTaskToDelete )% M) `3 O% d4 i' g: q
- 功能:8 O3 K) z9 F& `& f
- 删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务。
& L! n1 \" p$ M s9 u - 参数:$ |) }0 d8 Z8 T( y" P$ {4 D
- xTaskToDelete 要删除的任务的任务句柄
3 J3 I# ?5 b2 \& c; i% @& U$ S$ F0 A - 返回值:
9 V V$ y7 y# M$ V: n' n - 无
复制代码 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
|