1.准备FreeRTOS源文件& r( A: t( a3 q" {0 j1 W
1.1、到freertos.org下载最新版本的源文件
, C* |# }7 k+ O
2 t2 m4 ]7 f8 G4 e+ N2 X1.2、FreeRTOS 文件结构如下:+ b4 Y- t0 }/ U6 ]: _/ C2 M
0 N3 e4 s! _. f' ]需要用到的是粉色的头文件和翠绿色c文件。
$ [6 m1 a) m' J& X0 p0 p
' P& U! b7 X3 `/ j @
- v: O$ J( v: ]2 I
0 W, S! k7 |* F+ |! ~2、使用STM32CubeMX生成初始化代码(BSP_Init). ?/ T" L5 A4 l2 A% r
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
/ ?- p; x3 O) x! z! S' f4 k9 X( x1 E8 e7 C/ w9 c) w& R
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档7 ]/ b( A& T4 b' [
! R: B, v! T* d
3、复制FreeRTOS文件到工程目录中5 f* W' t3 v! i( i+ K
3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹! I% K! y5 w2 f6 v2 q# _+ u
) h* a8 r8 A" N# h8 g9 ]最后看起来目录结构是这样; r4 w @9 h1 R4 u% ^( x
2 h' O D' G- Z2 `2 A$ @( ~
' m- H" F/ p5 o, a% `: G
% Y) I% W; w% K( M+FreeRTOS
1 e; P" c/ U* F |+include0 u8 K. X' _( H* c
|+source
p6 L8 t% b$ S" ?" n) U& C
( d! R5 V4 f l4 j% Y& R. x5 x# \3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
( I: K" x4 M3 M; P, o
' d1 j0 E: O, C! w1 e: U3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
% H, l3 _9 T% c/ ~2 y3 [/ b; W; |. x
6 i6 Z- a0 m4 V' ^% J, i8 {3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程1 U* I0 }8 F4 E* I
, l) h0 O0 l7 \- R) H% e2 |# t
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去
4 ~( G# N6 ?9 T3 q! {: H
' d* k2 d2 l& Z+ a7 [1 q
9 y% @8 s- e% Q2 A& i( Y4 m: G8 V# _" T- ~2 _6 n' x3 P D8 W
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"- d; W( V3 V' {9 r+ ^! c9 G
+ {. Q" X0 N! Y+ g( r
1 ~, U5 \2 t4 k* D' c
7 O6 L$ P5 C+ j4 h4、修改代码
9 |: b( `2 \* D4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
$ K5 k) t' i/ X+ B# a0 Z: Y Y( N
+ s, h' a3 l! @8 e5 s" M; [; V) x2 o- k4.2、在main.c添加代码,添加任务6 c- o' {/ B* f6 _- ?; n/ O6 w b
2 h, h* K7 M8 w+ N" K; c, e( G- /* USER CODE BEGIN Includes */
- d: u, O5 i. j - #include "FreeRTOS.h"0 X0 T6 H( k- B# J$ e
- #include "task.h"/ \7 d+ u) C, S2 l' }% K
- #include "queue.h"
; ]- h0 j5 h1 N( ?9 P - #include "semphr.h"
2 v# r r& e8 Z/ q+ G& P; Z - #include "event_groups.h") u) L v. p& x8 d# W
- #include "timers.h"
+ R3 \( n+ G& v - t: Q% F% t# J& b! O6 ?& u% P( I
- /* USER CODE END Includes */& E4 d0 n) @3 {& j: q
- *% ?$ Q& d; ? _
- *
9 T# D- k, I1 J" j - *
) [- V& X5 G! } - /* USER CODE BEGIN PV */
+ r0 b, `2 B; f1 v* e0 R6 o - static void Send_Task(void* pvParameters);
! O( \8 _) V3 l0 z3 g2 T - static void Callback_LEDTOGGLE(void* pvParameters);) W: x' [; m, @3 f
- : C3 v! q2 l' q
- static void AppTaskCreate(void);2 n1 R! L2 I e# Q1 d
- + \$ ]4 i7 w/ D' z% K
& p) P q% b) X- /*Task Handle*/+ O, S% @! n% [5 X* {9 f
- static TaskHandle_t AppTaskCreate_Handle=NULL;
7 T6 K9 a; R: R$ }" C r+ _ - static TaskHandle_t Send_Task_Handle=NULL; //PRO:3
- m" F+ x" c# X7 Z |
. t# `0 _- R% X T- + w! Y' Q) B5 u. P% ], f' T- ^
- /*Timer handle*/. F: m. F+ z/ ]6 c" H
- static TimerHandle_t Timer1=NULL;
8 L g9 v; o( B0 \
: L( o* U I; J# f Z) t' a, R/ Q' P, X1 I- static void Callback_LEDTOGGLE(void* pvParameters)" j* U) ]( p5 S
- {
+ W2 y5 y- h5 K/ C - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);
0 O& s) X$ f, y4 C7 J4 @ - 0 |9 j% I: h2 F0 \; p! ~9 h6 Z4 n
- }4 \6 O0 k& K! y+ }, d* ]
- /* USER CODE END PV */
3 b0 e m, M! M. k z( G6 ~ - *
) x& `2 p; I1 }- @0 | - *
- V$ u4 N8 g, @: y1 G( q6 e8 W+ h - *% k7 L* B a. V3 M# `: e2 ]
- int main(void)5 _. q& O' [6 L' I5 P, b0 \
- {
t6 U+ f2 u+ |; Y5 q - /* USER CODE BEGIN 1 */ O0 p, t' l0 [5 R
- BaseType_t xReturn =pdPASS;
" A# H0 u* {$ x: K1 ^2 h - /* USER CODE END 1 */7 h( V- f1 R1 M+ [9 c+ a5 V/ G, h1 i- Q# {
- *
1 Q) R, _; q* _6 ~( E% K - *
# Z2 E9 c5 S+ d. [ N - /* Infinite loop */( W3 \; b0 g9 x- m
- /* USER CODE BEGIN WHILE */
/ S ]7 p: r, V% M( B9 w/ A - xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\4 z1 Y; E0 X1 T8 u
- (const char *)"APPTASKCREATE",\
) ?* U2 `8 C! I: G* G - (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
0 C6 _) v# R! g# s( w - (TaskHandle_t*)&AppTaskCreate_Handle);& |& }# R. o: F: N) v0 D/ x
- if(pdPASS==xReturn)
1 l' b+ x. P, l2 L1 O* B - vTaskStartScheduler();" c3 e* M+ P% @3 A) x; l' [# B
- else
# ?0 _! ]8 g; B" b, n& L- { - return -1;
) {! m! s( m% R" X- { - while (1)
* b/ Z4 T+ N4 O. c8 X - {
' [" A! W5 t0 z, O& h, q - /* USER CODE END WHILE */
4 Z/ ^4 l. P; J, W9 J3 s. W - /* USER CODE BEGIN 3 */3 ]( G. g9 k" u5 I O }) u
- }
0 z, {: I: W0 J/ M- ^ - /* USER CODE END 3 */$ b4 u$ j0 l/ f$ E& s: X$ B7 O
- }4 m' d, T0 O% @6 ?4 H7 }
- 8 ^( U E; Z7 i% p/ r
- *2 F, a9 k" |8 f, z
- *% k1 H' ~# y! V6 A( [
- 5 R E9 [; G) O4 D4 l& T: J
- /* USER CODE BEGIN 4 */5 E- F, L! P* x; b
- /*********** y2 _* y- p2 E% r7 X0 s/ x: h
- *@Function name:SEND_Task
/ }* @9 ~4 N- e. l9 b/ v& v3 |- b - *@description:SEND_Task body
4 f7 R9 W1 i1 |7 O - *@Parameter:None
7 z! r" I7 l1 h - *@return:None
7 m' f( i& N1 n1 e' o - *************/; _; f- v: d* V0 ~
- static void Send_Task(void* pvParameters)! T0 v6 V; ]0 E( t
- {+ q) p" y; U! Z' {8 N8 q+ l4 _
# S2 @. B+ C+ ^; w) d2 ^% x- while(1)7 z$ ]% _' e' x! X: U4 K
- {
% f% F9 a( F, k - vTaskDelay(100); //Just to demonstrate task switching.
9 y( C8 Q6 K1 {3 x0 p: ? - }& K u0 k9 p, P- V: Y
- }8 E! q0 w/ a3 ]2 e, U
' p$ Z' b5 L' J) g, t( ]. x& s- static void AppTaskCreate(void)
9 `7 c3 ? O" E6 d a( H, f. m, O - {! A" h: `/ W8 `9 F! _
- BaseType_t xReturn=pdPASS;
/ R" C. Z9 H; n, g3 |/ k - taskENTER_CRITICAL();! M) V0 [0 S1 s$ S
- 6 t( T5 B% x8 b& {* r
- /* Create Timer1 Handle*/1 Q4 c5 e) ~4 y4 v2 k. ~( C' `; |5 z
- Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\4 R4 D1 K6 X* }5 ^2 u; F! N
- (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);' U, L! ~' U+ L. |, s e' c
- if(NULL!=Timer1)
# \. |4 M" I2 U/ f; { - {}. n6 r6 y0 F: U z
- xTimerStart(Timer1,0);
0 e# ]+ Y, e% {$ {* D1 z; e - 4 m1 g# l6 i, I g9 Z
- /*SEND task*/! ^9 W4 M6 ~) a8 K2 R
- xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
4 A+ n J) g ^+ y - (const char*)"SEND_TASK",\
! x- S* C$ [ F - (uint16_t)512,(void*)NULL,(UBaseType_t)3,\
7 Q6 c0 m$ T1 X, } - (TaskHandle_t*)&Send_Task_Handle);0 i8 j _9 Y4 O9 h6 b
- if(pdPASS==xReturn)/ F$ [3 ~. P2 n
- {}8 W) g4 D, t' f& a
5 A1 h" e, E; f5 g/ R! q- vTaskDelete(AppTaskCreate_Handle);% v( r6 }/ u8 G4 R+ h6 T& e
- taskEXIT_CRITICAL();
* s, F; i1 T. X* q% N - }! M2 E1 S9 ]8 f1 ^$ w5 [2 m
8 A" R* M; l9 C1 k. u* |- /* USER CODE END 4 */
复制代码
) s' u1 d: o+ _" X+ `" h
/ T U; L- l9 a6 [4.3、编译烧录。, ?8 P- k& a" R0 a J# g
————————————————
) p) u3 ]: R! F4 N! B: {7 w7 u版权声明:SCCELE2 [1 _- m0 b6 e7 }
$ S$ N1 I. Q. y* D, s9 E q
|