1.准备FreeRTOS源文件
* g o. ~% N2 Z+ F$ B3 W1.1、到freertos.org下载最新版本的源文件,链接地址
8 _. K v% Y# p. b9 B$ K; S2 w8 V1 \ t
7 w. s8 ], h$ P/ n% F6 X; }( h1.2、FreeRTOS 文件结构如下:$ d; p+ [' U% u# `
3 }1 _8 w" r! F+ O2 X8 e需要用到的是粉色的头文件和翠绿色c文件。9 P) y/ g! @3 k1 B5 E+ M3 l
9 b6 a$ ]0 h0 w
; E$ o, W3 N* }6 \: N+ _6 F6 d' Z4 n3 A/ Q
2、使用STM32CubeMX生成初始化代码(BSP_Init)+ B6 `# \, ^4 @
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
9 x; ~* Z9 n) u" g4 J/ d
|1 k# Q, n: \; m2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
' u3 y/ y0 m( x$ R- R
% s* b+ q4 O* \$ `3、复制FreeRTOS文件到工程目录中
' q5 ^3 s [2 N' P* B- \3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
$ T* _' k7 \( P6 l. P% H/ p/ u& r; l8 W6 e: X! f8 i% D t
最后看起来目录结构是这样! T0 F) R* x7 s
) s0 z0 O! v8 g" v# h- g1 Y$ e
) R/ u T8 t( M4 Z; R- w/ d# z+ a) e; r9 R+ d" r# h- k
+FreeRTOS! z1 [. \* `1 F" Y7 b6 m3 y
|+include* z3 T: { U8 b2 L) n; ~5 p
|+source
8 x! e7 v2 ~. z- t: ^5 Y4 \8 R4 A
P) r- p# b$ F* U2 \7 L7 m0 ^3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
9 I* c& h! z7 v* k/ l8 b* }5 Q) z0 D3 q9 a" i
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中; X, D X" u( _, M3 `2 j
% a% ~( v: U' I, M3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程
0 t! n" a- w/ U- r9 o) P
% j+ w: `: U, x3.5、新建一个FreeRTOS/source,把所有的c文件添加进去
3 w [ _, W) |/ t0 x; c
/ P/ b5 Y# j% [; Q9 e3 J, Q
* y$ h# U9 M( q, f" e: b
4 E) k6 L1 ~. q; O3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"
1 b2 x9 C: @) q* g6 b) J. }' W( r! C& ]& {
. [' s! V7 y* c* h, W- W- Y1 @ ^
0 I7 S- `" j) v0 n$ d, G, h- G4、修改代码, z/ _3 t" ?- o5 o1 o1 N- k
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次9 z# _7 \; j6 x& m( u" s$ l
4 e! O' u' F1 q) N3 T
4.2、在main.c添加代码,添加任务$ i& _+ P. g: y! U
9 \4 ^) p0 A5 ~# u- /* USER CODE BEGIN Includes */
: [0 Q. f' t( i1 r - #include "FreeRTOS.h"
) Z" K& p j% e% S8 G/ t - #include "task.h"/ v5 r9 w. e* E
- #include "queue.h"
) F" g' @' \2 \) g - #include "semphr.h"/ l# h" W: X3 Q1 b
- #include "event_groups.h"9 A2 d8 f" z: x% }. s
- #include "timers.h"# I4 Q/ c: Q! |$ l! m0 r$ V, F
- % P, c! J6 z& J: I
- /* USER CODE END Includes */
* s% D7 s! K) Q- u# X! W - *
/ Y' W% j" D/ m/ C4 f0 w P - *
" @* y4 ?" B% j; c* i - *
7 i$ b. y1 e4 E2 V2 L - /* USER CODE BEGIN PV */
; T1 s! d9 C5 A& v/ m/ S: `! Q - static void Send_Task(void* pvParameters);( ^5 Q* S7 g) [) g$ ~
- static void Callback_LEDTOGGLE(void* pvParameters);. T2 Q" S% S' ?: p' O$ t. i
- % N( o5 R8 H# u) V3 d6 _
- static void AppTaskCreate(void);
, L+ K. h' y! S- Q$ I; q - # X: {/ ]4 K8 g I
- 2 j, E3 J! W* z% G* N( l4 v
- /*Task Handle*/ x; x: D! j3 h& v$ C2 Z" \2 a6 P
- static TaskHandle_t AppTaskCreate_Handle=NULL;
9 e9 b$ r' F0 j6 t3 `( e+ x& `! Y - static TaskHandle_t Send_Task_Handle=NULL; //PRO:38 }& x4 I( v b; v. E+ e/ Z; r- v
# D" b- _+ U- E3 V- : w) D# ^( @2 n$ s. o' j
- /*Timer handle*/
1 h1 @+ A" C& l% s$ j$ E) Q+ j - static TimerHandle_t Timer1=NULL;
) J' a/ o. S! f' M - . Q7 H& Z8 i2 F: D
- static void Callback_LEDTOGGLE(void* pvParameters)5 B! v, [! F2 ~( Z `
- {9 {+ b c+ e g& r) v3 u: S
- HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
. B6 z0 [2 ^( P) L9 K
7 M$ O. D8 k( X8 Q9 s- }& k/ D2 S9 J; a9 a) g$ _! }
- /* USER CODE END PV */
( ]# H- |; Q* g. t) W - *% p1 K) z9 P4 i' {" E! L. c
- *5 g; F- n* c, e0 m) W1 `
- * o- S' g9 v1 }; Y- v
- int main(void)! c( \" j; s# H+ L) y0 x I0 }
- {
6 B& W, \* X4 ^# |8 p) G% j - /* USER CODE BEGIN 1 */! a l k- J0 {3 {
- BaseType_t xReturn =pdPASS;
+ B( k; j. C8 V - /* USER CODE END 1 */2 E! c/ ^8 e5 S1 E
- ** Q6 q; g) v" y I
- *( g! P2 o9 c0 r- J; Z. P9 f
- /* Infinite loop */' \1 D# t/ C, Y4 f
- /* USER CODE BEGIN WHILE */- x) t9 t0 C! R3 Y' L9 D
- xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\2 d% O8 p, x K: M
- (const char *)"APPTASKCREATE",\
8 Q3 P3 o1 N9 z; \0 X1 s - (uint16_t)512,(void*)NULL,(UBaseType_t)1,\$ [ g& S1 j$ g
- (TaskHandle_t*)&AppTaskCreate_Handle);
! D( J+ H' r7 R2 s5 G - if(pdPASS==xReturn)
" I) c% v J( v; h7 B, Y/ w" H! A6 ] - vTaskStartScheduler();/ l# C" ^2 `$ Y& Q# N
- else
/ W: P9 B$ z @! [4 a - return -1;
6 [# G3 U4 n) J - while (1)
& ]9 D( {4 J+ Z1 Y1 [+ n - { Z2 Z( P7 U; k0 n- C
- /* USER CODE END WHILE */
7 {2 V) ^& K& \ - /* USER CODE BEGIN 3 */
- O2 o+ Z) `7 h - }
& y5 t! k6 X5 l3 ]' V - /* USER CODE END 3 */
2 O0 P1 o0 k/ k2 z" L* p/ T - }2 L+ Y, u9 t4 D+ `" T n$ P/ L, ~
- / {$ u8 [3 ~+ [( \
- *! w- R. g0 C+ u+ D9 L
- *
, p% q5 ]7 w+ j/ j& R3 @ ?+ D9 R* A - / W' {- _7 n8 r( Y& z
- /* USER CODE BEGIN 4 */
' h0 G, u+ z2 f/ y; B - /***********
, H" W+ k/ p0 d+ [ - *@Function name:SEND_Task1 |8 E" N0 N! ?# n0 f% `; `
- *@description:SEND_Task body- U, F9 X" p- w/ {& `4 l' u( m
- *@Parameter:None0 v- \) D2 ?+ d
- *@return:None
7 R0 ~( u- f5 r5 @" g/ x+ Y - *************/
/ Q5 O0 p! r: w' w - static void Send_Task(void* pvParameters)1 T9 n% X# o: G6 T+ S1 }3 Y% a
- {
. V' N: G8 \: n H! T' M - , B/ ]0 T# w5 Z" a: H# D: g
- while(1)
q, a" G% ]8 E7 D - { 6 A5 w/ r6 Q8 J6 \: N) r
- vTaskDelay(100); //Just to demonstrate task switching.- F3 c, `" b0 R% S2 W
- }
' E3 f8 z# }" d& A$ O! ~" U5 d! m - }0 G. q7 o* l% X! \; Z, z+ W
9 ]9 t* E6 w. ? Z7 @: |2 l/ e, w- static void AppTaskCreate(void)
w8 X8 y5 Q3 E0 U( j! A - {$ y. c* a( R! K- n* }7 V z4 S, g
- BaseType_t xReturn=pdPASS;9 P2 o# f2 F0 n+ Y% J0 Q
- taskENTER_CRITICAL();
3 W/ J% m2 C, e6 t0 _. W0 O - ; H% O/ y/ A! a# [. a o
- /* Create Timer1 Handle*/' h9 \0 i' _/ B2 y
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\4 q, |8 _0 s$ N( f8 g
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);, X3 }( { H) n& u. n+ c3 k
- if(NULL!=Timer1)/ {9 t/ [" j. T. W8 ]2 E
- {}
$ C M2 I B/ X; i8 M) \ - xTimerStart(Timer1,0);
& t: x# H; \: f# ^ ^! _ - : {. j# D5 H9 \+ S' Z
- /*SEND task*/+ _/ u! V& @. K8 h- z
- xReturn=xTaskCreate((TaskFunction_t)Send_Task,\' ~1 q( l2 f/ C0 U7 g' }
- (const char*)"SEND_TASK",\! K! a. X; q; B5 m1 R; y! S
- (uint16_t)512,(void*)NULL,(UBaseType_t)3,\( M* ^; `/ W# f- G0 U$ v; \' w Q
- (TaskHandle_t*)&Send_Task_Handle);+ D a- Y! Q# I4 T, v+ v1 c
- if(pdPASS==xReturn)
. \# s% C, U$ U- m - {}0 E$ A: S5 D @: d$ v
' \/ ^( U. d) a- vTaskDelete(AppTaskCreate_Handle);
* p/ X; U4 L% c* u; S - taskEXIT_CRITICAL();
+ A- V2 v | E4 A - }. _1 C7 n* c% u; m% Y" E0 l
- 2 U' E5 U) `! A: v2 p) Y
- /* USER CODE END 4 */
复制代码 # k! o. \, v. X; B- x
4.3、编译烧录。
" J& C* _$ j) Q) Z$ s, z$ m' o5 h, {3 X; L9 n; e, w1 [
; t5 T+ l" h& m) s4 M- e
|