1.准备FreeRTOS源文件
" t3 _5 f* m Y8 b4 q- y6 a1.1、到freertos.org下载最新版本的源文件,链接地址
+ q& S1 `/ c$ ]3 @6 e# L
5 _6 b& H; J) I* @! D+ u! [* r1.2、FreeRTOS 文件结构如下:
8 k7 [) |" b1 }; N( o3 l' m$ S
/ W; w! g( M! ~; V6 n( D( n1 B需要用到的是粉色的头文件和翠绿色c文件。! M3 { ]8 g6 b. @ Z
/ U1 X" C! k/ n2 k z
& z* {" |& C2 |7 a8 W) K' z, o
, u5 D K$ E& R. x" o8 b! W2、使用STM32CubeMX生成初始化代码(BSP_Init)4 C6 z' x4 M) f, f/ D3 I
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)! O ^- w5 ?+ _7 a6 W) m k/ f7 Q
) g; n1 D6 j) i: X0 u# o0 }% A) B! K
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档$ q, L. n" Y, i% O1 }4 I; N
7 ~7 Q9 J, b# b: v a
3、复制FreeRTOS文件到工程目录中
7 A2 w9 b0 u* y9 U/ h/ G5 L3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹
% `; Y; I5 |% n) p n! d7 ^7 U7 ]% Z
最后看起来目录结构是这样& F2 ]! \, D- a( c( L
T) a! o( i0 _% U; q5 t6 x: c; z+ Z- i
! J& V' \2 Z% H$ ~+ p$ ?: n
+FreeRTOS
( `% d7 ?# Q5 |0 t3 K; | |+include1 S$ o4 ]! l# O) k. R4 N, |1 a
|+source
6 g! }. Y) e1 j1 y8 y( J
, V3 z; b z. d L3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中& k+ N2 B6 k6 @
1 h2 p5 D) `- c
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
$ m! ` t4 X5 G1 [
- a- q W; o' ?6 B2 Q- f) {3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程' f6 e0 H V: d
% X- S: b8 W, D1 M$ q( y+ H3.5、新建一个FreeRTOS/source,把所有的c文件添加进去, K' x }5 G( H+ z3 {$ b* f6 y
4 l9 D7 e; y; c3 m9 q
, e4 M6 z3 b8 f: d2 m
% n+ q1 q0 u+ w/ Z0 P0 W" @6 s3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"+ O9 T6 Q3 y) @/ s/ Y
, J1 K6 _" k% Z7 ]+ s: d3 @
3 {) u" z# `0 i" v/ G4 n4 A5 @: w# O9 v& Y' `' g
4、修改代码
3 e0 \0 z, }3 d. W, v# M/ ]4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次; \' c% m% X- b" ?0 w
; P$ o* |4 ^2 x7 a/ Z. ]4.2、在main.c添加代码,添加任务" H" @( k! ^+ f& d, o
. h& R: D( T% U" q8 ?& l; W- /* USER CODE BEGIN Includes */
8 T, m% D9 k4 _, X, h - #include "FreeRTOS.h"
1 _! H& y* M; s$ p - #include "task.h"; A% `/ T+ I" q& u/ _: m
- #include "queue.h"; x, {8 j5 l, Y& {4 c+ \0 c+ w
- #include "semphr.h"
& _" J& C9 y1 ~$ @$ e6 [ - #include "event_groups.h"6 |2 q/ @5 W5 F3 W
- #include "timers.h"
% @* f, D8 x3 }, a/ q& N: p
* }2 g8 |+ h5 c: t- /* USER CODE END Includes */
9 _& Q" k9 q. E* J: d. h6 p) E - *$ T& I5 k. F( h+ _6 h7 Y
- *" x9 N( C" v1 ]6 ~+ _. n/ G, x
- *
$ l( g! n( p2 L, { - /* USER CODE BEGIN PV */
# a1 a$ s# M5 D( |, R - static void Send_Task(void* pvParameters);
8 S- L% G/ C, ~; ^6 d! A - static void Callback_LEDTOGGLE(void* pvParameters);# S+ ]+ Z2 |7 g; C" T9 Y
/ d: A2 G1 ^! Q6 m; { @- static void AppTaskCreate(void);! i9 H+ a3 x# H) g g5 K" O3 T
! |! f" }( v$ i' e* I6 t
- P, S: J% b! r9 o- /*Task Handle*/7 M' U: W1 r! O+ K2 P
- static TaskHandle_t AppTaskCreate_Handle=NULL;
8 g" Z, x" ]$ F0 m- X; U) U/ A' G - static TaskHandle_t Send_Task_Handle=NULL; //PRO:3
+ f) F& C! T" z) i. X2 A - ( y# n0 e+ m3 _( v) ~. t: D! o
f1 a( B" b) B- Q& M! m- /*Timer handle*/, X. g, u8 m$ O
- static TimerHandle_t Timer1=NULL;
5 h$ o; I1 b" V
% S/ c' G( |$ p8 C- e- static void Callback_LEDTOGGLE(void* pvParameters)
% S. t' s2 I1 R+ U9 U - {
7 x. y1 I7 x' G' g/ O3 R3 ?9 r8 Q$ j - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
( B3 U; S4 n, }" [. t
5 O( `' d k# J- }7 |- m* Q3 Q2 j2 f& r2 O( Q
- /* USER CODE END PV */) S4 f8 I, v: w
- *
9 v; g; p: z7 e7 ?. D1 b$ y - *# G+ I9 m. V' {# ]& c% [/ j% z
- *, O! D( @( n: Q6 H. b |: H
- int main(void). G+ z, Q7 j3 s4 I/ Y) ~0 J( Y
- {! o; a8 K( f c% G' u+ T
- /* USER CODE BEGIN 1 */4 i0 q; @, K& \) g8 Y% H
- BaseType_t xReturn =pdPASS; P9 H" ?* y p( o
- /* USER CODE END 1 */. S3 r( Z: u- G/ G4 }) v4 r$ z
- *7 q! s( T0 v; b u: n4 ?' y- F
- * e6 M/ x. A& \6 p0 N& F( J3 d8 w
- /* Infinite loop */
/ m" I$ M6 X- S9 p' u - /* USER CODE BEGIN WHILE */
3 i) ?5 _" l1 j9 s! T - xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\
: T7 [- }0 Z: ~. k2 n) L( i+ X3 N - (const char *)"APPTASKCREATE",\* q: l" g4 y J9 o
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\. n$ v) M! d! y h
- (TaskHandle_t*)&AppTaskCreate_Handle);
% F: h$ d) Y6 Z3 \ - if(pdPASS==xReturn)7 b l0 g, @. d. L5 @
- vTaskStartScheduler();9 I, `- Y+ M# H3 `# l5 E5 P
- else' K2 i: F- U0 Y# D
- return -1;( }' l' W% [1 f. a* q* J/ K* w1 w
- while (1)
6 \2 E! x" K9 N1 }, E' e7 l - {
& _( s9 q3 S8 v0 y8 a - /* USER CODE END WHILE */
, @9 r( a m+ n0 Z9 a - /* USER CODE BEGIN 3 */# {. i" u! b0 N4 ~& k( C
- }4 I' D& F5 Y* p) z2 B
- /* USER CODE END 3 */ I q6 ]+ F' j" _
- }
3 B @% I) ^+ J! E8 ^+ @; w- g
v0 F3 i8 x" }3 V4 x- * g7 ^5 e b% P9 O- M
- *
2 X6 g/ @; j6 t* m, \
, r W. V( x, O# j) W3 K9 N, p- /* USER CODE BEGIN 4 */% ]! B; X5 L8 ^& y1 ~$ }! v
- /***********2 }! J% q9 b% h; f& q% z' \$ W
- *@Function name:SEND_Task: r, {3 d1 w0 q* a9 A
- *@description:SEND_Task body
: j1 T# `0 [9 }) l5 T - *@Parameter:None1 E$ g0 C" t/ ]- W8 j
- *@return:None
7 g/ H( K9 }, h# Q: p - *************/
, P8 \# {: A2 r9 a - static void Send_Task(void* pvParameters)
6 C0 [" ]4 ?0 e& ?% @* A - {& i( i( m+ s1 z4 e: }; H* w. B
- 3 {* F# Q+ p' K( [) H# ?4 m) ?
- while(1)5 h) P+ K* s' C; h( V: |5 O* D
- {
' `& k1 e$ k7 d8 a+ v - vTaskDelay(100); //Just to demonstrate task switching.
6 |( s8 I- R" N( ~1 p7 L4 y - }. X; j9 k |" A) B
- }
" M4 z' Z1 T( {$ P$ A1 w& l) G
! O r# h( n4 n! i" G& R) Q1 `0 L- static void AppTaskCreate(void)$ B, B5 e1 Y) ^, a* v& L0 E
- {
$ D; d% W; P9 \9 g1 b - BaseType_t xReturn=pdPASS;
( C- q6 A8 R1 P2 W6 S - taskENTER_CRITICAL();
) m7 B4 P y8 G* h - 1 z# ]& ^1 [8 d4 n6 S; H: ?6 j
- /* Create Timer1 Handle*/ \' [& D2 s/ T6 f% C
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\% w( v! T$ E4 m
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);
L/ `' O1 }" ]0 ?0 [. R - if(NULL!=Timer1)
1 W. @! C7 x$ l7 @6 j - {}
+ U( j$ H5 z. e4 M& Y* ? - xTimerStart(Timer1,0);
; L P2 Q& F& ^& K* ^+ ` - " f9 u# I6 t7 {. f$ M1 p0 c
- /*SEND task*/$ C+ M/ M+ S* I; Y# d; N
- xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
9 K/ L, A5 [) D$ j4 D$ L+ d; K - (const char*)"SEND_TASK",\
1 o$ w. {& ~ R8 Z& n: C - (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
# H7 c5 [: n+ [$ ?- V* E9 y - (TaskHandle_t*)&Send_Task_Handle);7 b, l0 ^6 O( \2 ^$ H4 ^7 t
- if(pdPASS==xReturn)3 o# u" [& E' G. Q) m+ D
- {}# e: l! u# E( D$ @5 L
) I% |' O5 U+ F- i1 x/ V( i& A# K- vTaskDelete(AppTaskCreate_Handle);2 R* i9 J5 B9 `* Z
- taskEXIT_CRITICAL();0 `/ V, T* D) ^6 Q1 U( l9 ^
- }9 e8 a) X) S. K. B/ q
- $ l6 O) I& J; Q* D" r
- /* USER CODE END 4 */
复制代码 8 ]. X$ X2 R" F7 c
4.3、编译烧录。3 D* l( S, b0 n* v i. I& Z
) J6 i" t9 T5 Y9 t$ L/ ~! z8 J3 M: C( k3 m% v a9 o. ~
|