1.准备FreeRTOS源文件
+ s; _5 D4 c, Q J* I/ x) U1.1、到freertos.org下载最新版本的源文件,链接地址
0 r. Y$ w: m& n' A9 B
( b9 E; @( E" E$ O* K. F1.2、FreeRTOS 文件结构如下:
" {6 [/ a1 I/ z0 Z' |0 N7 Y$ {) S3 _8 a. R, H& _
需要用到的是粉色的头文件和翠绿色c文件。5 Z* a, u/ t J- n
4 [) S4 ~4 B/ C
. y7 v) a [2 d' l
9 V% c" I/ g( w3 ]2、使用STM32CubeMX生成初始化代码(BSP_Init) f% c6 z7 D5 ~/ x7 D! @
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)' d) P4 y+ ~0 ]
% w0 y( d* S! o) I: V$ ~2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档; i9 C: ]5 k) `5 B# }6 L8 U
- i0 v# c' x3 L$ }3、复制FreeRTOS文件到工程目录中5 j- s6 o5 p# e
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
( Z8 S5 v4 c) y5 s
. C+ l. ~+ |9 V最后看起来目录结构是这样
" b4 I4 E9 F- h/ [; v# e9 c- f4 s6 O; A$ [
% p8 Z! G) _: J4 W3 {; E a
! D" y2 b. |* Q. w( G: \# j3 J+FreeRTOS: c% Z% l ^# F0 y
|+include: I- @9 x" C- x/ h! A9 s& h5 ?
|+source
( i0 A3 ?( u: y) y" z" e& R/ @: G- n( [% O
3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中* v, n0 D! E8 v1 y" B. d
7 {7 k" v, S5 ^) M. c3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
& ~, q5 E. d1 x9 s5 K- c* L1 G3 @) D5 g
3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程2 e: M. j5 H1 F! w
) k8 m. f. t- J; ~: V& F3.5、新建一个FreeRTOS/source,把所有的c文件添加进去, i) A6 U X5 U% o' B7 h
0 ]1 s& G6 q$ z% B! r
0 n# s0 i9 o# p: ]
- L3 L0 E6 ^% }4 @
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"1 P; b3 x0 J x' P r, y! p j
/ z( f( Q* Z, r' ^% [( Q0 z8 S+ r# B& S/ a4 H$ i" @8 U
+ {+ B) n4 u5 o) n& ~ C o4、修改代码) B2 k+ z; }6 q; I! Z. m4 m
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
" ~- @* { p1 A0 t I7 R9 D6 W' ]; N$ A6 m$ p1 `
4.2、在main.c添加代码,添加任务
4 {0 | V5 F. H. s4 }1 ?
3 v% N. s4 m. E: q4 r- /* USER CODE BEGIN Includes */8 |0 ~/ k1 p3 j
- #include "FreeRTOS.h": @; t B' _" P/ a( u* o$ D. v& S# u; J
- #include "task.h"- i* X6 U% Z k' ^. d( z
- #include "queue.h". B9 [) t0 N, A* t* M2 l
- #include "semphr.h". _" g' c% b! v; x6 @. m
- #include "event_groups.h"
# [# G8 v6 C% d - #include "timers.h"6 O1 I, Y5 B' o+ H% z
: p4 a% D! x" [3 p- /* USER CODE END Includes */
! V. ]; r' g0 a9 a - *; j5 ?$ H, R5 y3 V
- *2 D% c0 {2 z, W& G( b7 o9 @
- *
& l$ b$ J# P) a/ ]* N6 t! a - /* USER CODE BEGIN PV */; O; _% p/ k- Z# t9 V
- static void Send_Task(void* pvParameters);
6 @' b) v0 v6 `+ p! Z! A' ^0 p' M5 ^ - static void Callback_LEDTOGGLE(void* pvParameters);
" ~& d( E7 t' {# W5 T, f' p) U
' i" z( s/ ?) \" r4 d4 t" J- static void AppTaskCreate(void);
4 X# ?4 t8 O0 t9 q* u: M
( Y* j+ t1 G3 `# \# o
+ h& m, S/ M$ Q/ r' g- /*Task Handle*/% C" C4 j+ _# V0 \
- static TaskHandle_t AppTaskCreate_Handle=NULL;
6 f, U- [' ^! h" v6 R, K6 A0 |$ U - static TaskHandle_t Send_Task_Handle=NULL; //PRO:38 d: t1 C& n& R8 h; t) F
, D- t7 {1 \9 k! D7 C# }
7 c7 O8 S0 V n2 }5 ~' e- /*Timer handle*/% j9 E% s' ?4 U
- static TimerHandle_t Timer1=NULL;2 ` p9 @+ z- \6 S" Y9 p" ~
- + w" |+ n; Z( c# U5 j
- static void Callback_LEDTOGGLE(void* pvParameters)1 V- ?( Z. S/ \/ ]1 r- Q
- {& `. p- r" Z2 R/ I& ~" t
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
" O; n7 ^) e! s; C: n O0 N% W
( h, |: J: v/ i, F: x$ {$ E. J- }8 r7 g D+ Y5 M3 ?
- /* USER CODE END PV */
+ Y( `7 }1 `9 k - *9 a5 O. n. p. H7 E9 [- h) m, K
- *0 S, [7 i) v- w
- *
* p7 K( b) |( z) x, F+ g1 v* R3 j - int main(void)
) K @5 w& g; |; h/ P - {5 L7 I" P9 Y& g& Z
- /* USER CODE BEGIN 1 */5 H6 M, c) Y0 u( q" p4 o% V
- BaseType_t xReturn =pdPASS;0 l* y7 T1 c/ F- n2 r. u" P+ s
- /* USER CODE END 1 */, |) w& h3 a$ G- a* m* t3 i
- *+ |+ g, j, ?6 D- t# `
- *8 w7 |+ x: ]. J8 \, k+ u& |3 |% K Y
- /* Infinite loop */
' O5 w; W4 u, N/ G - /* USER CODE BEGIN WHILE */
- h6 P: O2 i* K. M) j6 i; U3 U - xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\7 _6 C- [9 K9 s a
- (const char *)"APPTASKCREATE",\" d5 V! {+ v9 M
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
. b! K7 |: n' H - (TaskHandle_t*)&AppTaskCreate_Handle);+ N% r, t p, h5 N! @8 {
- if(pdPASS==xReturn)+ R# Q9 Q- ]8 I' u$ m. E3 I6 [0 H
- vTaskStartScheduler();
# S6 j4 D" T! }$ a& ` - else
7 ~) U& I' ]4 s2 q - return -1;
6 p$ E8 u: O# S# v: E, N3 y - while (1)) U# }& Z2 {9 @
- {* x: Y9 b/ Q4 c8 n% @# t+ c6 J& {
- /* USER CODE END WHILE */
: I* {, T6 q9 t6 m: y - /* USER CODE BEGIN 3 */
2 K; N2 R) w m* c( v) u! i - }
9 }5 U: x- b: @) g4 H5 [3 d - /* USER CODE END 3 */
: ~6 a1 _- h7 J! T$ Q4 A' X - }" H+ X0 u/ S+ r& Z
- ) y- D+ A, O0 d' M; S( f! m
- *. r8 }/ q1 d0 ]7 J) s
- *6 a; v- p5 S& T0 {# M" S+ ]- X
j- }" E& ]/ e/ ?) Z- /* USER CODE BEGIN 4 */
4 D& D! S* H' p. d; z - /***********: V! c. d9 e1 g4 H0 u1 |$ Y
- *@Function name:SEND_Task
; t% X- X/ b% F$ _# F - *@description:SEND_Task body
! K( e5 l q/ f2 | - *@Parameter:None% Y) a% P' p% S" O, ^/ b5 s6 k5 f
- *@return:None
& L B' k& R6 W8 ]8 d, [ - *************/( P- `, }" X" v0 k& b$ ?8 w, H8 x
- static void Send_Task(void* pvParameters)7 `$ |9 d$ c' t% v+ m
- {
S K5 t5 X/ A f - , [" i8 X: |- h3 z" H
- while(1)
* c$ e3 B1 k3 Z, ~ - { 2 b# ^9 i) E X3 Y
- vTaskDelay(100); //Just to demonstrate task switching.% ?1 k; M; [. C, u( N ]
- }" {5 u {2 U w, P7 N
- }0 m8 ? I/ \* q, V+ N7 s
- $ H5 i0 N* ]3 N/ e5 X" [& [3 ^
- static void AppTaskCreate(void)- I9 a9 G2 O6 r# ^6 A* o5 [
- {
# h, e @8 z+ ^: h - BaseType_t xReturn=pdPASS;$ ?$ _! B4 X: I! W
- taskENTER_CRITICAL();
, Z0 P9 x. _7 r7 M1 S9 k
# E/ W3 P" [! ? p3 f# D8 @- /* Create Timer1 Handle*/! Q U; T. W7 n8 {6 O8 s c
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
% q8 J7 w3 g2 V9 \; x - (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);; J& A4 s% k7 z1 B, ~
- if(NULL!=Timer1)" W* }) P) r' o2 c* C8 f2 ^3 O
- {}
; F- n, Y/ k1 a& n! K/ T7 l - xTimerStart(Timer1,0);
2 G0 R+ y3 C" l2 b - ; r" b7 z7 _# N+ q E/ q
- /*SEND task*/
- J/ h0 L+ U( _ H6 _0 j [8 y - xReturn=xTaskCreate((TaskFunction_t)Send_Task,\ f( ^, g% J" M+ z" ~+ f
- (const char*)"SEND_TASK",\
2 t! \% H, Y' o3 g) D9 c; S* p# z3 q - (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
5 ^$ U$ D* U0 N2 I# g6 K6 ` - (TaskHandle_t*)&Send_Task_Handle);
; Z2 H2 s" c0 K5 @ - if(pdPASS==xReturn)
+ k. W+ b" _+ I - {}
/ a, e: q8 D- @2 W - . M1 { I0 P" E4 d- M4 c
- vTaskDelete(AppTaskCreate_Handle);) D q2 |' Z) Z; a! I
- taskEXIT_CRITICAL();# }& ^$ J4 S- [
- }" Y! n/ r0 B1 L, k
- & ^1 _) J4 C) N1 [& x
- /* USER CODE END 4 */
复制代码 9 Y# j/ `$ |! y9 _
4.3、编译烧录。# v* n0 ?9 n F. ]' t) ?1 n
: F! Z+ S: `' r u7 ^" ?# p! Y% K1 g. @5 i
|