1.准备FreeRTOS源文件7 X5 P6 i _2 t2 Y( M4 `
1.1、到freertos.org下载最新版本的源文件,链接地址* C1 X. D4 a$ ~7 s' K; `# S
# d5 M3 n: m" j$ } J1.2、FreeRTOS 文件结构如下:
5 [! Y3 i. K7 m0 o* X
& q+ m3 Y+ k; T8 i s! o. Q" [需要用到的是粉色的头文件和翠绿色c文件。! L4 ` @2 R5 e* h3 c/ {
" T4 V T1 X( R- F" ~6 ]$ c5 j
2 c, j& A0 K$ W
* I- k: z; t) u2、使用STM32CubeMX生成初始化代码(BSP_Init)- w: @6 e, W: N; A: ^
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
' z! X* |( ` {6 p; n7 f
; G) o/ Z% h) H. u @( }* V2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
: p, l1 [5 F: C1 t) n' x& H, \, x) `$ s; O& S3 A7 s `# K$ T( [- W
3、复制FreeRTOS文件到工程目录中
5 Y. F1 c) d. s& A3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹; C! p' ^* O' s8 ~
9 a4 c" a' ^+ V; p" U( s7 V最后看起来目录结构是这样
r# s( p% l" c% r. ` j. P- n/ k* a1 b- w; Q* Q
% T- U$ M% ?4 }! K) H$ c2 r* F7 g4 Z% t6 B/ Y# d" [
+FreeRTOS
* ~. e, N- q2 M) j! k X |+include
9 j0 Q. d& v' w% z2 x9 h% O |+source2 Y$ d. e) C5 z! D) x
- _+ I: W3 w. @3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中- [9 w; U; E; O+ D) f
& z6 M4 ^3 X E9 h; W3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中7 J. B; k; ^- p+ X' q' E. J$ K
J$ c/ ]' L( L# I h3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
9 j' N1 o4 @8 Q+ h4 V- \+ }- f/ D/ \- S, z: a- O
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去9 M7 N0 @7 @' h* V
3 S7 Q9 j$ D! e: [" b
' L- d( f, v' g% b, f, Q$ W9 z
/ Q2 V+ M Y+ F& K4 N2 G3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"( d/ Z4 i0 U/ h7 H6 c0 t5 `
) w& P5 _$ p% n" m
6 x) Z& C1 o/ H u4 ~3 A$ {* u$ u# G
: S' X4 F) ~ {, ?
4、修改代码
2 I4 e5 h; r+ s% K0 M8 L4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
0 p# e8 A' X* R
' ~$ V7 L# h, x2 y5 o' K" H% @4.2、在main.c添加代码,添加任务* z' p* o2 C6 ~ o$ i2 x
. v0 [- Z6 G: R/ j$ |- /* USER CODE BEGIN Includes */, q3 H+ t& d# P% F* h1 ]4 S) b# \
- #include "FreeRTOS.h"
# A2 E. h, V; n - #include "task.h"; l5 M0 q0 [; w0 L, n$ V
- #include "queue.h"1 `& i2 M9 q* O. Z& V
- #include "semphr.h"- ^7 t$ P5 D6 l" j0 G
- #include "event_groups.h"+ S/ X5 U5 C! V, H, T) S* {9 j
- #include "timers.h"; ~$ {7 t* t0 q* ]. H' y
8 I8 l$ k' C) B- /* USER CODE END Includes */# x0 R) z" l0 @& ?
- *+ [# K4 t# c# x0 x
- *
2 N6 G4 g) O r; p, R ^ - *3 {) `( @4 h" \2 ^* ?, X8 Z
- /* USER CODE BEGIN PV */1 q" B. c6 \$ H8 J: n4 G# x7 [2 N
- static void Send_Task(void* pvParameters);- ]: j8 E; ?& ^) P0 @+ z! q
- static void Callback_LEDTOGGLE(void* pvParameters);
$ @( F6 B( j# E, U1 i- u
3 g: `7 c1 _: t- static void AppTaskCreate(void);& k& s' S S) b ?9 y
- 3 o3 s7 f W0 A; ?. w' x
5 p4 R! a3 |7 p0 d, {- /*Task Handle*/ Z f+ {7 I9 i q' A8 U& g
- static TaskHandle_t AppTaskCreate_Handle=NULL;) M1 E8 {9 O$ f( j: j
- static TaskHandle_t Send_Task_Handle=NULL; //PRO:3, Z, ?9 Z; e3 I8 A6 W/ r6 Y
- / K$ S- q/ Q4 l" j2 P( o
- 4 N% z# G7 h) J) G" f
- /*Timer handle*/
+ D0 G3 k. D7 C6 ] - static TimerHandle_t Timer1=NULL;
; ?; D; x4 d' ^% E8 R
& e: z" k) W7 F2 T2 j: o# M- static void Callback_LEDTOGGLE(void* pvParameters)( I& ^; |+ x' u$ D7 Z
- {8 Y; R$ C! j) o9 z0 b: j/ `
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
: B8 p) K# n& v% g - " [6 r8 U" p' Y) T
- }1 a Z6 l: z; C- m7 @% x& F
- /* USER CODE END PV */2 @. s+ q4 H, j4 n. x; B4 l, ?
- *
+ C/ M- e0 s/ m+ _$ ]. x7 J7 e - *
" J" A$ ^4 Z9 d* ^/ k% Z - *8 s* ~& H) P- L$ a$ {! ~, m
- int main(void)
1 I+ a$ j+ g4 O! h& m# D9 S' M0 j - {6 r7 z x0 x0 p3 X" ?
- /* USER CODE BEGIN 1 */( u5 F' ?2 E, ?6 E6 v
- BaseType_t xReturn =pdPASS;
' {. i3 o8 m. Y( J5 s1 E - /* USER CODE END 1 */- N" H* g7 o1 }$ N
- *
4 V! ?2 C1 g. x2 a" _ - *
1 u6 L1 l5 u8 Z& M3 X, \ - /* Infinite loop */
( A' s7 E! W0 X. w& K% p1 e. R/ T - /* USER CODE BEGIN WHILE */
7 U J$ }) h5 G8 | z - xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\8 k6 }" a! @$ l, S7 u; J5 l7 c1 d
- (const char *)"APPTASKCREATE",\" [+ ?: `$ y7 E D2 j1 x
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
. Z4 B( R% B, M7 N( o* ^. Z9 L - (TaskHandle_t*)&AppTaskCreate_Handle);
P! C8 I1 P' g8 I, x2 Q% e7 g1 u - if(pdPASS==xReturn)! p5 h* l( K4 B
- vTaskStartScheduler();9 S% }, G6 @+ w7 f+ O6 ^* ^
- else3 ?7 s: F9 Q! V6 |1 p. a
- return -1;) V% J8 C4 u/ ]
- while (1)6 _* e% b- o+ W
- {. d, d8 Q* Q. l, Z: T
- /* USER CODE END WHILE */% V: E# |9 s6 N: B/ y) \- \
- /* USER CODE BEGIN 3 */
9 Z9 X5 J x! G4 r/ N/ g2 k - }: p! |! u% e( E- T* ]& {
- /* USER CODE END 3 */# [3 e# Q2 X, t6 }6 L; S+ b2 B8 _1 R
- }
. U% L) r! |9 {( R
5 M+ K5 z3 K e* m4 Q0 _- *
) ~) H1 `: B, r4 Z, f# L - *
; t$ e4 X6 j/ [/ Q) ?+ d
6 ~+ L" w l: g$ T* |- /* USER CODE BEGIN 4 */- k- D, v- }2 Q) X$ K% O0 ~
- /***********
1 _% @: v. t1 m: w- F3 a" V5 y2 h3 u - *@Function name:SEND_Task. j* l; n6 p+ v- y
- *@description:SEND_Task body; Z1 |+ ]! I$ s, B3 \# `1 j
- *@Parameter:None4 N+ V0 ] K; o+ v
- *@return:None( z/ V7 I+ J: ~
- *************/
" o4 k. n" A' t& b y - static void Send_Task(void* pvParameters)4 i& |0 j- Y9 X6 v% Z7 I
- {
6 f8 ^; O* q( ?! z1 h& H
; [! P3 @" L5 E4 M2 |) [5 L# N- while(1)
, a$ K# R d2 n - { + K# W0 T+ X7 |+ Y
- vTaskDelay(100); //Just to demonstrate task switching.8 L) m6 a7 r7 n3 I$ P( N
- }; J# i) s+ h8 s# u
- }( D5 u, ]9 w& ?4 \% D
- " M* N4 |" j: D
- static void AppTaskCreate(void)3 d* b: a6 b( z/ N5 k$ Q+ s( N
- { C) M) E, m8 T( [0 D3 v- J
- BaseType_t xReturn=pdPASS;4 Z& Q( ?& B( P5 H2 o6 J
- taskENTER_CRITICAL();0 k/ n+ d& x: s; r/ R6 B
# I+ W3 E) A% c% B+ i- /* Create Timer1 Handle*/- _ |3 T- A s8 p# y9 V. @
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\2 Y4 F7 V" m. D2 w) Y6 a
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);& H) d6 \+ f9 v$ q c
- if(NULL!=Timer1)) U( B/ `1 C# m/ x' U0 e4 i
- {}/ g' P. p, Z4 b, Z! D! d
- xTimerStart(Timer1,0);: i2 s+ t$ J, C) Y$ W, U$ [/ J9 q
- , i+ X e6 U3 a" r! X3 s
- /*SEND task*/
9 ~; P r/ o& V3 S1 o: P6 h9 V - xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
9 a" z+ j! X1 @- F" R, i! ` B" {' e - (const char*)"SEND_TASK",\
5 E( e! X _' J q( H - (uint16_t)512,(void*)NULL,(UBaseType_t)3,\% w. k( i: ^; H) ^3 h) j. ?
- (TaskHandle_t*)&Send_Task_Handle);
2 y) v) k& @- q3 } - if(pdPASS==xReturn) u0 F9 Y6 q: N3 d- L
- {}9 |+ e6 C$ U5 N* {6 I& R1 ]- _
* _9 @5 M9 }& O1 }4 K; e6 L4 i- vTaskDelete(AppTaskCreate_Handle);* | g. N+ r: Q; t3 h
- taskEXIT_CRITICAL();
8 m5 E/ l# n( v - }: k: N1 Y& S: K% K
- 8 R7 C* a# c$ E) X) g
- /* USER CODE END 4 */
复制代码
G& j" s# G" D4.3、编译烧录。
( |5 s0 f' [7 W$ I* u+ j- Z; f! M) z' r4 e. Q6 A& k2 Q! Y
8 `) T: i, Z3 p6 E; k6 i
|