1.下载源码
% w6 ~) {7 p/ B4 a3 Z% _下载FreeRTOSv9.0.0.zip解压如下图
; k1 K1 b# o; N/ n' d- b( ^0 u+ F) P( D: m
/ F2 ?' T5 h5 x4 L0 C
# ~) }. f V7 V
只用关注第一个文件夹FreeRTOS中的内容" M/ B- W5 V/ ]; X! W- A5 B
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。1 {/ K6 J# L0 _1 k, D2 Q4 j$ M" ?
Source是源文件。3 f% y" s9 I! d8 w
% K2 f) p# W* a% u, N
2 [7 \* x7 }5 G1 C3 H4 v4 o
2.拷贝源码
/ k' f) g1 O5 j M! h4 i C4 O2 S在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port! z7 w( G/ @$ p( A/ @$ y' B% `
将Source/include文件夹拷贝到FreeRTOS下2 V( y& B- B5 P# q7 e
2 f# p8 T; M& l$ u
+ q7 y+ b; P, n9 O
) q) g9 h% x, M& R- R0 [/ u7 H5 Y2 L将Source中的C文件拷贝到FreeRTOS/src下! b+ s) c) u G
( @! _( m I( h5 Z1 `7 `3 y" p8 D
& j% i7 T; u( V) ^, x5 ~8 ?% [* i1 {2 i% R; d- S
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,. B) g' \9 N$ y7 t
3 |. b3 N( {6 D其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。) r2 B5 @3 t x( h/ L/ V0 E/ z
/ G! y- ~/ u" z- f7 L# b
2 H9 b9 @: Q; i( b' P; e3 U5 K3.添加到工程
- e& q3 g1 o F; f0 p1 j3 T+ N
' D/ d8 Y- \5 C9 `+ C
- Z; N# S" G4 {% R" _
- C6 p6 }' z- t* s! ~新建FreeRTOS/src和FreeRTOS/port组
, p2 v3 G7 `) WFreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加0 ~& @: s" M9 \* t1 c$ G7 S
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和0 H. t; }9 |7 V" A
FreeRTOS\port\RVDS\ARM_CM3中的port.c
* U- Q5 q6 S; I
; ]+ w; J' E% T
# z) {: M; o% Y C$ J0 j添加头文件路径; b& N# d& _! [' k4 Q0 f
+ v# N1 b: m; X/ B
" J. e7 S- }0 ]8 D2 n
) Q/ L! t; w$ p% W4 |拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程, B5 v2 t% x J! v
& t9 n5 b4 H4 b% r# d
5 J$ {3 K; H, s6 s. m; G4.修改配置& \' X7 e" v" R$ R
在FreeRTOSConfig.h中添加
/ e: a9 y4 E8 H% q7 c C- #define xPortPendSVHandler PendSV_Handler
/ _0 E3 z+ n7 F - #define vPortSVCHandler SVC_Handler+ t0 e. u& _# ]
复制代码
/ ^8 [; P" y5 z+ n在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断6 j2 o- k9 m- C& ]& u
7 D) U& o- r/ y3 Q/ h2 t
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。3 F Z! k8 U% E% V6 v; a
- /*** h v) o- ?$ G# j2 h
- * @brief This function handles SysTick Handler.) J% l1 T9 ^3 `
- * @param None
1 }, H& B1 i1 r9 O - * @retval None* `/ q: w! w1 A! k1 }/ C
- */# O, {( k ~) v3 c) d
- extern void xPortSysTickHandler(void);: w- k! E5 W% C
- void SysTick_Handler(void)
9 i. B4 y' q* p7 S3 Q2 c u - {# p+ S d3 a4 K+ M& D6 ^+ g1 X
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
2 R: T7 ]! D' ~8 u+ Z8 F - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)- T+ ]: M9 H+ T- m; [ ]
- {3 M& x1 I+ K, m
- #endif /* INCLUDE_xTaskGetSchedulerState */ / v- R0 z- \% G+ ]& f
- xPortSysTickHandler();3 ^- n9 Z( D9 O" G+ O! M
- #if (INCLUDE_xTaskGetSchedulerState == 1 )7 `* |3 p ~" Q# R. P, b
- }- o/ u9 b7 `( Y
- #endif /* INCLUDE_xTaskGetSchedulerState */
# P3 i. S$ s) N/ x! O - }: I; ^# e9 ~+ B& M. I
复制代码
* d# f$ N( Z, { h, M1 s
" T9 l w8 t# T5.验证demo# C" g3 v/ J9 y0 \
- #include "stm32f10x.h") J9 f' s: j% I, r4 q! N0 p
- #include "FreeRTOS.h"
5 h4 l4 V! r7 A+ `3 W! o - #include "task.h"3 J' _% e5 `* d
- #include "portmacro.h"& P( ^. x$ R1 Z9 K* r
- #include "bsp_led.h"
% p: g- V2 j" z7 d1 d5 \9 g - #include "log.h"
0 [" ?0 R, b6 i& Q - 6 E8 f! T0 |! A9 @/ r! t
- static TaskHandle_t led_task_handle = NULL;
2 ]: l% U) e- d* Z( A
4 D- {+ \- |; O2 U/ |2 b2 S2 Z3 J- void led_task(void *arg)0 d+ o+ \9 n4 ?6 V9 E9 `# y& H
- {: F2 x0 I. X% H# J+ \7 n* V
- while(1)
- l2 i' P( e; J - {0 v' v1 h# D$ I3 C m, z& F4 F
- led_status_set(LED_STATUS_ON);0 x. U! y8 N0 W5 r0 j$ ?
- LOG_DEBUG("LED_STATUS_ON\r\n");
* P1 W: L# H: z1 w3 K* R* i: K - vTaskDelay(500/portTICK_PERIOD_MS);7 L5 A( s& ]' |& i
- led_status_set(LED_STATUS_OFF);
( t( u. R! J3 W6 ] - LOG_DEBUG("LED_STATUS_OFF\r\n");7 o) J; j; _+ K" w& K- M
- vTaskDelay(500/portTICK_PERIOD_MS);0 O4 h8 L* }, d0 [3 r( {$ d1 r
- }* c( Y! S* E# l; |
- }
3 E$ ^4 V$ l# `" ~( l4 \9 L. u
& c0 v @% h W7 c7 d. q; X- int main(void)# ]& _+ G1 C5 n- u" f
- {, `2 }' R# t: q
- led_init();( I. \ Z, C% ?7 R9 q7 [) d
- ! s3 o. p T7 {5 ~
- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
% h8 f, z3 M9 t( n/ q% {" M - ; q2 N$ o: \# X
- // 开启调度* j e0 C) H7 l0 \6 G- k
- vTaskStartScheduler();8 n* r; g# l( D! w- p
- while(1);; d1 ^1 f2 V# u8 r% {- H% `. n' Y
- }
* ~1 w2 {9 I+ _" u! M9 f
8 u1 n: L7 p- U; }+ x
复制代码
2 _( `; F4 H2 r8 ^+ ]0 r) i) i$ X$ z! ~
6.完整工程) p, B' X! S# _/ r& e# t
* s* n- _( R$ }' N0 ~3 N
2 y: u$ N# e/ e p
" y+ i3 B; Y' Z. g6 s# F. h2 g9 g————————————————7 Z2 u' K5 ]! e: o. u4 z+ I
版权声明:无聊到发博客的菜鸟6 P7 k h6 o+ a9 f
如有侵权请联系删除
: `5 x, G5 X* ^+ F7 U! v% R3 _. _ x0 [3 b: X2 f, l% L# j5 C8 o
+ [; i& F" _/ N6 Z6 E" S/ n9 m1 \
|