1.准备FreeRTOS源文件
1 F% v) h2 q5 S* b1.1、到freertos.org下载最新版本的源文件,链接地址& X" k3 ~. C0 ?9 P
( l1 q; Z+ a3 e/ L1.2、FreeRTOS 文件结构如下:9 p8 ], O F3 |+ D
! J, c, t2 _. C% Q* D- N4 e8 J1 j
需要用到的是粉色的头文件和翠绿色c文件。8 }" V, B3 D E5 A; b5 z
) x V- Q% ~2 F* @4 E3 m
$ R2 z4 a+ a4 B% e( ?( W8 _% } j3 @( R( S. t
2、使用STM32CubeMX生成初始化代码(BSP_Init)
7 }, Z1 S" ^, N! H+ X2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)3 y6 g! T+ h0 s0 d6 ~
" [! R, O8 Y. F' {6 T
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
* f& z" c8 Y# b, w1 A$ l# O8 J! g% K" s$ d0 r
3、复制FreeRTOS文件到工程目录中! r: s! k0 u0 N* L" ~! s
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹" U; }9 t5 F* y
" O# L- i2 A. L* ^
最后看起来目录结构是这样) O( s) g1 S" M H- b X( B
# `; U& J: B9 Y6 Q( C+ G8 s+ B- r+ A) k1 J) U
3 |% R3 `/ w; T8 Q" L- X9 A- a+FreeRTOS
. N/ o: a6 j6 j# `& |, R |+include7 M: m2 J2 f8 ]* r+ a" ^* d
|+source/ s- g- N: |- k
# {% P. ?0 ^( v s- H$ U2 g3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中2 U$ U& b* f6 |( Y
1 D( |% p$ }* a: j/ A7 u$ y
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中 E# `0 H7 D# Y5 ?
4 I1 I9 I# g2 Y# |6 s3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
- H: H% w# F! e" r* v7 R) P+ I' ~% j. U7 a, {* u/ m
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去
2 C; ~* C5 Z+ F& f* z, k1 V0 Z
; |9 Y+ r8 f. Z' L+ ~ M8 B' a2 b6 T2 w3 ]8 M: P4 X
- m3 u& @: ?: f# S
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"
9 {4 @7 k) Y; n
. e' N& Y+ ]& T' p
0 r" N8 G' K- q
! z0 U( C6 }% u+ f g. G4、修改代码4 `4 R" K/ D: b. o j6 Y
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
) u" K6 x \% X) p$ X: O+ ^3 ?) y* d/ |0 Q. b
4.2、在main.c添加代码,添加任务8 S% x" s+ _4 b- h6 S+ k$ p
, F4 `0 C* ], @- /* USER CODE BEGIN Includes */
) ^" E- H |; l& ]3 j - #include "FreeRTOS.h"
1 v' b9 ^% A& n! }1 ^ - #include "task.h"% E5 l! S- Q/ `2 e+ u
- #include "queue.h"$ I0 e ]% P4 {. p9 y
- #include "semphr.h"
* N: y, R5 o, F8 Q- c - #include "event_groups.h"
6 x: V- ?! K. M4 d+ \ - #include "timers.h"
$ p) G: P4 ~$ Y5 _- l' K - 1 }' G% G5 P" [ Z; w
- /* USER CODE END Includes */& |: U U; x" M/ e8 R/ d5 h
- *6 |9 }% ]( Q2 {6 k( d
- *) t/ ^! o& I& P9 ]- Z
- *
# T6 L: W/ M' n7 M - /* USER CODE BEGIN PV */7 U, K- x+ a0 z' F1 Q& z' g
- static void Send_Task(void* pvParameters);
. y. g3 L# g5 e2 @4 a; b - static void Callback_LEDTOGGLE(void* pvParameters);( P9 i; b$ k! v4 S \7 J0 K- j9 r8 Z
# f/ K! K( l7 G1 J0 W- static void AppTaskCreate(void);. _- e' p5 S v
/ ?/ c) W0 `" U2 e+ l
5 Q* s: N! K, v# G- z6 q Y/ l- /*Task Handle*/
& ]7 p: c5 T( | [" ?, ]2 \ - static TaskHandle_t AppTaskCreate_Handle=NULL;- q6 a% ?7 o: j0 [: A" e
- static TaskHandle_t Send_Task_Handle=NULL; //PRO:3/ {1 A& r' f: S/ q, Y+ w2 R: D
?9 J# a: S/ p. m- 7 t, q! K) Y0 X
- /*Timer handle*/
, k$ w6 ]- C, X - static TimerHandle_t Timer1=NULL;$ p$ A% d8 y* y e y! `8 c
0 g5 f; v9 p) n& |! o8 r- static void Callback_LEDTOGGLE(void* pvParameters)
( d* L4 Z& C5 a; v$ q U! T - {; f9 Y2 w. \( m) M
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);& X& {4 X ^& p: I
- 8 H! P9 ?. p& e! Z( C; m
- }4 z8 v& S7 }, U# y
- /* USER CODE END PV */
: _, V- a/ f" ~ - *, r3 p* S! U+ x" _, J
- *0 l! p* e F5 f U
- *
6 ]" h$ i6 h) o% Q# j - int main(void)
! \& D2 f* _4 T6 l0 l) Z9 h - {
7 O# N) P9 A5 c1 A% r! \2 m - /* USER CODE BEGIN 1 */
~$ @9 Y G3 c& O( S. Q - BaseType_t xReturn =pdPASS;* c7 K9 L3 A/ y( K- O
- /* USER CODE END 1 */7 y L9 ?" u9 P. }; R- Q( D- l* q7 ^* A
- *1 `0 |0 l4 B' w! j- [6 w
- *
% k! K& \" b" V( _1 e, k: G - /* Infinite loop */+ ^% l) E9 u, O1 G, Z% D
- /* USER CODE BEGIN WHILE */6 G( T N; E1 s1 B& v
- xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\" q' W" K# [1 c/ H* v* i; w
- (const char *)"APPTASKCREATE",\
$ b2 X( A1 z3 J& w# { - (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
1 x5 H2 M6 S& I0 M& @4 w" r# p - (TaskHandle_t*)&AppTaskCreate_Handle);) S$ h+ H7 [4 ?( n
- if(pdPASS==xReturn)
3 G% y! M/ w$ }4 @/ X - vTaskStartScheduler();
/ k6 x2 `. W% I. B* u8 g - else% ? E4 L! e, A2 d0 ]
- return -1;
: y5 |% A+ q, \9 O) S$ l9 O; R: `) t - while (1), s# t: ^/ J3 _4 O2 d5 F
- {) z7 ^- p# w( b6 p8 J; G# u
- /* USER CODE END WHILE */7 O4 v" _ A& N \2 l
- /* USER CODE BEGIN 3 */
$ n i. _* N; ~& J - }
/ g4 h: p; v6 q% I - /* USER CODE END 3 */+ g- X8 l- n: S3 w+ H e9 W
- }! X6 g, R9 q+ Z" d$ x/ m i' v
- 6 Q' M/ H. f- A7 j
- *3 a* z0 a9 s7 F0 E& o0 |# l
- *
4 W3 C2 D: x( l" x) x* V) Y
3 |6 k/ D) Q; Q. a0 A- /* USER CODE BEGIN 4 */
. g8 A v7 ^- o. z8 q$ [) S ? - /***********
6 ^& ^) x* p$ s; Y - *@Function name:SEND_Task
+ I5 X' m' }, |2 j1 J - *@description:SEND_Task body" o* y* H1 ~1 J2 d% n! s
- *@Parameter:None
7 j/ v& U( G" X/ \& L - *@return:None0 N6 T) M' G1 H5 M. P# [
- *************/2 {5 T; h7 r# r' X- n& _
- static void Send_Task(void* pvParameters)) A" O v- U9 { o' s, d
- {# F. G I7 h3 ^8 r' V
- 7 h5 [- B4 y5 @
- while(1)
' X8 B% \4 ]5 e - {
9 a( b# S. U: a7 a c - vTaskDelay(100); //Just to demonstrate task switching.$ \) M4 _7 }. R1 x. S. Q
- }8 r( G$ { T, N2 m
- }
9 d* E/ {2 U) {
$ p+ O" I) s$ Z! n7 y- static void AppTaskCreate(void)
" ^6 _# F8 t, F0 _5 O& A5 E - {
( {0 N2 j- ~' D' }4 h - BaseType_t xReturn=pdPASS; o8 e3 T4 L* Z- `% h5 P
- taskENTER_CRITICAL();6 F: j+ L( v+ V4 A l7 f
- 5 P/ ?( d( o; H( H* v' z9 z8 U
- /* Create Timer1 Handle*/. w) P1 t. \1 A% H
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\+ H% r/ g8 _- [; b, J; m6 C
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);5 r0 @7 ]7 }9 W' N9 I: m
- if(NULL!=Timer1)+ \/ G: {$ o/ A9 d0 T! N
- {}
3 U4 R" n/ R: B+ l - xTimerStart(Timer1,0);
% [2 ]" ^& M, B( o - ) E( X& N8 C* F }1 I
- /*SEND task*/) w+ ]) N8 B6 l* O8 y+ @
- xReturn=xTaskCreate((TaskFunction_t)Send_Task,\+ V3 _$ k- ^7 Q8 c, ]- y. D
- (const char*)"SEND_TASK",\
3 R$ y) q5 N0 M0 J& n2 P - (uint16_t)512,(void*)NULL,(UBaseType_t)3,\( {/ g, Q' l/ I* m8 @6 _# o
- (TaskHandle_t*)&Send_Task_Handle);
& M0 `' U4 i3 t4 \4 Z; y - if(pdPASS==xReturn)9 u; c! k0 x0 k x' ]: E) `
- {}
/ R$ j0 q7 J5 G4 _" E. m& d- S# _
/ [$ B. a# \+ K- d) h+ G+ ^" ?/ ?" X- vTaskDelete(AppTaskCreate_Handle);
! `; \2 U% g' k, x - taskEXIT_CRITICAL(); R2 v3 q2 P1 M- k, c; Y7 @8 S2 @; _
- }+ U1 O i, B( q# H! t
5 y# V7 j% w9 F; `9 `9 b- /* USER CODE END 4 */
复制代码 ! W! h. l+ P0 L/ }! G& V
4.3、编译烧录。. ? K/ P. n9 X0 d
1 m9 q8 _7 D. G3 k) X) k! \
* E3 [6 B& ^! I1 K+ d. S6 { |