1.下载源码; _7 P* z$ X( q. }6 f, d3 V
下载FreeRTOSv9.0.0.zip解压如下图
) P* \, ~; M; K5 q, H' |; Z: h1 v# x
3 \4 x3 h' j4 _
- i) n. u z8 P2 P- z5 r l. Q只用关注第一个文件夹FreeRTOS中的内容 u# H* _, k. ~* p# l ?
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。- s- W! G% `: ~& H+ `# c
Source是源文件。
h9 M" N8 g4 b6 z% P3 X$ `1 D% g+ O
0 h+ ^2 `4 U8 c/ T( a2.拷贝源码
2 l, R6 @. u6 c8 M: V* w) `在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port1 ^; Y5 \! t* n1 R! P
将Source/include文件夹拷贝到FreeRTOS下0 I; [& N& L% q9 a# K+ G3 B
; p6 H, s1 g% t& z3 \' [
5 j9 A( Q' f. L1 h9 F4 h6 j" t) [! w7 z8 i8 r+ t3 @
将Source中的C文件拷贝到FreeRTOS/src下
! g* x: M9 y/ o7 {; `9 s" U/ y. K; {' |0 X( t
' e i) C9 |* w
. z8 U4 e* } n- p& @( p将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
( ]" \; U) g4 l* f
4 Z ~. u5 ^0 S( B$ N; _) G其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。( e* A# V( I, Q
4 L0 ^3 U! u4 e6 `
, ?1 A5 r8 A* p' i1 p5 B# j7 F4 `% |3.添加到工程( }% u! T+ s/ N. ]; W/ m0 ]- e1 I8 T
. E. r0 N. n0 \' Q, j1 M6 r8 b$ U
8 T4 V) n. @& N% F3 @
* t8 U! q/ N0 `0 s1 l新建FreeRTOS/src和FreeRTOS/port组1 |: q, e% E; x/ Z6 @9 F% N3 K
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加/ e' C/ k( c! O' q% C( j9 e
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和3 E Z2 b, e S4 y' j
FreeRTOS\port\RVDS\ARM_CM3中的port.c2 g9 r0 `. @7 q. x: H7 C# S
+ w5 \' O, e1 |& ~& b4 O" v1 K( L0 c( y& O' {2 ~3 k& H
添加头文件路径8 b. {* M' b# E& W `0 ]. n
; s/ {/ R J$ ?) P& o, q
+ z2 f3 w9 Y# _8 z6 J+ k
3 M$ s n4 {6 I+ p
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程
8 e' ?, j9 G1 K( R& l9 J B1 l( B" ]. z3 r+ L" w( Q5 H
1 a) c; a0 S1 `& c
4.修改配置- W& Q8 x1 Y. I. v v# c7 K
在FreeRTOSConfig.h中添加
8 g8 ~( m! d8 V1 F4 T3 @; M& b8 r- #define xPortPendSVHandler PendSV_Handler, u# c$ J+ _" g
- #define vPortSVCHandler SVC_Handler
/ l) {1 _" `4 S; D: F( b
复制代码 : q1 p9 W& Y* H J' H
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
. A% R+ z# W: J3 J! r. h
2 j5 E6 T; c( P! W2 ^( x; R& U最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
0 B; s% x5 w* S" B: C* {- /**
. a0 V& ^# P2 a6 k& ^! M3 N - * @brief This function handles SysTick Handler.) U& p) @" p) j2 J3 t8 A& {
- * @param None9 m' G4 r3 |; H
- * @retval None
) P$ u1 U- c/ N- z# y/ _ - */8 K; u1 C3 R: H4 N+ X
- extern void xPortSysTickHandler(void);$ ?7 x+ I- A2 |+ B0 R$ E" j
- void SysTick_Handler(void)
0 C: I) ?2 p- L$ D5 V - {( e D3 G: I$ a5 o8 a
- #if (INCLUDE_xTaskGetSchedulerState == 1 ): p6 q. c. K% f7 }! s4 [+ m3 J
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)1 f n* |# n9 a
- {7 F$ q Z/ B, w
- #endif /* INCLUDE_xTaskGetSchedulerState */ / B( d% y4 H/ {' d/ K5 o8 _+ F
- xPortSysTickHandler();
( }- X& j. `" m& m - #if (INCLUDE_xTaskGetSchedulerState == 1 )7 G" \# b5 y6 B1 Z/ l
- }! j. o& t7 |: X8 c
- #endif /* INCLUDE_xTaskGetSchedulerState */; s* J% p& H, Q1 h, T3 _# n
- }
/ q% B! h$ A5 c+ l+ x7 S& e
复制代码
: a6 ?* e/ c6 G% D$ o6 H. q
$ U* d( k! S8 y5.验证demo) H% T. x7 R2 a& L$ q, v
- #include "stm32f10x.h"9 V0 V) _: L# R) C7 W. E
- #include "FreeRTOS.h"
4 E3 u) W+ i' Y. i. T7 z; ]/ A - #include "task.h"! f! z3 y6 m; W7 w* K% P9 g4 R5 b+ Y
- #include "portmacro.h", C b. F+ x) E- M; |
- #include "bsp_led.h"
# ]0 D& \4 F9 g6 c! K - #include "log.h"
+ p% Z; }7 J4 S+ [; q2 \+ f/ y - % ]9 T# j% A3 v7 W+ j
- static TaskHandle_t led_task_handle = NULL;* ?& E$ o* W X3 N6 M7 Z' C7 d; E- E/ @
- 1 R( ~) [: Q- J
- void led_task(void *arg)! I/ d. N+ F8 V7 P! n' m
- {) o6 v. x. P2 U5 n0 J/ p
- while(1) 2 W u% K( a v8 Z8 h) K3 W
- {8 r) k5 b5 U% K8 }
- led_status_set(LED_STATUS_ON);" ] J9 z4 g2 s' s2 h
- LOG_DEBUG("LED_STATUS_ON\r\n");
) o: }3 a; R0 K9 X8 H1 n: F - vTaskDelay(500/portTICK_PERIOD_MS);
& w0 c) R3 M$ _$ n2 t+ O7 K- K$ o - led_status_set(LED_STATUS_OFF);
$ E9 i6 j- o+ q - LOG_DEBUG("LED_STATUS_OFF\r\n");+ p0 v1 e4 d8 Z3 a2 ~
- vTaskDelay(500/portTICK_PERIOD_MS);
& M7 r7 n! E6 x- _- V - }0 @; O7 d1 U c# D$ t* v; c
- }
) I( A- d- E6 |7 e# w" r
# {' D8 s4 K9 a; x$ o! Q; l* ?- int main(void)$ \ H" c3 x/ o' p; Z3 `
- {
# }( j1 Z7 R( s8 G# [: d8 h - led_init();, T$ I1 _0 }/ V, ]) P9 D
/ Z6 H& g9 P& V$ C# r5 s) A- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
6 @9 a& Q; X( Z d3 L
8 E& e: w: g* }+ E. O- // 开启调度
- Y+ b4 C" q' k9 ` - vTaskStartScheduler();
9 S4 T j# T$ t# l - while(1);
; q. u# X2 |. S" ]5 F) b - }' C" t1 b* H( s
- # r' O% m0 t T" F! Q9 e2 w
复制代码
( b, |& G5 Q" z4 g4 V- M8 z) I
, B4 Q/ Q# v3 V6 S# J3 C1 r6.完整工程
}- \7 K$ O' m& v4 N# }
1 z$ {7 }& A- e$ ^3 G* E
6 L3 f3 }( P' S& t' I r [' s |+ D t( p! \
————————————————* n( ?% @1 M$ K' Y! j* \$ a/ I
版权声明:无聊到发博客的菜鸟
& J/ s d3 l. S/ f如有侵权请联系删除
# `2 N t j/ I9 ~9 A7 d l' j
' M& e" i! o5 d, r* _, O3 {" c6 S) }1 e# \0 ?* j# f( q* ^
! P5 h, O, m) [3 R
|