1.下载源码. k$ w+ ~8 P% t( r8 g+ e! e) I
下载FreeRTOSv9.0.0.zip解压如下图
! c8 \0 ~8 G8 p( C" y5 P
7 B9 Y; ~7 k$ v- l5 v
6 F( y! b2 n/ h4 Q; M
$ T% ]1 Q u8 p3 z+ x7 K
只用关注第一个文件夹FreeRTOS中的内容
/ k0 u$ _6 H" }' V- \8 H: s# [Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
/ O, m! a& e5 i$ [! tSource是源文件。8 ^6 Q! m8 B$ x: j3 o: t7 n
$ a# k. n! F% _9 ~" D6 E6 B! T/ g# ~9 p8 U k+ B
2.拷贝源码
M( N( a1 |8 _. X在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port# u( P1 c Z; j/ m. o
将Source/include文件夹拷贝到FreeRTOS下. A& _$ f; |# E2 a& I
! ^& N( s) P7 a7 ~0 u$ M
% A+ [6 t* h0 z9 \/ z
9 g" l+ i+ s4 ]7 b
将Source中的C文件拷贝到FreeRTOS/src下( L% E+ Z1 W* u( n O5 |2 [
: K, R0 w$ V5 c9 x
0 \ k5 c( K3 U9 Y7 i: _7 ~) o* L- R; m1 o' p0 |
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
- B# w5 X( k: r/ F7 L" {+ f5 j$ {; d. F; [' a' c; p
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
2 K+ O: i' ?4 L- ^9 o! l" |: \3 E. N; ?% o
' r! Q8 z) D, ?6 D% o3.添加到工程
, [: l8 I- P U- t' o5 [
2 l, b& ?7 g% C! X
. {) [6 T+ t+ \& Z! |
) L0 x) F: t! L( L ]2 r新建FreeRTOS/src和FreeRTOS/port组5 l& l, ^! V1 t" h6 \
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加 O1 U* S' M3 Q7 |/ y6 o3 [8 g
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和! T1 |9 ]+ p- f a% G* s
FreeRTOS\port\RVDS\ARM_CM3中的port.c2 F8 h/ _$ r( Z4 a, }
' o/ x T2 G/ ^2 U. ]
5 R% {! b) l; g; F: B添加头文件路径
7 _3 b2 j, F7 n0 D* R* K# x/ U/ c; K: a* c5 r' P$ _* A
9 L2 ~3 ], \ p5 l. H$ b
; n( ^- x8 M& v4 {
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程3 b& y% R& S$ `
( T7 m0 q) T5 G( r! l
5 R" a* y0 B7 Z3 W
4.修改配置2 }: e8 i4 E3 C
在FreeRTOSConfig.h中添加; o3 C2 h* E# v( c
- #define xPortPendSVHandler PendSV_Handler
: ?+ e( [( p8 Y2 t$ E - #define vPortSVCHandler SVC_Handler
& m9 h6 {0 C; X9 w* m
复制代码 0 n: Z5 T7 v0 {1 ?; X
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断9 e* Q+ k/ K1 D r- _. F& f
p) I& n: a X- s' u
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。3 k" ^: _8 r" a! L, X, Y3 ~
- /**
0 R- v0 F$ p1 i8 G+ N: E4 U - * @brief This function handles SysTick Handler.
b6 _" v. W: l6 p - * @param None
8 U+ I$ D3 r9 n5 y6 X - * @retval None
4 ]' }4 T1 e$ x% O - */
, y1 Y3 H) r+ Y - extern void xPortSysTickHandler(void);
% F! |, T( l1 u3 j1 m - void SysTick_Handler(void) ^( ]" F* ~3 h* P+ |( H
- {
8 J2 c4 P8 x2 i+ h/ y z# U/ i7 q - #if (INCLUDE_xTaskGetSchedulerState == 1 )
8 Q) r0 E! E% n6 @ - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)* }5 M: b* K9 [
- {
7 ^& L0 }. Z( p/ M M* } - #endif /* INCLUDE_xTaskGetSchedulerState */ $ O' F$ B1 C$ z- U1 P3 h3 Z) p5 s! o
- xPortSysTickHandler();9 v& {0 P3 y" M0 L2 K! i% A4 ^7 f
- #if (INCLUDE_xTaskGetSchedulerState == 1 )+ y. J9 T5 c9 i
- }- x1 O4 L$ P8 {
- #endif /* INCLUDE_xTaskGetSchedulerState */% w5 U9 T; n0 p; U" ]# w7 U
- }
& P8 @& j. ]7 z; r/ z0 d
复制代码
7 v! P+ U. q% P8 D' w. w! |; U) k T8 f& v ^1 w
5.验证demo
, V' J! @: } o( m1 u# o6 [( b8 C- #include "stm32f10x.h"
0 P# q( Q+ Z( A' ]; M0 l- r9 S - #include "FreeRTOS.h"
3 c: `5 l4 Z/ y# i" R2 M. A - #include "task.h"
0 S4 m! i1 H+ g - #include "portmacro.h"- K7 O" {4 n( Q. o
- #include "bsp_led.h"
) B! r3 ~1 V F' g* b2 Y - #include "log.h"
, j% L8 l+ W4 }' W C0 E9 t1 b
1 T7 L. i* c+ N* ]- static TaskHandle_t led_task_handle = NULL;
+ D) j" @$ m5 \
: J. c9 H. l- n1 X- c- void led_task(void *arg)
- i |7 B5 a4 x8 m - {* o0 x! o- ], Q4 E- ^& n! U
- while(1) . u1 _# W0 x ~1 |
- {2 E) p5 u6 Z, H/ p. _
- led_status_set(LED_STATUS_ON);
# @# Q9 T; L& h: s. A - LOG_DEBUG("LED_STATUS_ON\r\n");
% k" O2 H+ d3 B2 _# u- d - vTaskDelay(500/portTICK_PERIOD_MS);. J; `, C" g% \" a' x( c5 D5 \
- led_status_set(LED_STATUS_OFF);
) C, S; `1 G% a" @, J - LOG_DEBUG("LED_STATUS_OFF\r\n");2 Q7 T& _: E8 g5 b# C
- vTaskDelay(500/portTICK_PERIOD_MS);
/ r3 u# ~ T3 O - }
& z P* k. P* @ - }" b& m/ K ?" {
1 Q, ]- M# v) [" g2 G% ]- int main(void)
; Y' ^6 Y# N6 M& F# A( }7 Q- W0 B - {
1 q& e$ `1 _9 _6 X/ J) D1 f# T- ] - led_init();% W% d. l- ]+ H' X% X6 g
- % R2 }% |4 Y9 l( f
- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);9 z1 O7 R+ }! J+ D6 u
" Z$ k' \6 o) Y% @1 g& X- // 开启调度
( s8 J9 K0 n/ g4 N# Y; o - vTaskStartScheduler();
U) \2 k( ~/ i - while(1);# z+ }+ D( X: S G
- }+ E! ]- m K+ E( [ [' x o& T
7 b' s) [2 z: }1 z
复制代码
, k# w( p# z+ y- q/ g" n1 D$ N/ T0 w/ X9 _# A: o# J
6.完整工程5 t" ^4 s) E7 ^- B, E
$ f5 w. B# X" b( S ?
, [. ?4 s9 j" {& B2 Z& o. z( o9 L
" x5 j, g$ R2 Q+ z
————————————————
# u9 c$ G& ^( i) {4 ~版权声明:无聊到发博客的菜鸟
' ]- V C$ d. s# D; T9 s如有侵权请联系删除, \; `9 Z7 R" }
; B8 B, L. }$ m( j( i5 f: q3 o
; s7 w% w! H( z7 [ X5 p/ {
; T5 o: M M ?+ ?6 T( X% g+ e1 h
|