1.准备FreeRTOS源文件
6 Y, c( C. k0 R. T1.1、到freertos.org下载最新版本的源文件,链接地址
9 ~, H7 I2 @+ G- f0 m. @: t/ k4 t/ o# M R/ g+ h7 P, ~
1.2、FreeRTOS 文件结构如下:4 a( S6 s- ]/ |5 S
; K3 o# G8 [1 ]' x' u R
需要用到的是粉色的头文件和翠绿色c文件。
3 @, J7 v+ J0 g( r3 g: ?, F% O% l( ?; m6 Y" p6 g" l
+ ]3 ?) ~ `2 k7 C
: L7 T, S, ]: \+ ^) k% `& N1 u2、使用STM32CubeMX生成初始化代码(BSP_Init)
, c" K: M @( t' x/ K2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
; v2 L$ U$ F! j! d8 R
5 q# {2 L: Q* g. T3 J% z7 h* o2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档* i( b. V2 G/ C: C9 k" l) R
8 F C& B0 Z' K+ k& P3、复制FreeRTOS文件到工程目录中8 h7 }9 K! R! T" L* d, e0 M- @0 k
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹/ H. w3 {$ @9 N+ H& u; p
2 y6 U) e0 s- Q& ?, C& ?7 I
最后看起来目录结构是这样 z4 x/ I- S* ]5 y% S1 _: a
0 [+ a9 H: y( b# L% ^
K0 T9 {# g) a# P+ Q
5 [ Q8 r2 h% N# l; Y( [+FreeRTOS- `1 o! s( C4 @8 f9 H3 I$ g& d
|+include
9 v) s$ s9 X$ L: B) F |+source
5 }; E/ l7 `+ L* |! ?3 p& D- X% z
3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中0 d4 Q3 D. R; `
: y& g' C/ B8 [2 L& a8 t3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中. `) K5 h" |, c6 M! A6 W
. d# F2 j6 }' z r
3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
) u1 @) g) `: {; T2 M" _7 a1 D7 f: R
% l5 y1 K U* m5 e( G0 B8 U3 B9 C* W3 L3.5、新建一个FreeRTOS/source,把所有的c文件添加进去1 a5 U9 S2 @3 f" _/ M! J6 f% i
. J" h) Z: o8 K5 h! p$ E+ j, `$ X3 W
) b3 Z/ M! Z9 T8 ]" \ r1 n- ~( y0 b# U
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run" y5 R$ E' G: E- q/ @' S
, _2 s" e0 M$ x
2 k H! W* I% ]1 Z
& {( p w6 Z3 O9 A3 l' Y( G4、修改代码1 p$ ? j C- d9 M" Q
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
0 z% b$ u8 O4 T2 ~8 k5 L
" y, L# n& G2 W' Y j t7 Q3 I3 W2 A4.2、在main.c添加代码,添加任务' i; R+ o8 R' y
% t1 i/ z6 R- i6 L0 O* h- /* USER CODE BEGIN Includes */
* E9 u& Q" H' Q/ S3 [4 S& I2 T - #include "FreeRTOS.h"
' |/ d. ^* d9 o2 { - #include "task.h"
. ~+ D0 T, H8 P' N: v - #include "queue.h"$ r) j0 n9 Z$ j, b0 J) w
- #include "semphr.h"/ l3 L/ D2 f8 C' G, G
- #include "event_groups.h"' m" K/ ?6 f. j, m
- #include "timers.h"
+ D; \# u t4 I - $ o: ?2 W6 \) u0 O) x3 T
- /* USER CODE END Includes */
S0 M$ _( m5 A: }/ ~ - *
* [' `4 i% M. ]/ q$ i - *
6 Z5 X" J! `+ N3 O5 k$ D7 h - *
1 K1 m7 e% X( \+ L - /* USER CODE BEGIN PV */
" x) V9 f; A/ a+ ?5 n4 t* i/ u4 w - static void Send_Task(void* pvParameters);
, ~7 e, I& n4 G1 w& Q* S - static void Callback_LEDTOGGLE(void* pvParameters);
3 w) q% ~& ^ a K* a7 W2 G
" }' j* U- m8 j- ?& }- static void AppTaskCreate(void);. H: B9 g% D" d9 c( Y
7 @# p1 w r# F# {6 m- % ]. P2 h& t" c( a T3 T: j: y
- /*Task Handle*/
! @ c' P3 U- q1 n0 M0 R - static TaskHandle_t AppTaskCreate_Handle=NULL;
h+ e7 @ L3 o/ F# x- |( t - static TaskHandle_t Send_Task_Handle=NULL; //PRO:3
8 x7 e. U# g8 I) b; ^' m0 g
* [0 ^2 d: [4 K+ p3 G, L
6 N( w) ~) |, x* T& C Q/ {2 o# Z- /*Timer handle*/
. I4 C( z# k8 o, F: H! a4 Y i - static TimerHandle_t Timer1=NULL;
6 ~$ ?6 S! Q6 q% i6 i! x - 5 e: B+ ^, A& ~8 e7 K
- static void Callback_LEDTOGGLE(void* pvParameters)
7 m9 o7 m6 `& P2 [& m8 X9 m3 e- ~ - {
% r" r7 o1 e- R% v. s8 D - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
; @& P. s) e0 Z% Y. p - + F& i+ x/ }& {7 J" x2 x
- }
8 [( e$ G# r7 W; _% | B - /* USER CODE END PV */0 s b% j. c1 Q/ o
- *0 Y! d# {, {. E8 Y3 {
- *
8 Y# o, O' b) `4 j - */ a: n" b& A$ T8 n9 o
- int main(void)
' J5 I% F* {. }1 v: e - {
# E. N& C/ o9 f0 G- {: I - /* USER CODE BEGIN 1 */" m6 v9 @$ o+ ]) S
- BaseType_t xReturn =pdPASS;# [" |/ m9 s w6 \$ }0 X
- /* USER CODE END 1 */# n8 c# C' ?$ L$ \( E
- *
7 _7 e& |( y( Q5 h1 ]' U3 Z - *
# {5 K) E+ ]9 t( {9 f0 {' K2 Q) B% h - /* Infinite loop */
+ Y% ^; U! F7 E8 m- V5 }1 S; \7 ` - /* USER CODE BEGIN WHILE */8 `- s* I s" U7 ]8 m
- xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
) q$ r: s% {7 w. a# l/ }, i - (const char *)"APPTASKCREATE",\
+ {" n8 D( M" u; b4 S& f; Z7 g - (uint16_t)512,(void*)NULL,(UBaseType_t)1,\2 ~, O ?+ H! v$ H3 v
- (TaskHandle_t*)&AppTaskCreate_Handle);* I2 O! B7 Q* W+ j. T! f
- if(pdPASS==xReturn)8 }$ y/ b& K2 n0 `; n
- vTaskStartScheduler();
4 A. W8 \- E- ?/ O& ~8 P - else8 e) Z: i, c5 T/ z5 Z
- return -1;2 s! d# e/ T9 s) h. k+ @% P
- while (1)
9 Z- I# _& Y% G. p - {) Y7 i; O% G Z7 K$ o$ V \
- /* USER CODE END WHILE */. U. K9 D: O2 L: o3 G/ K5 T1 z# f
- /* USER CODE BEGIN 3 */
5 `7 B1 v& @% e0 S5 ~' w( V - }
0 G% ?/ o0 a: l* ~ - /* USER CODE END 3 */
/ q4 J8 F% p1 y5 h r- B - }
- l0 l5 }* f* u/ H, {; A
4 D' _% m* t# U6 }8 M! X( G- *
- }5 Z* g/ u5 t9 l - *
# H7 e1 K% O. G9 S - - v2 b: z9 r! b3 q
- /* USER CODE BEGIN 4 */) k2 X5 p" f' b! g0 W0 C
- /***********
8 h7 [9 O- ^' u# J* g# o& ] - *@Function name:SEND_Task3 f+ K3 t+ U0 J5 T5 `
- *@description:SEND_Task body! _6 D7 Y6 G8 }9 x. R, w
- *@Parameter:None
6 m) b) [# M0 S0 e6 s& N# n ]% u - *@return:None
& V2 b/ H3 v: d' R# k - *************/% _. m% t% }) n0 a% u! c* f. c
- static void Send_Task(void* pvParameters)
B% A5 k. S) `; Y - {$ y$ @2 R3 y3 S, O8 }6 R; x( @
- ) n+ l9 j- ]9 ~# \7 u+ U
- while(1)6 r0 C9 a/ M' \4 K; x( I
- {
% c J3 _. L5 b) g - vTaskDelay(100); //Just to demonstrate task switching.0 @. L" w8 A8 _& f* [
- }9 U0 ]) n& W% T; c3 B2 Q
- }
" R! p8 J& a+ K/ K: W
: u5 X6 _ Z3 O' V. T& v9 H- static void AppTaskCreate(void)
, Y9 r) l3 D" ^% z, s - {
1 x2 n/ T" f. J# b" T1 T; n - BaseType_t xReturn=pdPASS;
" v+ {& j+ h4 R- g - taskENTER_CRITICAL();
' z& v0 K8 Y. V6 q+ L
$ b' }" y- _* f/ J! H' n- /* Create Timer1 Handle*/
. h8 u# T2 {) H - Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\+ B4 m* x/ x- }
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
! b0 h* l. C N* \! x7 h - if(NULL!=Timer1)
" S5 D w$ R: V - {}0 X' A" B) ?# P2 ^4 J
- xTimerStart(Timer1,0);
+ c& }; p/ |( m6 I8 D
: H+ N6 [! `/ i5 t/ S- C; ~- /*SEND task*/
7 {1 b; d4 A/ n: ^ - xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
5 v9 Y/ O) u2 p5 R% c$ e - (const char*)"SEND_TASK",\1 v" ~" k5 @2 ]; U* H. k/ y
- (uint16_t)512,(void*)NULL,(UBaseType_t)3,\- Y- P; p$ `$ I5 k( B: q4 n
- (TaskHandle_t*)&Send_Task_Handle);
' F9 G Q" W) U" w; n, t( G1 u - if(pdPASS==xReturn)
9 _/ |1 I* }) j' S7 S* X' b - {}' ?1 `4 i" G: B) u# V2 Q8 ^
! ]4 H; k! r+ B. b1 i V7 T; R- vTaskDelete(AppTaskCreate_Handle);7 h' u$ I" E3 P. e2 I( @
- taskEXIT_CRITICAL();* D0 ^6 q) t" R% f8 A
- }3 g$ W6 t& |' ]( y( k' |
% O# i4 S! F6 k8 l: V& @# m- /* USER CODE END 4 */
复制代码
2 _' N% o6 r* j+ U1 l! ^4 Z" @4.3、编译烧录。
$ x/ E4 J( D7 s/ n4 Y3 z
4 k' h V2 _% g3 s4 C3 g% ~; d8 C: i2 f0 R
|