1.下载源码
8 M& [# Q- o4 ?3 F0 [. `下载FreeRTOSv9.0.0.zip解压如下图
( X* J* E7 U8 u/ G, z* |
6 K' Y8 m. t( U4 W6 J. d
9 r- q! ~$ ~% d- l/ v: M s
. ]* d) m0 i$ b7 O6 K只用关注第一个文件夹FreeRTOS中的内容
) T. {0 J& C; p) VDemo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。6 w P/ E, u" ^ f7 s1 l
Source是源文件。
2 V- z6 b# i) ]* O6 y; k
, D) W! F M0 ?; v0 P: D$ M+ i
# `, p/ f! {) W" m/ R0 H- T, j2.拷贝源码. s2 B5 ^3 g8 c# q6 K! Y% d
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
) T1 c5 s4 A" ~; `! q; l9 \( _将Source/include文件夹拷贝到FreeRTOS下
. Y6 n1 v1 S2 Y' X; o% R2 Y+ k
( [0 Q% h3 ?% A
3 a9 h2 U M" {; C4 @4 A
4 c, S$ K; r6 q4 f& t' w将Source中的C文件拷贝到FreeRTOS/src下
0 N! S! Q1 `( r' [' Z2 D2 B$ U# L9 G- }- p, O0 t1 a
- Z, l1 J, r- V/ g- c
8 A1 g! g/ g* e9 h k2 d7 s" q
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
/ \3 `, P6 \& I) [. k+ E/ _0 }
! P# k7 Y* h9 ]* v `: |其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
* K* B0 D( m: v. J! _1 C4 _7 d- h% u0 M
1 l5 Y+ Z+ A- ^0 H5 k
3.添加到工程
/ t. g5 P4 a$ V1 a# k ?$ l! m% t5 d7 q
1 }" L- t* @5 x" o, }7 |& I% j0 Z7 |/ Z2 j/ X |9 c
新建FreeRTOS/src和FreeRTOS/port组! W+ o% p+ j5 ]' I: Z
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
( _# J! \. N2 BFreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和! ?: D, y* H! x) w& ?/ J& P
FreeRTOS\port\RVDS\ARM_CM3中的port.c: D2 ?4 |# H+ m4 G7 S2 G& a! j
( y( m/ {: f8 o% S
6 Q; V3 h- p5 ^$ |添加头文件路径6 s" u* x, o6 k: ?! P9 {/ P
; P" d6 h* Z' n0 v8 S5 }
( | A: g+ M/ p: n. \* `3 ^
$ I9 ?$ A* {. ]# A8 V拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程' q2 g- E0 D. J+ U
/ z | [7 K+ v3 U- y! i! X+ I
0 m0 X2 ~2 _0 }2 [. Y
4.修改配置
. F/ \2 w6 u7 J; C5 v# k3 h在FreeRTOSConfig.h中添加- ~! G/ `! [6 K2 O T8 Y7 ~( i
- #define xPortPendSVHandler PendSV_Handler4 ^8 Q5 F0 ?- u7 x( B- O/ ]9 A
- #define vPortSVCHandler SVC_Handler
$ A- ~, Q" d7 k) l1 c
复制代码 % ?' ]; i2 R* S# d8 d
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断" C* }' M! Q' K+ C
6 { D' ~9 n0 A
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。! ]9 m- @+ K8 [% [ l/ Y3 }% y
- /**
8 F* j, h% D( ]; e s4 D3 N* X - * @brief This function handles SysTick Handler.3 r; ]$ [: N0 h/ c- b& X$ c) ?
- * @param None+ ~1 t; B7 G) Q$ E; x
- * @retval None1 h7 k. O% W& k0 D* R$ k! E
- */9 d+ a2 f2 E4 G3 [
- extern void xPortSysTickHandler(void);
8 v* [ f+ ]# l! ~ - void SysTick_Handler(void)
% u4 E% f: P) d - {0 ~2 e, F7 ?, A, c x, r
- #if (INCLUDE_xTaskGetSchedulerState == 1 ); |- ^7 u, T9 ~/ y' c G
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
. v5 f( v) L8 k' l: e9 n6 X - {
5 O/ s( f$ b4 D3 q( s - #endif /* INCLUDE_xTaskGetSchedulerState */ ' m. Q# ]$ W4 M# ~5 Z$ Y
- xPortSysTickHandler();" g+ f% O5 a+ c0 X
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
7 O! I5 a! c! J+ }; R - }0 ` c, f6 r, W/ s9 W2 f" a8 }
- #endif /* INCLUDE_xTaskGetSchedulerState */5 J9 E/ F7 i# E! l( B
- }
6 |/ t( v8 d9 O# V; N: ~+ E
复制代码
' S9 l2 e# T) M' Y: m7 E$ o# D. ^2 ~
& t2 X: c* x1 ]5.验证demo Y7 r+ f {2 z! U' ?4 w; d
- #include "stm32f10x.h"
1 s9 L. Y' q7 ~; V3 o% x - #include "FreeRTOS.h"2 C: I. X" V; H. h
- #include "task.h"! {: [. T( H! m# ` t& `& Q
- #include "portmacro.h"
. |. \7 p2 e; i' A+ r- l' T - #include "bsp_led.h"
* B- N. s! _% L1 A/ L2 u - #include "log.h"$ t& O. N- U/ K
- 8 d, [1 k( y' e+ k2 [& P1 p2 }; `
- static TaskHandle_t led_task_handle = NULL;. v! `2 X( j/ e( b) S1 f/ v/ |2 ^
8 X9 v/ \2 c& W+ \ z/ m" T- void led_task(void *arg)
6 H8 m' I8 s; Y3 }( v- s - {
! E7 R3 a; ] Z A, y - while(1)
3 s: Y4 ?/ N$ h ^/ F# j" H - {
2 e) _4 j3 G6 ^6 ]9 h. w$ q - led_status_set(LED_STATUS_ON);
4 i+ m% X- ~( R - LOG_DEBUG("LED_STATUS_ON\r\n");
! V, Y# u& v9 U& [2 j! }! u - vTaskDelay(500/portTICK_PERIOD_MS);. _' f4 q3 Z) G# b. w! t
- led_status_set(LED_STATUS_OFF);+ v! O& B! u3 P/ I! R* V) Z. u' y8 m
- LOG_DEBUG("LED_STATUS_OFF\r\n");4 S" z& t, B2 _7 m$ f
- vTaskDelay(500/portTICK_PERIOD_MS);4 I1 m; R V) n$ t
- }
+ M1 D# [% t5 S5 L: H8 C - }
- e0 I$ f7 ?, Y; z; B - ; N. c, _* z1 E" Q. n \7 W( v n
- int main(void)
s: q5 U% j, E - {
/ a) N z6 q; @& S8 J; ^ - led_init();
9 A/ d$ X5 }% E
9 [5 ]& y, K1 ~# r: ]- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);3 R. S Q# W4 `3 e5 y% V% f+ Q
- 6 v! V: S+ {$ L
- // 开启调度
; @: }$ a) o% t7 z* t& w - vTaskStartScheduler();/ j" b: d4 w5 z( O1 m$ ?* b
- while(1);. O8 |( ]3 W7 o
- }
- X; M' H: f, Q0 c4 y - : W3 B' z( o$ ^& y ~8 h
复制代码
1 K7 z4 u% c) S- ]9 n3 j1 E0 e8 j# r' t
6.完整工程
W! P6 Y$ Z7 n3 B% j c( R4 u1 B' _/ g$ h, `0 ~
4 {$ u, {$ l2 ~; @) \7 j4 O' M
/ c, u2 L0 l3 D+ d1 u( L————————————————! h# o6 Z, q7 M
版权声明:无聊到发博客的菜鸟* B! Z/ b4 t6 v1 X8 X
如有侵权请联系删除 B5 A- M* o$ F; b
8 @+ V3 L: f/ g
1 c2 k R: j* n; H- {" {0 j3 }7 f* c
|