前言
+ r& ~5 r# s9 N9 u8 u. w本文带大家使用cubeMX快速配置FreeRTOS的任务。 D* {- q ?$ L% Z+ R
/ C. c/ j& a. l) y% L1 `' b
一、cubeMX配置# A8 H& o; a9 W# i7 W! S
1.选择FreeRTOS
s2 a4 Q) L2 _; g; j
# A% Z0 ?9 V% S& ]7 O) a. i2 T. x9 N
T7 ^( h6 b8 p! }# j2.为FreeRTOS分配任务栈大小( g' s; u/ o( f% L
$ x# s* X: Y8 f, u* ^) b
$ o) Q6 p/ T. Q$ N# O
! ] o; E3 U# P( Z这里内存可以设置大一点,内存不足会导致任务无法创建。
4 g- @' \) d. d4 j& q) J1 u
0 T. M: f* ?9 A3 \: z6 k3.创建任务
% m9 R& d6 Y, E" y2 Y点击Add添加一个任务4 y" a, N4 M3 Z* C: T
8 a0 N( p f: t
- w1 l6 v2 Q4 A+ a2 m
" c2 P- B* f) y1.Task Name:任务名字% Q2 T! m9 Q" a+ U
2.priority:任务优先级+ x" A3 M; z" s; d2 _3 `: t: n
3.Stack size:任务堆栈大小(字节)
$ x# L: C& J: s4 c4.Entry Function:任务函数名字
0 `, m" j; J- |8 e7 K3 Y其他几个参数我们设置为默认值就OK了
4 h$ V6 h+ L. l: y) I- M2 }/ e" ]( \8 @
二、代码查看
! O% S* k/ m+ z5 T1.创建任务' ]% J, m+ E% \
) K ?0 f! C' e) Z- D
- //cubeMX帮我们自动生成的任务1 V7 Z$ ^2 ?# @3 e+ l
- /* Create the thread(s) */
# \& R* y/ F# p+ z' y b+ K, V; C" t0 x - /* definition and creation of defaultTask *// L7 p/ E9 ]) g9 n" k# Q) _
- osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);4 j w! i) ?" R5 D. o2 B/ ]
- defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);$ }- n) @- T7 a
- ) a) j) I6 U7 j( Z+ t
- //我们自己创建的任务
0 C: l& t- d4 M. V6 H. l7 Q - /* definition and creation of Task1 */
3 `& B+ E) @2 b& F - osThreadDef(Task1, StartTask1, osPriorityNormal, 0, 128);
# D, L! v* l% E( O2 O - Task1Handle = osThreadCreate(osThread(Task1), NULL);) z- E# {3 R4 y, d2 K- h x
- # R b5 N" b' d8 y6 v
- /* USER CODE BEGIN RTOS_THREADS */+ S) O' F9 V5 e E7 F
- /* add threads, ... */ S4 p% i6 B4 T5 u5 q4 Q O
- /* USER CODE END RTOS_THREADS */
$ }, r R8 ]: I9 n7 Y! r, f! G! M8 R
0 t4 H1 F. X6 V9 q2 B- /* Start scheduler */" e7 T7 }- c, Y
- osKernelStart();//开启任务调度器
复制代码
, D. R' K4 w$ Y# N+ h, n2.任务函数
! f5 B8 ?6 p( [使用osDelay函数会释放资源使任务进入阻塞状态。
! s2 e( W5 J- t: [% Z1 w& K
# N9 d7 K* [$ s& r% t- /* USER CODE END Header_StartDefaultTask */
5 d, v% ^% e$ y9 C - void StartDefaultTask(void const * argument)& k3 @8 F# ]) z" ~7 [0 j. N, @
- {
{% m& B2 a) c - /* USER CODE BEGIN 5 */
* `3 r5 {1 J8 W: _" e4 K, n! q - /* Infinite loop */
% E5 ? g# y6 [ - for(;;)
" a7 O' U: N- \2 Z5 Q - {/ Q5 X, n0 \( |2 J4 w
- |! P- Z6 t* f/ B, y' f
- }5 ~/ H+ h; g9 o( N) m. ~% m: T
- /* USER CODE END 5 */5 a$ I. ~6 \5 G% a S# V0 y- g
- }. C: ^. B3 F1 Y* Y
- . G# W6 M6 ?: @# M# Q; o9 L$ x5 {
- /* USER CODE BEGIN Header_StartTask1 */
- k' }; c* L+ M: ^1 ]! k3 w9 v - /**
/ M( z4 z1 t ] f) a - * @brief Function implementing the Task1 thread.! e" U! b$ J, Y# I7 Y. i/ @
- * @param argument: Not used
% @+ m5 y A9 R6 Y6 V - * @retval None1 i; [ K1 e; o
- */
& ?- V* k9 ~3 E" b) g) \+ ?# j - /* USER CODE END Header_StartTask1 */
' C, ]* c8 W" i R4 Z# j - void StartTask1(void const * argument)
7 N: Q# o! j/ E: F. C3 f' I - {) M8 h4 q( d8 ~3 L6 s
- /* USER CODE BEGIN StartTask1 */
/ m% O8 a/ L" a9 C - /* Infinite loop */! I j1 p2 D- P/ M2 w J3 c
- for(;;)
% i. r+ o C- U) ~+ Q* y - {2 x$ A" o/ d4 {0 K
- osDelay(1);
8 D1 p5 y4 |& \ - }
4 i _3 {% \8 @ - /* USER CODE END StartTask1 */: ~1 b" j& f, ~2 |- W4 ?/ P
- }
复制代码 : q2 z- k/ S B+ g2 L6 P
总结
' b- ~) m6 A- h/ J4 }7 e V9 f使用cubeMX配置能大大减小我们代码的书写量。
. r9 g9 Q& v( F4 j# H: _
- o8 z7 I0 h0 B9 O y/ [9 c) S% H: g* I9 l8 ~ d6 M% Z/ }1 `& ^/ H; d0 J
- Y, F% _: M0 F7 P+ f0 A( j |