前言5 x: A: J: b! L, l, y8 k6 x+ C
本文带大家使用cubeMX快速配置FreeRTOS的任务。5 x. a6 H- `: m9 o' P' b# c) S' R# a1 _
( ]! T( p. O: K" ~" ]7 W
一、cubeMX配置% E( x/ K$ f- M
1.选择FreeRTOS0 g$ ?3 _2 _8 Z# V3 Y L
2 |/ u9 p* w! M+ E4 \: F
( Z5 x$ b6 W8 e, {, T2.为FreeRTOS分配任务栈大小
- t5 `4 _7 ~; r: n; L% K. ]1 X, g* S; J
, h% |( R$ z4 A7 e
( `! ^- d8 H- z' R) \$ r3 y, f+ m这里内存可以设置大一点,内存不足会导致任务无法创建。' @" r; Y8 G" q' m2 |
T9 V, K; s" Z. f7 T: b5 O
3.创建任务! ] d) \/ u* B! \; F2 z a
点击Add添加一个任务: T' Y( E) A/ }+ W
0 u" u* v3 b" k9 P% Z3 z
i: ~2 r/ W8 f K
- o' t% O' `+ F3 D, s4 g: t1.Task Name:任务名字
$ f: I& J- z+ n5 _) m2.priority:任务优先级
6 N* I2 n- `- P3.Stack size:任务堆栈大小(字节)
" H7 [2 F" H0 T& p- A4 Q- R! Z# S; w/ e4.Entry Function:任务函数名字1 U2 g' ]1 j3 X7 c4 f" I' o
其他几个参数我们设置为默认值就OK了8 d5 {. `- _3 S5 _* D" ^
. c9 U0 b" ]& I3 q, a二、代码查看3 s! w3 p6 V- w
1.创建任务
# Y% ~4 i/ V! m4 K& h) O- b3 r: i5 x
- //cubeMX帮我们自动生成的任务
2 b$ D7 D! n6 C* H - /* Create the thread(s) */# e" s9 e1 w7 [# G1 @
- /* definition and creation of defaultTask */- ~# [$ `; T( G
- osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);5 ~9 I3 V( y5 h( v
- defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);: f. U1 I4 n8 o" X
) c) B! j, R# L8 C( k- //我们自己创建的任务9 X8 E: P F d* P6 X
- /* definition and creation of Task1 */. |1 d/ t& o; q" J' w9 D j+ H. e
- osThreadDef(Task1, StartTask1, osPriorityNormal, 0, 128);
4 \2 F$ C+ N: p7 W, S/ c7 n* F1 B. [ - Task1Handle = osThreadCreate(osThread(Task1), NULL);
, i" y3 o+ g& W( K1 t1 x - 2 f* r) n2 N. S" r
- /* USER CODE BEGIN RTOS_THREADS */
$ g" r$ _+ s) Q M; e - /* add threads, ... */
6 a: R9 q/ `7 \: ^/ x' A9 J - /* USER CODE END RTOS_THREADS */; x3 ^# C0 e6 L( Q
1 w/ U7 T0 F1 t8 T5 h* a/ f- /* Start scheduler */) |! P* C' S4 ?$ {. o
- osKernelStart();//开启任务调度器
复制代码
, _ {8 k. T5 a6 {2.任务函数& Z" K5 ^6 r7 }: M9 v
使用osDelay函数会释放资源使任务进入阻塞状态。! J5 l! Q5 |3 `
3 N: _/ ]* d( { |' j
- /* USER CODE END Header_StartDefaultTask */3 _5 Y) F! a3 z; W3 c$ b6 s7 n
- void StartDefaultTask(void const * argument)
4 g$ ^, m: {: L- T - {0 t( |0 q) D, i$ _! \
- /* USER CODE BEGIN 5 */, y# F, b- D) f3 P! S' Y' z
- /* Infinite loop */5 y9 H' w+ A- w5 A6 Y( K
- for(;;)
( X' u0 w" T/ z& e! l; L+ r( s - {
, Q! F1 M* P4 K- D2 c' m9 z) o
; S, s$ N( X* X e% T' ^5 U8 e- }
+ M1 E2 j/ G7 r - /* USER CODE END 5 */: |) p3 k1 U) p: y" ?
- }$ Z& U9 Y- b. }% E4 u1 {4 ^
- k3 `# z7 h R" S. X- /* USER CODE BEGIN Header_StartTask1 */
e- ~# @; ?0 E, F. [& p( q$ g' p - /**2 L1 |+ E: A8 f9 o# b- @
- * @brief Function implementing the Task1 thread.9 x2 t7 @- w3 M' A$ g v3 H, s- I5 C
- * @param argument: Not used
& r( Q5 P9 B$ y0 H: e( x - * @retval None, W2 ?2 s7 D( \, U' X' F, ?0 C5 v
- */
; u- G- }, z% C# ]+ t+ o - /* USER CODE END Header_StartTask1 */
) m: n$ F( \/ D: j - void StartTask1(void const * argument)
* C; V& \ Q. e; a - {
8 ^/ D6 p \4 ]" y2 K - /* USER CODE BEGIN StartTask1 */( r( `' T1 K0 J1 C7 X" C
- /* Infinite loop */
8 o7 \. V. T* I - for(;;)' `- G( _8 _( z! u
- {
- B* r$ S8 t, @1 q: F; M I- A - osDelay(1);- Z. m& q: G" M' w4 c6 O
- }
2 T; P! d; D y0 {3 Z2 Z - /* USER CODE END StartTask1 */. e. Q1 G% \ w* ]8 N. g( b8 O
- }
复制代码 [( i+ C4 i( O3 A
总结
4 W: u! S% ~5 |" ^* b" G0 U使用cubeMX配置能大大减小我们代码的书写量。. P9 a& |' h0 J" ]" c
# g. Y, E' d$ c. }7 }) A W
' m3 m" C& b- `* ^# [
t( R" K" L" E p |