前言
: q8 k' r; t/ [; k: X- D. L演示STM32F103移植FreeRTOS完整过程,文末提供移植好的完整工程' |; ]7 t: R' c C8 b
v# w4 F4 l/ Q1.下载源码
$ g: [6 y/ H' O下载FreeRTOSv9.0.0.zip解压如下图
# M; P- j4 Q" O. X6 P- ~: q2 l3 `3 P% v$ A
1 O1 _/ V5 z# i- ~8 N" s' q9 y; q3 @2 f. S. s
只用关注第一个文件夹FreeRTOS中的内容" i% b# d: |% O2 p, X) \! V
8 |: u( H) d2 l Q6 a9 G
* O. M, l* j2 q- J& j
- J! ?" c( A( P3 Y) ^* \/ U lDemo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。; `' N' b2 N! ^
Source是源文件。
$ {' s2 f* l/ P; M0 z! }
6 R- F) g: c# x2.拷贝源码
+ K3 v0 X+ \2 @& j/ a在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
6 F _: c" Y3 L- T# L) }
; H9 l1 z5 t1 C& G6 u; m8 |* E4 n
2 t2 N: C6 J' N* d( x2 s
- y8 c, T$ [: \将Source/include文件夹拷贝到FreeRTOS下6 {3 O' Y k0 i. W& V
将Source中的C文件拷贝到FreeRTOS/src下
( ^/ j( J% O* g$ u: s: e/ ?
2 k' a" X3 k; ^3 M$ v
8 H. Y" J- Z% Y/ f4 T2 i( b
( g- J* ?" r$ q
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
- B1 F& ^. [+ y+ M5 |
1 n# [! C9 S" v" ]! F' \; b其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
. w' R' a# o- Q1 M! ~+ W3 o0 C4 ], F1 x" s9 u+ c$ p- c. n# g
# j/ T" m+ P8 E" M& v% ?( Q; L, t
: y& ]6 |8 C- c' k3.添加到工程3 I. a4 ?# j2 j( g2 t
4 }5 \! k' b0 {; _( X8 Z0 E# ]3 a
2 f$ }5 j' A( v/ D# x4 w
& Q$ C$ c& a- z* q: k6 t& V- L新建FreeRTOS/src和FreeRTOS/port组2 T; ]/ F5 q3 i5 c
0 @8 e2 Z y4 O% i! S. t
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加# c2 C% z; ~1 D$ Y7 n; k
$ {" _3 N2 L1 L* \; Y. D* i
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和# i$ Q+ x4 p, h( X- l; d, {: d( m
. f0 t: d p! u p5 [# N& p( F0 p; EFreeRTOS\port\RVDS\ARM_CM3中的port.c
: d- H$ r3 u8 J1 P# [ Q
7 Z# V ~/ z9 L* T6 e, w
: z4 L9 G: y3 X% ~" |添加头文件路径3 P5 m5 D% e C* G- g5 E: ~0 }( c
% j1 Q6 ~0 b, [
: W5 ?! t( ?( @0 R) o. e' ^5 z; G$ x# g: j" N
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程. k0 s8 ?$ G( c% M/ d. j! J
# _, Q5 t8 }" _3 {9 p" x3 b
; S' S) b2 b8 ?$ ~& |( i; q: L# ~9 A4.修改配置
, K4 V3 x0 S) Y! t7 F在FreeRTOSConfig.h中添加
$ t# k/ ?( }# M- #define xPortPendSVHandler PendSV_Handler9 D7 _! U' P+ Y8 m8 b) _
- #define vPortSVCHandler SVC_Handler* P" c& Q* B* E+ x: _2 n7 r r( z
复制代码
; R) U9 o6 f# _& I在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
4 U! r% B9 @% o H" Q最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。+ O0 x: i+ J. L W; f o: ~
- /**
* W4 u* ~0 p4 T D7 d7 I& ?) q - * @brief This function handles SysTick Handler.
; C7 p' x) @5 t( M, H } - * @param None, I# q) w, L- G; {/ h3 m7 l
- * @retval None
' R* k3 ^, ~1 ]# q! G |9 l - */! g* l4 p8 o8 I9 W: [
- extern void xPortSysTickHandler(void);
6 t# e% P% ^, |6 F$ p - void SysTick_Handler(void)
+ {, ?& @3 S5 K6 l - {. k# k" n2 g2 G# z
- #if (INCLUDE_xTaskGetSchedulerState == 1 )5 F9 R$ A" [# `) F3 s$ G
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)! M' M/ J; b7 D+ C& v; F3 D+ O
- {9 h) A1 R2 D" L# o' g/ Z
- #endif /* INCLUDE_xTaskGetSchedulerState */ ( K9 {( Y7 v( O& P
- xPortSysTickHandler();+ S9 U" I$ T9 x5 K2 L8 S
- #if (INCLUDE_xTaskGetSchedulerState == 1 )! J' I; E# _' D. t6 F2 E- q
- } e, f' H+ ~' E! L
- #endif /* INCLUDE_xTaskGetSchedulerState */
& }8 K }# Q, d- a - }$ b8 F3 i6 l" l' L
复制代码
; m ^( a) e5 |; X) x5.验证demo
9 \! Q$ \7 z5 n) t2 m5 E- m( w- #include "stm32f10x.h"
5 ^5 V2 S2 o7 r* K! K. u4 m - #include "FreeRTOS.h" l0 K! A( [/ b, ]7 ?5 \
- #include "task.h"
* e6 v2 Q" ]. x% h* {/ ~ - #include "portmacro.h"4 z D8 n+ \8 y. |) h. m: |
- #include "bsp_led.h"
; W+ e; I* N v7 l2 m7 ]! d - #include "log.h"! f- @ p" O* A+ n7 O+ h
- 4 t! E5 w. j2 L/ [ i, b! D
- static TaskHandle_t led_task_handle = NULL;& h" s! Q5 s! c% A8 B1 M1 W: \
8 P( s6 }; J, y+ f0 t2 o1 y- void led_task(void *arg); r1 W# i& a6 y. u
- {
" S+ Y, S& T" ~% n - while(1) * c/ x' X5 M; q5 Z/ Q8 J
- {! p" z! s! I. d9 C' J
- led_status_set(LED_STATUS_ON);, p+ k5 x4 i) p
- LOG_DEBUG("LED_STATUS_ON\r\n");
: ]8 X( b, C& g# M - vTaskDelay(500/portTICK_PERIOD_MS);7 {% B+ w9 P. G; Q. r* g4 }
- led_status_set(LED_STATUS_OFF);
V* i" @( l, P! l% d - LOG_DEBUG("LED_STATUS_OFF\r\n");4 C. R" G. |; O6 ^$ o2 w
- vTaskDelay(500/portTICK_PERIOD_MS);/ c* @& e9 p+ ?- ~% h1 i5 ~2 L! [$ i
- } Q9 b& u j# z3 C2 c
- }
5 C {) V g- z - ]9 o/ v( m+ N5 t* D
- int main(void)/ \; a8 a& W; Q7 ?& t; B M
- {# i9 g3 ^8 d+ F
- led_init();! k" R* A3 Y3 z6 J0 X$ b
9 v0 a5 R6 c. ` T- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
6 y) Y* i2 M0 D- N) ^
: U6 z9 y( l) w7 |! M- // 开启调度
& y5 @) Z( t! m3 @6 L - vTaskStartScheduler();5 z, s& L* r" i
- while(1);
# P2 `- t( g8 ~- H - }% B& j0 y$ U* f# B: T" p- K( x
( i, ^4 z! b2 Q
复制代码 / s4 _* T+ Z( l+ K0 L
3 }& P+ b+ S* c! f9 Y9 J' Y3 t6.完整工程
3 C ^) c* P6 B% @6 J亲测可用6 b. v) s; P q
( }1 V+ A6 p0 _2 B; f! l7 G2 y: ~9 O
2 }& @# Y# R3 x0 C8 I5 I6 Z% R
————————————————
" D2 @4 ~! o) {" m, a版权声明:无聊到发博客的菜鸟6 P1 q) l0 U `, n, ~8 i
如有侵权请联系删除* X& D' N ?/ _+ T# A
* ~1 t' i2 \, m K; p5 k' N/ {
$ ~- ] t7 V0 w; G4 }* y
|
完整工程呢???