1.下载源码
, i; M! I0 M0 X) M& j2 u F下载FreeRTOSv9.0.0.zip解压如下图
3 T7 G" a2 l+ y. P
: F0 F' l" c; F1 g$ R4 d4 s6 U4 }
" B) R+ Y9 L0 u8 n1 p" D# `, _" S
0 o9 N5 R% e6 W5 ~3 p" w只用关注第一个文件夹FreeRTOS中的内容
* s8 X0 `( p$ N. HDemo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。& P( @# f" {; _+ e
Source是源文件。+ P8 Z( K$ h6 ^
6 ^) E# `5 j+ w6 \9 G9 E6 ]: D! k- g
2.拷贝源码! P8 e5 j3 r8 q9 V9 x
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port! `; e4 _' u0 p& w, z& _
将Source/include文件夹拷贝到FreeRTOS下
; [. T5 g0 c6 I5 c
8 }; T+ T6 C2 \* ]0 {& j
# [ r. x4 i3 v( l0 ?" F$ _1 X* Q1 p/ i
; c6 E; X: d; @' H6 f$ T8 t7 @# Y将Source中的C文件拷贝到FreeRTOS/src下
" J& B. j. t) l- ?) {( y& d2 S$ L8 q% G0 q1 x
! J! U4 N3 ?6 Y0 j6 M
g* U) q1 S* p3 a' T
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,, w& X9 @# Z Y$ V7 X* U d8 p
& A& z. ?! Q" V" H3 G/ e9 \4 T
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。& F1 Q: }& I- E+ g
* J& `9 N+ a6 ]; ~6 n4 Q' T* [. H
0 p/ f" V3 r8 x/ r3.添加到工程
: J/ }+ V! C* H0 u3 X
& S( r* ~" W9 M- k3 j5 f
+ X# F j$ |" O0 Q. q; s
$ J5 a N' l& _5 r$ U新建FreeRTOS/src和FreeRTOS/port组
( c3 S5 T, L1 r" m+ A" R1 k K* WFreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
' e: E' B' X) B3 L+ oFreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和5 _2 c1 x+ K% B
FreeRTOS\port\RVDS\ARM_CM3中的port.c3 q! C$ V" T- o6 S& x5 z- b, m- s
+ Y" ~ E& i0 [- q% ]6 n) [1 m. s9 P; @# o8 V8 v( O- }9 g
添加头文件路径
) `2 J8 A0 a! }/ Z) h# u0 `1 `& |* c v% x7 i
1 V5 D5 G! k$ n; x
1 D0 o. `, ^2 T7 C拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程5 S3 f: d- |( C% ^1 V6 B4 ]
6 m7 U7 O; }1 Z- v+ {: s; b5 t' e
. A3 E. k2 t- J4 j9 s4 D4.修改配置
2 a2 s8 J0 L6 P& d- V: V在FreeRTOSConfig.h中添加
- M* Q g- b. y' {2 V2 V+ W' P$ s4 L- #define xPortPendSVHandler PendSV_Handler
9 [0 J; _" M, K* Y( ~ - #define vPortSVCHandler SVC_Handler
( K. n7 |/ x: O/ u5 M3 ~3 s; ~
复制代码
& p1 Q1 k( z3 W5 k! w; ~在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断/ m- @5 Z" z. @: |& U! s
{7 h% w/ h; e$ O
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。$ @! K1 \0 U& v5 _$ ?5 B; _
- /**: S( {% R5 O! o1 ]8 U( N
- * @brief This function handles SysTick Handler.
0 H$ h* j" R' v - * @param None
& W" e; R2 t Y9 x9 Y - * @retval None1 S4 U* z; F; ]
- */1 L) _; Y7 m" ^3 j7 K4 H
- extern void xPortSysTickHandler(void);$ X" b- i% n' m+ J: G }
- void SysTick_Handler(void)# s1 O: H F; ~& e1 N2 _
- {# c- Y2 J& r! R6 W* D9 |5 E
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
$ E% f: f) h) C - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
2 i) K1 D( [& @# ~' i* Z$ | - {1 q% @2 k, ]) z$ A
- #endif /* INCLUDE_xTaskGetSchedulerState */
- u/ {6 A, i3 s* E5 l" I2 L$ \- S - xPortSysTickHandler();
$ u# T2 ?; F. [" t4 L" g - #if (INCLUDE_xTaskGetSchedulerState == 1 )
& |" y+ ? w. U$ t - }9 D% S9 _6 {* M; E
- #endif /* INCLUDE_xTaskGetSchedulerState */6 v' Q: W1 i3 b+ G
- }
0 Y$ _) Y* f' E
复制代码
" T8 L- q- d* z7 D6 i
5 z3 h# e- G9 U' }5.验证demo
7 i. g" R$ A! O4 k- #include "stm32f10x.h"
5 U5 ], R0 _* |$ } - #include "FreeRTOS.h"
9 Z) F: q+ X0 R& }. W9 d - #include "task.h"2 d6 ~- E/ a0 e$ J
- #include "portmacro.h"& U2 y% t j% g, K! }5 J3 \
- #include "bsp_led.h"
$ [! B( O2 ~1 u1 J; N/ ?( h - #include "log.h"/ m8 P5 C5 ^9 Y0 w6 I/ n7 z
! ~7 f! F9 { O- static TaskHandle_t led_task_handle = NULL;# j4 q+ ]' Y6 S+ l5 I
* ^3 J/ R }1 Z+ T7 y, S- void led_task(void *arg)
$ e& {% f" v/ L1 N - {
' \2 {3 B1 M% \. N, A+ U: W1 i - while(1)
' x8 V# O" m' O0 o - {
`9 b4 L( k1 u" \( S2 ]9 F - led_status_set(LED_STATUS_ON);2 e7 z4 }3 x( F( B" u/ c
- LOG_DEBUG("LED_STATUS_ON\r\n");
. `1 ^8 @% h0 G4 M - vTaskDelay(500/portTICK_PERIOD_MS);
# j& }, {& u: c @6 A$ C. E- X) n - led_status_set(LED_STATUS_OFF);
# R$ P9 r) J. Q - LOG_DEBUG("LED_STATUS_OFF\r\n");7 s& M5 F' T* I9 n
- vTaskDelay(500/portTICK_PERIOD_MS);: j0 ?1 W; f# G# X7 q* ~8 B
- }
( z5 s# {; c: y; d m: z - }
3 y+ M c: Q. \4 p
; |* {- ]) y- p; q) h+ g- int main(void)- i; F3 |1 `, a* G: K1 j" T
- {
5 x( @4 w7 ]' k - led_init();
4 X: J) Q/ k8 a* g K: F0 u( ?* G1 A - 5 J' ~: R8 o4 K* r8 H
- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);$ y/ Z4 X: B. U* T/ G
- ) l) V( ?$ g+ n: l; U9 t: N9 e
- // 开启调度
& |4 k' F3 q: `( D$ O+ p) h1 Z - vTaskStartScheduler();
9 ~, k: f% ?- C( K1 M$ m - while(1);3 u+ e$ N0 q+ b1 {9 @- p
- }* w m# O& N3 A# z, {
- ' `1 ?1 J5 s, h. M# U) ]
复制代码 9 i9 Z/ [' S' R3 r3 \# @- S" z
. |, v2 R- F6 x9 K' A8 _6.完整工程
8 X" }" l. c0 V& h5 J5 f Y0 Q( D' H, g2 g
8 G9 L+ \5 J: g0 O4 m
6 d+ ]9 h! m1 Y: b; k————————————————
8 b* [6 M5 |# ` P2 n8 G+ y8 S, }版权声明:无聊到发博客的菜鸟
! M3 e9 O) A1 ^* s9 g+ H如有侵权请联系删除
' Y g b* t7 ^! L# Q- N
; i5 q- k$ Z' k6 u0 g! B0 u) P
! A# \4 \2 w' H. y& S' i
$ G9 {9 i5 d: ]+ |$ Z; v/ T( R+ p |