前言
" n4 v( j- X8 a$ k9 J本文带大家使用cubeMX快速配置FreeRTOS的任务。
& w; ~8 W: p0 ?6 D
. G: l1 `7 A; x+ |; P! B一、cubeMX配置) x a. f0 F1 d6 P& m1 D
1.选择FreeRTOS
) v. U. u* {' n
j" W2 s; K( R& N, N& n( p1 c4 ]
$ @% J8 p: ?1 ~2 q2.为FreeRTOS分配任务栈大小
8 J9 y6 Q9 n3 ?0 I5 B
7 | O- R- Q% Q8 ^( h/ H* i6 Y7 E& @
- n: W) \# a* d$ e$ B; P# ^
) k5 Y* ~' s, _5 O8 r I" R这里内存可以设置大一点,内存不足会导致任务无法创建。
& z3 {3 u4 o: {, e8 {- E, [6 t7 d8 X
3.创建任务
: n) q$ g! e z4 n# G0 c: m点击Add添加一个任务
2 k2 G! t$ E' f0 W6 D7 ^
; H" h& @9 y) A- C
2 E2 X% K$ R4 N$ M" C5 H; v5 B5 }* I( q
1.Task Name:任务名字: `% ^6 F. i" x6 ]- v/ z
2.priority:任务优先级5 \: H3 n A" Y) J
3.Stack size:任务堆栈大小(字节)
' C' r' |. X: ]3 P2 J4.Entry Function:任务函数名字
! _+ \3 ]0 F# ]) o" ?& u( r其他几个参数我们设置为默认值就OK了
5 ~7 ~# T, g9 H/ M% m3 r5 X& H1 }0 u) y
二、代码查看/ v6 |# h* c, u( }/ A6 B5 A
1.创建任务
5 B& ~$ F9 c- Z9 [; O2 Z/ d5 p" E; n7 x0 J
- //cubeMX帮我们自动生成的任务) l* {$ N- ^7 }3 |5 d; F
- /* Create the thread(s) */
! l5 m0 P. ]3 `6 x" \, s1 v( } - /* definition and creation of defaultTask */. v! z. x/ o; u- \
- osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); Q! H; s$ i K# l& `8 L& Y% b6 O
- defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);
# m5 y. ]) o1 C C: |7 R& N/ I& c - 7 O! m) n& v+ H
- //我们自己创建的任务
# k9 t( L2 |/ ^' f. V& E- _ - /* definition and creation of Task1 */
" J) g1 B7 N, n3 v - osThreadDef(Task1, StartTask1, osPriorityNormal, 0, 128);! ^1 ^, m7 r8 @+ v7 s9 ~6 h1 b
- Task1Handle = osThreadCreate(osThread(Task1), NULL);
& {' U! g" m, u - ) M. t" t& m' w: H6 K
- /* USER CODE BEGIN RTOS_THREADS */
]* _+ c1 g/ i4 Z" E - /* add threads, ... */
, z( E% Z6 ?% J8 R9 A. K5 } - /* USER CODE END RTOS_THREADS */" ~ p" t" ?) [$ a! e. f
2 `: f! K& E1 N- /* Start scheduler */& y0 K/ v6 u8 _4 }
- osKernelStart();//开启任务调度器
复制代码 3 }, r8 B: K$ o3 M0 p+ ?
2.任务函数
$ I" J, Y7 O& W: e( v- ?使用osDelay函数会释放资源使任务进入阻塞状态。$ o u/ _ w, T5 k) z$ H9 L
, R, ~3 Z. `( y$ h- /* USER CODE END Header_StartDefaultTask */
& N: r0 A: X" s' g - void StartDefaultTask(void const * argument)
# `3 i8 t) F/ w# ]+ n5 L - {
- ~* E- I) T. b( y8 n& `: D - /* USER CODE BEGIN 5 */% t$ O! v, v& u4 w" T, B8 s& a6 u
- /* Infinite loop */+ q6 ?3 A/ H8 J# {2 y7 q/ C9 D
- for(;;)
1 J$ |6 L, O! ?. N3 N - {- e$ T1 J7 V# O9 l. d, D& E
- 3 r, B; `3 R# a1 H
- }: j; U. m I( i( B" o6 `
- /* USER CODE END 5 */3 F% |* G" A7 E& F
- }1 ?7 E. R# e1 L1 t
- ( s: D% y! K$ |% v0 b
- /* USER CODE BEGIN Header_StartTask1 */2 t# f3 n' U3 n# Q
- /**
( ]$ S; p' V' `/ x" R* B7 l - * @brief Function implementing the Task1 thread.- y* F# K. F9 `2 {
- * @param argument: Not used) r2 S3 n& ~1 n% V, m, m
- * @retval None. h# }" [/ S Q5 g/ G6 x0 ^. a
- */# R7 d& C5 T, X* D4 u- \) G
- /* USER CODE END Header_StartTask1 */
0 f+ K# Y4 D S; ?' `5 N6 G - void StartTask1(void const * argument); v- v) N# C, c' G
- {. E- T3 K7 G# }+ _
- /* USER CODE BEGIN StartTask1 */6 k1 c6 v+ y0 F# e, G1 v: j0 ^5 T
- /* Infinite loop */& i+ w( i- b% T% i; v
- for(;;)
# c: ]5 t3 n6 @ - {
+ r+ T- F6 Z; O: h& U+ @6 L - osDelay(1);
1 i& Y6 w5 B+ q# B% P - }- y. J7 \# Z/ {- Q% ^
- /* USER CODE END StartTask1 */3 X7 L% j+ g. E* ]( `& _
- }
复制代码
" [9 Y, c X* W+ c) h( o& d总结- w" S/ b( ]1 B c# b3 m
使用cubeMX配置能大大减小我们代码的书写量。$ I) n8 J: n- k' w0 w
; q# m" L) [; E# P
w: ]- w" o$ q. Q
8 x2 y w* a8 \3 e! O/ {7 Q |