01. 概述
8 ?8 h7 f K) p1 `' n9 XFreeRTOS最基本的功能就是任务管理,而任务挂你最基本的操作就是创建和删除任务,FreeRTOS的任务创建和删除API函数如下表所示:
8 U. |2 Y6 M; _, P+ e6 m0 ?
2 L; b* f4 g) u( V9 K3 Q
* c( E9 X: P* A' c
$ |9 X" E7 ~; G0 a3 X- e
02. xTaskCreate()函数
. X0 L* X* @+ B8 Q- G. U/ B- BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
. y/ ?; G; {" E- A, f - const char * const pcName, / { P: F* Z n7 J
- const configSTACK_DEPTH_TYPE usStackDepth,0 |+ Q* K& l$ J& A( [4 J
- void * const pvParameters,
$ `+ \2 i$ k- I# \: D. t- J; o - UBaseType_t uxPriority,3 g0 U/ T, B* Y) g. Z& g* K
- TaskHandle_t * const pxCreatedTask )+ i$ b( n E/ a% \, M! I3 m1 F
- 功能:9 a. R4 T4 M& U* \: b) P& W
- 创建一个任务,任务需要RAM来保存与任务有关的状态信息(任务控制块),任务也需要一定的RAM来作为任务堆栈。如果使用函数xTaskCreate()来创建任务的话那么这些所需的RAM就会自动的从FreeRTOS的堆中分配。1 P8 O1 r% T! a+ L
- - o' H9 m8 `& A( z2 ^
- 参数:
0 K" P6 C z; J7 d' g q8 O - pxTaskCode 任务函数( n) ]6 C f ]1 B% d
- pcName 任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。' a6 e/ m0 L. k7 o
- usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。
* X$ a& |" y: k4 h - pvParameters 传递给任务函数的参数
# B" R9 U. o1 X% } - uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1; P9 u) M8 ^9 W! V! H8 w
- pxCreatedTask 任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄其实就是任务的任务堆栈。此参数就用来保存这个任务句柄。其它API函数可能会使用到这个句柄。 " L/ W8 Q; V) a3 x
) n- R7 j, P; E `- `! {- 返回值:+ s2 l! N3 Y% I6 d; D. Z9 g
- pdPASS 成功创建任务1 L+ o0 g4 A% U* `* c
- errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY 任务创建失败 因为堆内存不足
复制代码
6 w7 w. ^( s" ?' u/ f# z应用示例% @: _- q. v( i
2 l( {( b# D# L) `1 ^0 ~% {( ?
- /* 创建任务. */1 C: y0 k- ?' y& ?8 h) T& U: I) n
- void vTaskCode( void * pvParameters )
3 l6 r, Y" N+ c; O. x6 x# A - {" v5 j, k( O9 B1 \
- for( ;; )
1 Z; v' g" [" \3 K. w - {
% T0 l9 r. U3 v: @8 ? - /* 任务代码放在这里 */! r3 u' Y) S3 K' F, p6 r6 a
- }
7 r! p6 \& p( n) Y. [9 s, K - }
+ b( E8 G1 r: ^
, S1 d$ R. r N, J, u- /* 创建任务函数 */
- T5 C. S. q( O! u - void vOtherFunction( void )6 n! T/ i: q. M
- {
8 r& s) g# E, t - static unsigned char ucParameterToPass;
% ^. N5 W8 q* h4 |7 _4 a - xTaskHandlexHandle;$ a! L( c0 _8 C% @; [; ]5 j- N
- 7 Q% w# k. L" b2 V5 X, y0 V& r3 L' l
- /* 创建任务,存储句柄。注:传递的参数ucParameterToPass必须和任务具有相同的生存周期,
5 y: G+ v) ]2 m5 p - 因此这里定义为静态变量。如果它只是一个自动变量,可能不会有太长的生存周期,因为
s4 u# L! K0 O) w F - 中断和高优先级任务可能会用到它。 */
+ R* R/ v, k: f7 G; t - xTaskCreate( vTaskCode, "NAME", STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle );5 t3 x4 ^; ^- t# u8 R6 k/ m
# X1 C0 n6 G9 j& s3 I# @- /* 使用句柄删除任务. */. m! r: l& T2 ^- y; U
- if( xHandle !=NULL )
8 v# y' A% }4 Q& B. c - {
0 o" i3 P! o1 d j; }8 i - vTaskDelete( xHandle );; g; j! o8 c0 g3 {
- }
; r4 m8 f8 Q7 `) P `, J3 S: N - }
复制代码
. q- O; k* P6 b03. xTaskCreateStatic()函数& L4 s4 x, i" K* d/ e% N
- TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
; X6 c1 { s( p$ c, ]/ E- b5 K' j - const char * const pcName,* d8 G, T' r+ J) ~
- const uint32_t ulStackDepth,
7 m0 w! y& }$ Q3 m9 q* [ - void * const pvParameters,
, ]: I4 B$ B; V3 b/ L - UBaseType_t uxPriority,& T" y7 [- n$ J; Z3 I2 K X( z. U0 ~7 v
- StackType_t * const puxStackBuffer,
a, l0 g4 m, Q - StaticTask_t * const pxTaskBuffer ) 8 W2 y) A, P, I! l& M- `" [. ]
2 x; v9 |& t& P/ g& o- 此函数和xTaskCreate()的功能相同,也是用来创建任务的,但是使用此函数创建的任务所需的RAM需要用户来提供。如果要使用该函数的话就需要将宏configSUPPORT_STATIC_ALLOCATION定义为1。
& x" p( y0 `6 e5 c7 B7 j. L
( n( b7 _1 I7 d0 y6 {- 参数:5 d" m1 r5 l6 p3 s# `
- pxTaskCode 任务函数+ G" Z2 E. w0 O' U
- pcName 任务名字,一般用于追踪和调试,任务名字长度不能超过configMax_TASK_NAME_LEN。
, X" s4 S- u( |& L6 {+ S - usStackDepth 任务堆栈大小,注意实际申请到的堆栈是usStackDepth的4倍。其中空闲任务的任务堆栈大小为configMINIMAL_STACK_SIZE。# o6 k1 U- `# C7 |+ B
- pvParameters 传递给任务函数的参数
- T0 F7 y, j6 B5 c N - uxPriority 任务优先级,范围0-configMAX_PRIORITIES-1( L( f5 o( F- f! y3 G' H% ?
- puxStackBuffer 任务堆栈 一般为数组,数组类型腰围StackType_t类型。! c0 i- ^; Z" C- m! t ?
- pxTaskBuffer 任务控制块( _3 Y" E% I1 i
- & U! h+ \ x( L7 P) o( ?
/ `# Y) D4 ~3 S# r- 返回值:7 p) ?% J" Y$ E, J+ Y' Z) t
- NULL 任务创建失败,puxStackBuffer或者pxTaskBuffer为NULL的时候会导致这个错误的发生。
, Y3 g Y$ p5 ?; C" p - 其它值 任务创建成功,返回任务的任务句柄
复制代码
# t6 z9 E {- x0 ^04. xTaskCreateRestricted()函数
) [0 b* {. Y$ }" ^4 L8 Q- BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,
9 G Z8 n p; S* E& } - TaskHandle_t * pxCreatedTask )# }# _9 m) L$ T z
- 功能:
/ I0 i! {6 k7 M% z: Q. i2 o6 u0 B - 创建任务,只不过此函数要求所使用的MCU有MPU内存保护单元,用此函数创建的任务会收到MPU的保护,其它的功能和函数xTAskCreate()一样。, |$ }, f! }0 z, i% Y5 D3 |6 b, C
- 参数:
' m* Z7 }% R. \' G - pxTaskDefinition 指向一个结构体TaskParameters_t,这个及饿哦固体描述了任务的任务函数,堆栈大小,优先级等。
! v/ _3 t/ C T3 p# m- l2 D& t6 u: i - pxCreatedTask 任务句柄
6 w6 z) b U! H4 h T9 p - 返回值:. O3 O- V! P$ @) L! b/ m, }
- pdPASS 任务创建成功
; U7 [6 L' |( d7 Q( T$ K - 其它值 任务为创建成功,很有可能是因为FreeRTOS的堆太小了。1 }6 @, X3 ?; f: U
复制代码 1 E: I% ^6 O; a
05. vTaskDelete()函数$ I$ U' h0 a9 O' n2 ]+ c' E* O( U
从RTOS内核管理器中删除一个任务。任务删除后将会从就绪、阻塞、暂停和事件列表中移除。在文件FreeRTOSConfig.h中,必须定义宏INCLUDE_vTaskDelete 为1,本函数才有效。! l3 G! K* w" P+ [5 m
4 y% Y: J& v5 x5 F
注:被删除的任务,其在任务创建时由内核分配的存储空间,会由空闲任务释放。如果有应用程序调用xTaskDelete(),必须保证空闲任务获取一定的微控制器处理时间。任务代码自己分配的内存是不会自动释放的,因此删除任务前,应该将这些内存释放。
7 l9 Q" ? Z2 p7 S" ]
% g t0 D9 z4 H- void vTaskDelete( TaskHandle_t xTaskToDelete )) ?4 n6 N7 P& {6 X2 A' L
- 功能:
* o+ [/ m5 i6 B/ V' N6 ^) S - 删除一个用函数xTaskCreate()或者xTaskCreateStatic()创建的任务。6 r4 c" b% X' T2 s6 Z5 S
- 参数:, Y- C4 q2 E* i' `
- xTaskToDelete 要删除的任务的任务句柄
" F- j r6 z, e+ A% [4 ` - 返回值:5 y* P& R4 F( _( a( P
- 无
复制代码 - r* k- ^- E! i
" e# _0 m7 B7 `
1 ~# U* K: S% Z& a |