1.准备FreeRTOS源文件
- b" e7 W. B: Z3 \$ ~2 O \: N0 d1.1、到freertos.org下载最新版本的源文件,链接地址
8 b2 z4 n( W) m7 q1 R! ]
" U3 g7 n* ?- i4 G# K3 e1 c( B1.2、FreeRTOS 文件结构如下:
2 E# e I0 t0 P( D
7 E4 u& U4 L p% i需要用到的是粉色的头文件和翠绿色c文件。/ {- _9 Q7 r; e! u9 b
4 I% x% x7 S8 Y) S
* L3 a( p' r2 V* Y7 P" b
0 b' m7 S' S% L5 p/ i- D2、使用STM32CubeMX生成初始化代码(BSP_Init)3 J; t; ?4 I, S# t6 t% b+ C( E" h" x7 Y
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)! f' H: p$ g2 Q; q R( l9 L
' P( Q9 n: [5 _- _$ A4 K/ C4 t
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
% f4 c3 z) r6 d7 C' k+ e
& D* A! h9 n9 x3、复制FreeRTOS文件到工程目录中
3 }& Z, H8 R9 f3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
& ~& O3 q* K/ e1 r9 g) z8 L# Z
; s- I w1 c6 u% T+ @0 w0 W最后看起来目录结构是这样
& @2 D( \7 p9 V3 p. b3 Y8 r" p, g& k" p* j# g" k) F r: l
3 w; j; K$ |/ p* \- x
& ?% Y1 G# d0 E) A5 g* S) k+FreeRTOS, I% ?1 |5 i1 }, b$ ^; ?
|+include
0 ~1 I. i5 k! |2 k' ~* u6 l0 L/ w _ |+source+ b5 d! I9 |, y
' g2 R- b8 u4 }; t4 p3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中. i0 i3 `* S) g
2 m- f, V" R# ]0 D
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
$ i+ ^: V- a# ?2 G# Q/ o
\, f9 d& q; s3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程$ i; r5 f- z; v( {+ Q' K r
" A; S" f) H! {9 q% `: g
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去# R* H9 a) U# r3 E* o; n
0 X; \9 j3 U# A% ?6 C1 l" g* k% ]* U
8 L9 I* P3 W0 m. s+ k+ k( e% j' {! F, `+ g, a' P
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"1 c7 q) D) i$ t2 C; D3 Z$ F9 O/ C
4 }* A9 w: \7 |' Y
- L5 F. Z+ J( C( I* a1 T
) [' n+ ]+ @% ?7 R$ x5 q4、修改代码& {* A+ b, C" J. U$ L) T6 E
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
/ {. Z& S. b- v+ I! t% L5 |
% u% t# K8 P. P+ c/ U4.2、在main.c添加代码,添加任务
$ J, U( V" l# W3 C$ Z. y1 ]9 R3 c v. L
- /* USER CODE BEGIN Includes */9 G% ^( ~: w+ l S, F5 }2 O' W
- #include "FreeRTOS.h"+ v( b- b/ G* |: X, E
- #include "task.h"% k1 m) y6 M5 }1 J! h
- #include "queue.h"- j/ m2 _2 [* f8 V8 p& I
- #include "semphr.h". m/ q9 h$ ^9 ]( E" J
- #include "event_groups.h"% u) k9 C I# T) b( ^
- #include "timers.h"
7 @ _- h4 g5 C7 J* H - 9 e- g, Z2 v5 P6 C" d. Y& m! V
- /* USER CODE END Includes */9 Z# M+ M" Q6 t2 D4 W
- *
, x% \7 F, v$ g/ \+ y; f - *. l3 m9 R1 N% K9 O% O' a; a# ~, c
- *
5 ~1 j" O8 N1 K9 u, G# | - /* USER CODE BEGIN PV */
6 M9 k% r! X( R( q - static void Send_Task(void* pvParameters);: ?" c. @& A2 W% s6 G5 e
- static void Callback_LEDTOGGLE(void* pvParameters);2 g+ b$ L7 U7 I9 C/ H$ k) o( x) i
* B/ d h b. U1 K- static void AppTaskCreate(void);: @: K% a1 Z; \
- $ o& ^6 V3 x. i# }/ L4 R8 v
! w( A) E \. d! \" W- /*Task Handle*/
! w/ I/ V8 y0 X/ u6 X - static TaskHandle_t AppTaskCreate_Handle=NULL;& ^" h# E/ U" c
- static TaskHandle_t Send_Task_Handle=NULL; //PRO:3
: n/ i9 g' q3 d9 ]
; ?( @$ f6 ~) h5 z
) N: S2 j- c2 O2 c+ e5 q- /*Timer handle*/& X: G" Y$ V$ N, Z/ B
- static TimerHandle_t Timer1=NULL;
) w9 D5 m$ N! f d! H, w
7 U6 x! y" \+ l, Y5 v2 @7 B% M" Z- static void Callback_LEDTOGGLE(void* pvParameters)
0 C& Z& F; }; d& s4 n+ m. v% E - {
! d: T* n2 N! K( K - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);9 Z! t2 r8 W- h/ H; ?, a
2 b; q0 c+ j- E& y. L- }& W1 ^6 V! }' n, O
- /* USER CODE END PV */- M5 \- X0 a( ?% |- Z) }9 I# f4 G4 B
- *
: \5 p T% U" V+ g( S - *
0 g9 z6 u' d* ]5 R& I5 f$ J - *
l9 l" u. H( }8 ?$ z9 A - int main(void)
+ d2 V7 @( O }; V - {
* e% s, H S7 i1 t4 e! B6 V' a, z0 _ - /* USER CODE BEGIN 1 */
' Y1 W# p! x0 T) m - BaseType_t xReturn =pdPASS;
- J/ s3 I9 b6 R4 U - /* USER CODE END 1 */* k \% f- @0 ?! G! f
- *
`1 C; m+ ^; f - *
0 y3 _' ?: R; w! x: O9 f - /* Infinite loop */) v% g3 s: t o% ^, }
- /* USER CODE BEGIN WHILE */
k9 B; Y# c( e2 w U3 d' ^* I - xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\- e; T& I- \' t% m5 T4 _: ^ t7 m
- (const char *)"APPTASKCREATE",\9 V/ B$ w. X7 r3 h( a' k( e3 B
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\/ e: l& _7 i" Z% e1 h6 }5 J
- (TaskHandle_t*)&AppTaskCreate_Handle);
; }( P: t+ X6 i9 o5 j0 Y - if(pdPASS==xReturn)5 b5 Q9 d$ M8 q( U3 |. e
- vTaskStartScheduler();! C9 |; j9 b5 ]$ h; c# T) v
- else
- w( v6 L. M, p7 p/ B - return -1;
, g5 w: ?; H0 v8 R4 P" F( h - while (1)
. h; w: e4 E, I - {; g% ^$ a+ o6 ~5 K1 I# d) r: Z
- /* USER CODE END WHILE */
- O/ | M9 i7 Y, X - /* USER CODE BEGIN 3 */1 `. |8 a' z z; a
- }5 q4 H! H6 } i- |8 ?( v
- /* USER CODE END 3 */
7 R Y, d1 k7 A8 I- E - }
5 V1 f8 C6 f6 @2 b4 K. G& u8 ]4 Q - ; X) ~; I7 `) [+ L5 e. O) |. D
- *
% N7 }( B/ F7 ~ o! o6 e% l' T - *) M; I! j+ @; B* a& G* H# U5 U
- A( [! n2 `/ t% f9 e
- /* USER CODE BEGIN 4 */" H! B' R6 ^0 y7 @7 r, ^" v
- /***********5 ?0 ^& P3 t- L$ f
- *@Function name:SEND_Task t# n7 V" q6 f: j
- *@description:SEND_Task body6 b; o/ I4 {# x' P) W/ K# ]
- *@Parameter:None8 X% d) {- Z [3 [/ {3 ?
- *@return:None+ d0 W% m8 g8 j# f' m0 D+ X
- *************/; o* ]) v( J9 l" D9 R# w+ g& y
- static void Send_Task(void* pvParameters): J C4 g2 `! x3 b! }
- {$ \$ r0 E3 O/ a$ ~( m
- 8 m1 }! {6 h( S9 |
- while(1)
; ]0 G5 k( ?0 s/ H" @; o - {
5 z& J0 ]! J, X4 a" j% S5 v- a - vTaskDelay(100); //Just to demonstrate task switching.
$ o! W/ s) P! j3 w+ ^; w5 A - } f' r- [% i; u, }) D9 w4 k) ~
- }1 P# g: {; ^- a
- - ~" b! D1 u1 [5 R. N) r
- static void AppTaskCreate(void)! X2 t$ U4 s" G5 O8 b
- {
" U7 I7 a8 d4 v9 ]# s0 v - BaseType_t xReturn=pdPASS;
. T O1 C! b# o7 W/ X5 n& ] - taskENTER_CRITICAL();1 D$ u0 q/ d1 J6 T6 a1 U
G, Q/ B# {" h/ m4 B- /* Create Timer1 Handle*/7 p/ h7 d% p J Z% w1 F
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\$ ^8 O2 O0 s6 f7 v2 |5 A# C/ n/ _$ q
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);, q2 ]& D) J7 K) P
- if(NULL!=Timer1)% |6 q5 ?9 e1 t
- {}3 J5 ~ O' U$ e1 j2 N r
- xTimerStart(Timer1,0);8 c) L0 ^/ ^' e& S' g
- & F: @. J: ^3 J; b
- /*SEND task*/
) E y: m& Z) c: \: u$ P" [ - xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
d& N- B' Z, V - (const char*)"SEND_TASK",\
2 e0 q1 b( U) n, |# G3 [# c - (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
) Y4 C$ r; j) L8 ~ - (TaskHandle_t*)&Send_Task_Handle); P4 M8 g) v* r
- if(pdPASS==xReturn)
& d! i8 }& d2 M4 N( b - {}8 S ^/ j1 \+ U: \
- # }5 ?! s* L) m; E; @6 q
- vTaskDelete(AppTaskCreate_Handle);
' X3 k) x8 _* | - taskEXIT_CRITICAL();1 J" e G/ w g4 F
- }) Z5 h A8 s" @5 T
- $ e0 L0 ?" z' a' F* L+ m
- /* USER CODE END 4 */
复制代码 ) k& F4 o+ J _3 O; X
4.3、编译烧录。
" s+ b+ S$ D1 w2 u* e5 V! z
$ Y5 Z4 _) q# e* b/ Z/ `
4 P. G9 B% t/ R- U9 L" } |