前言! R+ F4 i8 G6 X
演示STM32F103移植FreeRTOS完整过程,文末提供移植好的完整工程' ~5 I' D8 ]# s7 y3 a* i1 W
& T* ]6 W2 f8 c( R! m4 `
1.下载源码
% V- m$ V) P7 O6 F下载FreeRTOSv9.0.0.zip解压如下图
* Z# s* k0 H N' ?& ]5 k
- G2 V7 e2 o7 i+ z3 f
! e4 p& U4 Z7 f O/ Z& }+ a; B4 N6 j! x* P' q. O
只用关注第一个文件夹FreeRTOS中的内容
2 D `2 d, L. b( h8 ~$ [3 u$ ]! g! r6 \
5 }$ M( T2 p8 u% U! J) s
4 ~3 i- a$ ?5 Z/ NDemo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
9 s! ^0 o% ^3 t2 A7 A% USource是源文件。! A+ g! R+ Q( s# y9 L, z. u
1 q2 F' }8 I( }% F! y' c" m$ z2.拷贝源码
2 s# j& q) `5 R* P, O$ z f在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
t, j% n% _. X. p! y* M, @/ b% e, J1 w) C* m
+ a2 B# V# X. v9 y
9 Q$ m f) O( B' f- O将Source/include文件夹拷贝到FreeRTOS下
O6 f) u/ ?( ^9 l6 E# g& o h将Source中的C文件拷贝到FreeRTOS/src下) D; v8 A# ?: q( J8 f! n. ^
* E2 p2 ?) R, j1 C
/ s* F* f: Y& d% K% C
7 z; K, S( J, \ I1 ~' p将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,+ z9 @! L' C% o' B) [
0 Y I3 X. }" e1 ], B4 Q( F0 D其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。1 b+ }5 c6 }1 Q3 S+ \# U
8 i) p$ v7 V- F0 @% L0 c; Y e" `
* l- {4 s, C" d
5 b' J7 }1 v" t f3.添加到工程
1 Y, e# I h, c$ }# i9 x' R/ d
" Q; a5 d: `) Y- y* ^- w! a* m" V5 a
' h7 p8 [9 j- U* i3 H
- ]$ |- A% o9 V6 h# e/ a! i新建FreeRTOS/src和FreeRTOS/port组
, t- d# o8 A2 U# P& d3 R$ |* F& d* p: H9 p3 Q" _& L8 ?2 w
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加. l$ S7 a( c" R5 o( m0 N) M8 J
) ~+ j1 y/ p% B6 o' B
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和& Y$ H( {2 x0 j- x
1 }$ J7 w# y! R2 H+ _! Z$ h6 g' wFreeRTOS\port\RVDS\ARM_CM3中的port.c
8 c7 A+ {' H! z; M# M0 ]" ]* j: S' w4 u* O" S: P& b+ }
8 b4 x( O/ S- i! D# Q& {! H添加头文件路径" { Y; J" t5 c* e
+ e" Q7 w2 ?$ o- x! b' y* x
N5 H7 ^, [: z3 z: `) C
1 B; }& a" t( v* l
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程4 P2 r: @3 S* y9 P. P' p; a
1 X5 Q! k q8 Z$ r% m# Q' _3 E1 U: B+ ^1 P% R: \
4.修改配置8 X( h, F8 }6 _. I# J+ B7 f
在FreeRTOSConfig.h中添加/ V$ ?" T9 P: ~% B# Y: o8 _
- #define xPortPendSVHandler PendSV_Handler
6 e" M- I) l1 b4 P - #define vPortSVCHandler SVC_Handler
# [) i9 m0 W. `( s
复制代码
* Y( L% T& q9 F q在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
8 T' K# W$ w* N" ~- g8 X最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
9 c1 f. H" D+ [3 n4 `3 x* z1 D- /**
$ J/ q* H/ U+ Z5 V3 r+ K - * @brief This function handles SysTick Handler.
0 Q. y) `- f) I( S- _8 u - * @param None" T5 ?# ?& N" c
- * @retval None
) G% P" a3 L! [" b - */
8 Z7 X) Q# \! Y9 j( w, a. C - extern void xPortSysTickHandler(void);
' d3 A* P$ b$ ? U. M - void SysTick_Handler(void)
5 ~& m1 O0 ]- @* r8 O - {
/ `2 n& ]) n' s% T! ^8 W* Q! |3 o - #if (INCLUDE_xTaskGetSchedulerState == 1 )5 \7 F {6 n5 v+ W0 M
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
% x+ U6 R D/ v+ b9 W K - {
& ]: p+ ?/ r) A! e9 f - #endif /* INCLUDE_xTaskGetSchedulerState */ 1 J* d7 ^5 k8 Y# R: Y+ e. s% T
- xPortSysTickHandler();
8 Z; y k* y" j. K B - #if (INCLUDE_xTaskGetSchedulerState == 1 )3 }3 I, k$ p( Z' {( \) S+ G& H1 {! \
- } g: K j$ W1 m% I4 ~# N: h
- #endif /* INCLUDE_xTaskGetSchedulerState */4 Y P: D, G% I8 v9 x
- }
4 H3 t% Z. G$ T' w& L- b w" T# I
复制代码
' _- Y! O3 P+ h+ M5.验证demo
t* F/ X8 M) @- #include "stm32f10x.h"; C( J2 k. f+ r% u8 u" s1 K8 C3 r
- #include "FreeRTOS.h"
1 X( f8 T3 S- {- @ V1 \( d - #include "task.h"
: g* G w! N9 B - #include "portmacro.h"2 X0 m* T- f: J: u
- #include "bsp_led.h"
, ?9 v5 z! x3 E+ B- o. Y9 L - #include "log.h"
; ?: e4 Q, w: E" v' d; `$ n - * Y0 G* k8 k. F& u5 L, S. j
- static TaskHandle_t led_task_handle = NULL;7 t. K: s- T: ~& O
- U6 N& _( [6 S1 F Z- void led_task(void *arg)
. _* h0 Y$ l5 a5 `' L8 N - {# t0 s5 e+ k5 d! Y: A M
- while(1)
/ f" y5 r) b9 N Q' h. D- e - {* X l9 |1 E8 H
- led_status_set(LED_STATUS_ON);
4 J( w+ m5 b" U/ G2 G1 } - LOG_DEBUG("LED_STATUS_ON\r\n");3 \* `& r/ }2 q+ {4 G/ U( x/ ~
- vTaskDelay(500/portTICK_PERIOD_MS);
: K# u9 O! \( _/ O- B5 a - led_status_set(LED_STATUS_OFF);
8 d% Z9 s+ L4 B. F* a - LOG_DEBUG("LED_STATUS_OFF\r\n");# N) i1 O% c6 a5 I
- vTaskDelay(500/portTICK_PERIOD_MS);9 A, L* Y" s% M& A! X
- }
4 \) j2 r: {* D* |" S" S' `7 U - }
- h2 x; | G5 n - ' N/ t! y: l; _
- int main(void)) V( {* i8 Y/ p* x* n
- {9 w( q0 x) z" E0 f
- led_init();/ d/ B( @% \2 E2 l
6 d* L( ~) Z% Y' n; p0 ]- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
% Z+ {1 z7 w0 r7 v) x
3 M3 U6 t; t% J5 Z3 c2 J- m6 K- // 开启调度
( V) U. P4 T4 s; _) b - vTaskStartScheduler();& I: h' @( Z X3 w/ b
- while(1);. V' Q, y% n. m9 x6 l: J3 F1 N
- }( g. o. q; p, F; i3 ]
- 8 D, g) A* @7 C5 H8 h
复制代码
+ @* P9 E9 S2 c9 D7 R/ E2 i6 R7 e& `; }9 p
6.完整工程
) ?' v3 _; i* Z6 a* K) ?, n. T& i) N亲测可用3 g9 J! J% ]( v8 |! @+ d" q& B
' G2 s+ k+ ~5 f+ f$ m l
7 X5 \! `* Z* R6 T* E! R/ i! c* B! b( M' u
————————————————5 B* m" |. l" \2 {0 \# s
版权声明:无聊到发博客的菜鸟
6 R: Z: W5 T% g( Y$ Q如有侵权请联系删除
, \; y' t7 q# [5 |4 S+ S( \) B8 d: n+ U- h$ B; v" @
5 ?% L- \# _/ V
|
完整工程呢???