前言1 k' V' j. T6 [7 L
本篇文章带大家学习一下如何使用RTOS API函数创建任务。
: r8 w1 O7 q s8 M! j2 Z( I* M0 ~9 H4 T2 v0 L- y( b0 ?5 W0 e6 L
一、cuebMX配置
5 q- C+ s% A4 }+ b; z0 T! a" e具体配置
( T+ x7 J7 J) J' |5 g G/ v
- |% S) G+ ?8 K二、代码解析
2 D1 e5 S1 }( o! R2 D; p" N1.系统创建的任务函数
% G% p! r4 H% P' ]5 d$ @! A. N下面我们来看看系统是如何创建一个任务的。
, F9 n8 W) I; L. x! B: S: K5 M; B1 t
- osThreadId defaultTaskHandle;//任务函数句柄, K6 k. q5 Q% o9 N8 T' a4 y; D
9 U, {% j2 B9 V& O- //StartDefaultTask:任务函数名字
0 N2 k: f4 s/ G8 U9 Q) V - //defaultTask:名字* X# \) S! m9 `) S- g" t
- //osPriorityNormal:任务优先级2 I& l- Z6 Q2 N
- osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
& a( {& A6 ~- J; Y! K$ Z# ` - defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
3 r# n$ M0 c# v& I* `) p
$ \2 d0 K* y; p5 }. d b( t$ p- //任务函数的格式
8 _& h; [# ]1 U0 Q - void StartDefaultTask(void const * argument)0 u1 r: c; a' n& _4 s9 ]2 q, X6 B
- {! B/ j8 h" w$ l5 f
- /* USER CODE BEGIN 5 */
7 |5 v N) Z/ d4 p4 ^6 m3 M" K6 b* k
' m+ T3 \" {1 \- /* Infinite loop */
. }: g6 f5 V' P% y$ P) r - for(;;)
7 j U5 C) i3 G2 s% a - {
: H/ F, }6 B z. ^3 H7 H
- m* i8 ~2 F. B( `6 {- }
& M! I- f: ^) B5 j, u9 ] - /* USER CODE END 5 */
/ U2 U0 @& \" |. _5 j5 E - }
复制代码
3 B: `. L6 ?5 Y! `2.函数任务优先级/ _7 D# S. A2 { u0 d5 [; M
RTOS中给我们定义了如下优先级,优先级的数值越大优先级越高。3 j6 ~4 v8 p# _& A* }
9 d( n2 k, M! Z& x
- typedef enum {
3 o8 _- U9 [9 C( e - osPriorityIdle = -3, ///< priority: idle (lowest); ~( D# g3 K' r, X5 F
- osPriorityLow = -2, ///< priority: low
7 @' I; j, x3 u) ?: M9 j - osPriorityBelowNormal = -1, ///< priority: below normal+ D3 O2 Z8 P& P' [) G! B
- osPriorityNormal = 0, ///< priority: normal (default)
S0 N$ _; p9 }& g6 m! f - osPriorityAboveNormal = +1, ///< priority: above normal
; s- b9 u5 b: b0 s! }" t - osPriorityHigh = +2, ///< priority: high
4 q+ l$ t% ~! ]% k% P0 g - osPriorityRealtime = +3, ///< priority: realtime (highest)
+ S. q N6 o1 s& S, I) I! g+ e. m2 g* w - osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority1 j5 P. Q6 ~/ H9 d: ^1 e2 t
- } osPriority;
复制代码
: K4 y# [% ?+ `. F3.自己创建任务函数& l9 \- W ]6 x8 U/ @
我们可以仿照系统给我们创建的函数,自己去创建任务函数。
! D) V1 i. h7 b3 J# @" j1 \
% B+ @. ~4 D/ D7 o- osThreadId DirveTaskHandle;
: _; J/ B7 m- w& _
4 I6 i, g$ S1 c' Q9 p7 L! z/ H9 c- void DriveTask(void const * argument);
0 x% |4 i+ X) M: n. ~: f. { - z% A0 f! L2 F, V8 W& K) y
- osThreadDef(DriveTaskName, DriveTask, osPriorityAboveNormal, 0, 128);
l6 n4 I7 h* Q7 O* ?2 T6 Q3 q - DirveTaskHandle = osThreadCreate(osThread(DriveTaskName), NULL);
8 j. _) i0 p# C# ^6 t; u% Z% |
( ?) J8 }( }$ ~9 ~0 M- void DriveTask(void const * argument)# o; |4 \, I' ~9 Z+ Q; z
- { 7 J; t) k( I8 x7 S+ T6 r8 I3 i( y
- ) I7 T; f: z/ B* C
- for(;;)
: j& D# K, d! q# B" J - {
( N2 Y8 ~( }$ W0 P& G
& N5 e& s/ K% {( `# q
5 D! B% Z! e T+ P8 O" b- osDelay(5);//调用延时才会释放资源
; \" x5 f) W" K& h# L) ^ - }- r) S! ]5 u5 G& @
- }
复制代码
: V- K2 a) D! w5 h2 _; r由此我们的任务函数就创建完成了,我们可以在任务函数中去调用我们自己写的函数,或者执行自己想要执行的程序。6 _* ^3 P# i" I& u' x
8 u2 Z$ A5 v# ^. p5 f
总结
; P, a! `- j% \3 Q! d: l! x; `大家有什么问题的话,可以留言或者私信。
/ Y, W9 j' {, W5 r* x! q6 O% X+ f0 {* V5 b W
4 i5 H' A8 e0 {! o0 ?
|