1.准备FreeRTOS源文件5 I; d1 u. t5 |: c" S
1.1、到freertos.org下载最新版本的源文件,链接地址9 A% O2 V4 A/ a5 u' A: K
7 ]. v$ t- d. L6 e/ q% [% ]( l1.2、FreeRTOS 文件结构如下:
6 f) g/ m; A' b- r
+ Z$ r, i3 B0 E3 H8 M3 w需要用到的是粉色的头文件和翠绿色c文件。. E/ E- \) }5 O: j; H' v
) G& r0 h+ y/ s2 U% o) ~0 {% p1 e" U4 e
* G0 G5 y+ J) R
2、使用STM32CubeMX生成初始化代码(BSP_Init)9 S: f7 g2 k( ~6 a+ f- P$ p
2.1、使能HSE/LSE/SWD/GPIO(引脚数量和外设具体看你需要,这里是点灯用)
( [3 @+ _ P% W! C. v9 t( y: j2 o9 d# \/ _" {$ {7 m
2.2、时钟数设置64(MHz),设置工程的文件名,路径,IDE与版本,勾选生成'.c/.h'。生成工程文档
4 x! L) B9 Y; }7 F4 M6 u( u( M5 R$ c! \! `: a
3、复制FreeRTOS文件到工程目录中
: m O/ W1 e- x& H3.1、在工程文档根目录下,新建一个文件FreeRTOS,在该目录下新建include和source文件夹" q0 [6 r8 [, |% g9 G4 G
$ N$ H P5 v2 k最后看起来目录结构是这样
( J3 Q2 U" f* L9 X- J
. Z3 n5 j$ ]* k
5 k2 S) u- o) g' f) K5 I: l) h8 U( B; i& g2 B7 w! _$ t
+FreeRTOS" _8 b% [. y. P" y7 J
|+include
- H _7 O$ G) Y v7 ^3 B5 z |+source
8 W! F* T7 s7 \9 w
/ b4 s2 d) f( m _/ ]3.2、在FreeRTOS源文件中,把所有的翠绿色.c文件复制到../FreeRTOS/source中
9 y& g& h% Z- j8 t8 y; z% M) s& r; ^& k& A! L9 m3 U3 g9 g
3.3、除了FreeRTOSConfig.h,把所有的粉色.h文件复制到../FreeRTOS/include中
+ e) C, a& H( D. s8 S8 T5 q( b) D. W( Q7 Z1 e. p
3.4、把头文件stdint.readme改为stdint.h,使用keil打开工程* H7 d$ M) y( ^" Z3 B: Z2 F
! e8 J& l8 q3 r' u
3.5、新建一个FreeRTOS/source,把所有的c文件添加进去, f9 Z; r% ?0 b" u$ F/ F' |0 `/ |
7 w+ ~6 q" q: t9 `- A: F! {9 X# Q
" C! e8 C# V. P+ L' E1 d* B3 l( \: [3 \8 J; t8 w4 m% y
3.6、把include的目录包含进去。Debug选项里面勾上"Reset and Run"
3 O% ]! u; t) H/ e% [1 \2 v1 D; p, J1 [
. N+ m% z% u8 n. Q$ q5 ]2 t3 v) q, y A4 W
4、修改代码2 K R5 G! v0 F, I, F" @6 b, ^) z
4.1、打开stm32g0xx_it.c。注释掉SVC_Handler() / PendSV_Handler() / SysTick_Handler()。因为FreeRTOS里面已经实现过一次
" ?: k w6 D8 ?# z8 o% m; O" x }( ]7 K( G
4.2、在main.c添加代码,添加任务
5 S. h( X( |. A0 H6 Y0 w8 b+ o: ~
9 d9 v% R: X" O. T$ v( l* a- /* USER CODE BEGIN Includes */5 h7 [+ ?! C+ P/ B
- #include "FreeRTOS.h"
0 ]( r7 j) W6 `2 `) | - #include "task.h"
) q$ B- [0 v* L - #include "queue.h"
6 k6 E; `. R: I# t; x k - #include "semphr.h"
2 l! s$ m' {. ~: f" q$ f - #include "event_groups.h"
+ @& j8 G( Q) ]1 C8 f - #include "timers.h", V! y3 z T0 m3 _5 m+ {- M) F
+ F0 M3 [. G2 c0 i/ q5 N* i+ P- /* USER CODE END Includes */
: b, y2 S: H* D; D7 s - *
5 c y5 w" y Z0 \5 B. B) b - *8 O5 _, D# J+ V( W; C
- *5 {) o9 V$ d8 K; x
- /* USER CODE BEGIN PV */. y) ~# I- Y/ j- Q! V' U3 V
- static void Send_Task(void* pvParameters);' X& G3 r t l( a9 b) J/ ~
- static void Callback_LEDTOGGLE(void* pvParameters);
. I4 B& x8 D4 I' ^' |+ S - & o4 K4 `$ K5 P5 j$ d
- static void AppTaskCreate(void);: O4 F m1 D' ~: X9 Z& h
5 V9 P l1 ~8 O: _* X- ; |- q! [4 S" o+ ~; {1 b# X
- /*Task Handle*/
& Y: G" @! o( O - static TaskHandle_t AppTaskCreate_Handle=NULL;* F9 R+ J6 a( G* X+ I9 ?, e4 C
- static TaskHandle_t Send_Task_Handle=NULL; //PRO:3
+ T/ X7 t8 `9 P0 s
* u9 e# B* P! P6 u) W5 {- 1 ^4 R" {- f( @; ^$ D6 L9 }
- /*Timer handle*/. \2 m( o; H" C) f2 _
- static TimerHandle_t Timer1=NULL;
- y$ V# X. z4 @+ `6 Q) x s7 y, Q - 0 E" A2 ^9 q5 `3 D1 `# g
- static void Callback_LEDTOGGLE(void* pvParameters)) P/ \+ D/ [1 w
- {
9 Y' ?5 |4 W( u/ n - HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2);1 Q. x" p+ H/ p
- ' W( W4 m/ ^2 k1 d
- }
% V6 V1 M+ d/ Y, U - /* USER CODE END PV */
7 M/ E$ [0 j0 V' {# l - *8 a8 R9 T% h% U- h }4 A2 Y
- *
+ g, \& M+ V( m# G* K# c; G3 k# J+ O - *! \: J; Q4 _( q- j& B m
- int main(void)
J% q0 q& P: ` - {
. f) v( Y, C3 i' L - /* USER CODE BEGIN 1 */
5 G- y% s, R2 ? - BaseType_t xReturn =pdPASS;
" c4 [- Z! M+ \* G/ Q- V) h - /* USER CODE END 1 */8 q* s: M; n7 W1 u* v! [
- *
1 F) L7 y1 F7 d - *7 i. H9 M6 ^* A, n' H; r
- /* Infinite loop */) G$ [: q& t t4 l0 v( c0 T
- /* USER CODE BEGIN WHILE *// p% ~ |9 k/ s- [) V
- xReturn=xTaskCreate((TaskFunction_t)AppTaskCreate,\6 i2 K' t. H S* O( u Z
- (const char *)"APPTASKCREATE",\* H7 `. @# O/ \0 S+ f
- (uint16_t)512,(void*)NULL,(UBaseType_t)1,\
+ b! n/ ^1 H8 z! b2 r - (TaskHandle_t*)&AppTaskCreate_Handle);2 \; F; I9 D# l# c0 I& U
- if(pdPASS==xReturn)$ N% \7 M3 z: K$ U6 j6 {; r$ y
- vTaskStartScheduler();# d8 G. a$ ?$ j" C1 b# t
- else. B8 T9 m7 [" A8 D' k# l5 J
- return -1;' `8 ^0 ?- `+ h. E
- while (1)
$ j& Z; ~( r! n Z) K) r! Y - {
. V3 k% [: x' D. C" w% E - /* USER CODE END WHILE */ _. ~! ]. ^2 L+ w5 v7 j+ _
- /* USER CODE BEGIN 3 */
7 E) W( k" P; m - }
* T& ]0 H9 F Q+ I# j: w9 K" h2 l - /* USER CODE END 3 */
/ s0 v2 C. r% q+ k - }
. n3 C( G: F! C6 I
' s6 _3 g2 u: J( t# R- *. D! I `) h7 h4 Z# E9 `
- *
" p3 i3 Q! b/ @ }7 y' E( b2 s - : Q; g( p- L3 u+ t) T
- /* USER CODE BEGIN 4 */) e9 D4 Z4 g+ O/ J
- /***********1 }# v( Z) F1 a& j
- *@Function name:SEND_Task' \0 F6 ~7 ?5 [& y7 h% n/ y; W
- *@description:SEND_Task body7 y8 c- Y! Y! B4 S$ i; Z% b0 \# Z
- *@Parameter:None
2 p- y7 F: ?1 i0 o. c - *@return:None
5 w: c1 \; M+ m - *************/7 W6 m b* r4 I- h3 j
- static void Send_Task(void* pvParameters)
- {4 p: B# b5 a ] W - {
0 y1 Q7 D8 L, N - $ w$ J7 Q) ?/ x
- while(1)( S7 [9 T( h, e
- { 2 }; b% z4 T1 \7 X0 V/ \# H
- vTaskDelay(100); //Just to demonstrate task switching.
: s; [5 c1 k' B0 T* F6 A6 G8 X1 z - }
8 N5 \' i% F% r: } - }4 @7 H2 x( T. Z! s
8 E. }0 V$ f! t$ C5 s5 B- static void AppTaskCreate(void)
0 }4 J n: {3 D2 |* @ - {1 g& [+ @: _0 u( h" O
- BaseType_t xReturn=pdPASS;5 s; r/ _ w5 m# ]; K6 f
- taskENTER_CRITICAL();' `7 X2 j+ j) y; _5 L
, m' J9 o; r+ q9 @( z- /* Create Timer1 Handle*/
) C! D7 e8 n" T% L2 m - Timer1=xTimerCreate((const char*)"1sec-toggle",(TickType_t)pdMS_TO_TICKS(1000),\
$ ]2 ?5 M' S! r4 g - (UBaseType_t)pdTRUE,(void*)1,(TimerCallbackFunction_t)Callback_LEDTOGGLE);4 W! w- \ z% l/ H9 D
- if(NULL!=Timer1)/ `" E3 k: r0 n e% Q, R. |
- {}3 p# j; H/ t9 k* T' K
- xTimerStart(Timer1,0);
6 [+ F, p/ t$ w! [7 t1 B# C+ m& Z - " [6 ?& A+ L% H* n
- /*SEND task*/$ l0 S! w Q) @* m6 p" \
- xReturn=xTaskCreate((TaskFunction_t)Send_Task,\
& _; Q+ R: I- D/ | e; z - (const char*)"SEND_TASK",\
5 X/ R, o7 `4 ~2 c' n - (uint16_t)512,(void*)NULL,(UBaseType_t)3,\' f/ ]! S3 X U. S7 M
- (TaskHandle_t*)&Send_Task_Handle); @9 c9 k+ _6 P( ]! q
- if(pdPASS==xReturn)
/ r8 T$ x0 d; E# @( |/ V - {}; ~$ c0 D5 z3 ~9 B5 o1 P* U
; X- k$ r0 w( I9 z. u9 B' R7 F- vTaskDelete(AppTaskCreate_Handle);' w2 O3 q7 g1 W* {& S- H
- taskEXIT_CRITICAL();
& D% f4 | o4 d- H( G6 s0 B/ U - }
8 p! D3 d/ e& L8 |% F( s
?# E; B a6 q: {" T- /* USER CODE END 4 */
复制代码
) K0 N4 |) f8 {1 Y- R& S$ y4 o# @( W4.3、编译烧录。
1 w/ i* {9 X3 P2 W: u& ^" J% u1 r V9 J
8 |) `# D/ w ^: [: b; E$ \ |