1.下载源码9 o- ~$ [& \$ V$ D. ^1 f
下载FreeRTOSv9.0.0.zip解压如下图+ K' j% F: x1 M7 a7 g
. t+ ^$ H3 W/ J4 K
# o1 I3 f: J9 m) r9 C2 w+ b+ L4 d+ n! i( i# Y/ H1 u/ D$ r/ }8 @4 s
只用关注第一个文件夹FreeRTOS中的内容- {, [1 [2 J) B+ v6 l
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。& t5 u; E3 V9 @6 g: }1 K# g4 k! r
Source是源文件。4 z% { o& A. y2 M( F L3 I
3 `: N( B/ H* O; I
! j- x2 ?6 f) j" C2.拷贝源码
6 X" K! o2 Q2 L4 I4 P在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
( {' p6 O: Z8 m# c2 |1 Q* l0 ]# V将Source/include文件夹拷贝到FreeRTOS下" L3 f3 ^* v: A' ?, l9 G$ `
5 p: F6 x9 K5 t! a5 b
0 i" ?) q& s. j; n+ B8 i3 Z/ _, K0 b& l2 J' W2 w+ Q
将Source中的C文件拷贝到FreeRTOS/src下
* F2 k8 `( d& W z8 S
2 N) j) ]0 E* k# y1 |) I' x7 b
8 R; ]! n: O. b) t4 s& A* j1 {8 j
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
1 `4 y- X6 z' a O p" f- @+ E5 v' F, a. X7 h- b G
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。+ \2 _, {. L6 G3 I- D, e& m
9 C) U& E) S- A' ^
2 J' L- G2 p. p9 v+ Q
3.添加到工程
% B) ]& h- Y9 x
" z. |0 ?, H8 j
9 b$ y c1 b1 S8 D F: F6 Z
& ~) h' z6 F7 m: ~' b5 z/ l2 R
新建FreeRTOS/src和FreeRTOS/port组2 t; S' L* F, e! a& }% ^8 q: l9 e8 O
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
1 L$ K& R8 y" H* ~FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和
0 k8 e4 K( f/ k' ?FreeRTOS\port\RVDS\ARM_CM3中的port.c
6 O7 N" a" D4 M' ~) C8 t; [# x- y0 Q; c2 f
7 `" ~4 h$ \3 L添加头文件路径1 }' X1 j* ?0 W s/ Z
8 i! [: E D5 C) F! G
5 ]) O; G6 G7 T" R6 ^$ l7 G
p- m) Q7 r! q1 f" S! o拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程
; n2 |; r. ^2 S5 M0 z1 n8 \- N
# G7 s- }' R6 n( h- N' r7 \! a+ k: |* O( C
4.修改配置
. [% v1 `8 p" n4 F在FreeRTOSConfig.h中添加% {. c# m1 l9 v0 Z
- #define xPortPendSVHandler PendSV_Handler
/ X6 M' }' U' H5 W/ _. D - #define vPortSVCHandler SVC_Handler
/ c- J' v6 q) t, {2 @! B L
复制代码 + z( O7 d( F$ [% J! ~ D6 g
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断1 ^4 `/ k5 {, ~, r3 \
/ h/ u" l" z* O$ A! C2 |
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
* m# {& Z: R% x5 V- /**
; H# @, Q: e& `& I. K3 F0 P - * @brief This function handles SysTick Handler.
, Y3 A( |$ F! x4 J0 \ k" X( J0 q - * @param None; u- E$ d- B e0 |) ]
- * @retval None' F6 u1 I- {( q7 v, V/ {
- */
a& Y$ ^, j* u: ^ a3 V3 c, f - extern void xPortSysTickHandler(void);9 t0 _( F1 l: L! j
- void SysTick_Handler(void)
# f' \2 G9 Y6 E+ M- _. V, o - {9 K; y$ V0 |1 B, V, l+ c
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
% l# H ? Q$ b8 d% O, M8 z" e! o3 W; l - if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)0 D3 ]% g1 Y+ [- P
- {! b: I. F* P* {( X- q. F8 G
- #endif /* INCLUDE_xTaskGetSchedulerState */ * q7 o, ~ \, I: i* }3 D! t. ]
- xPortSysTickHandler();) m E2 X. u# d8 m6 M
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
$ G1 Q4 e9 N( x" W! ~+ j) @! b" J9 u - }! \+ A" l! h+ n' b6 f3 B0 Z
- #endif /* INCLUDE_xTaskGetSchedulerState */: h4 r: i( |& x' I7 |
- }
* ?# T# ]) ?. Y2 B
复制代码 8 y: v6 X1 T( n; @8 E5 R. p- t/ g
" G I, \3 e3 b5.验证demo
, T' F6 \. J3 [3 o1 s, `% D# W- #include "stm32f10x.h"6 L, c, v9 I' q& B" n" A: d8 O
- #include "FreeRTOS.h"2 U5 D% O& W7 R3 Q0 N6 u3 G) l
- #include "task.h"7 w" C f+ c/ B8 U
- #include "portmacro.h"; b( b7 z5 c( I0 t1 Y
- #include "bsp_led.h"
3 D, g4 `4 F0 W0 @ V - #include "log.h"
9 c7 y+ w1 x1 |0 X' @
8 J6 R9 r0 R0 r$ Y- static TaskHandle_t led_task_handle = NULL;
: C5 [( o M- s- a7 ^. s, o- q6 \# J
! j- `& C2 A, X) Q2 b- void led_task(void *arg)* s( W3 y/ M2 e: v1 O3 F B: i
- {
% V0 t6 T5 G2 u9 ` - while(1)
' D" ]7 {( U2 T4 U& x% d$ w6 U! i - {1 \7 T" d4 ^- Q4 a) K7 l4 t2 a
- led_status_set(LED_STATUS_ON);
5 n" ?3 g5 E b1 K& b: K2 c - LOG_DEBUG("LED_STATUS_ON\r\n");. ~' f; f. E0 l7 I+ ?& P" c
- vTaskDelay(500/portTICK_PERIOD_MS);
7 T" i# W* q4 P$ C* D u - led_status_set(LED_STATUS_OFF);
( ^6 M/ E* L& j' K - LOG_DEBUG("LED_STATUS_OFF\r\n");0 i, @# Q* [/ @( P9 m
- vTaskDelay(500/portTICK_PERIOD_MS);
3 c# a! }( v' n3 V' V) t - }
5 t( c) t/ d" x* h - }
8 {6 j( G1 N4 i3 \+ A
% g0 Y0 o' M9 ~: K' R3 c6 B- b5 O9 Y- int main(void)
; K4 ~. Q; i7 C8 Y$ g - {
- l+ A" I4 a$ _" G- r - led_init();
, y1 T6 R/ V' o) Y - + d; `0 x$ [3 O! y1 R
- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
' F' Q, Z( A2 Q2 d - 0 s8 E; Q& ~) o1 t
- // 开启调度 D5 g$ R# ?0 v& \ h. t, c
- vTaskStartScheduler();, O3 V! C4 R* `, G7 {; W
- while(1);4 d* r9 X( C! M
- }
" q+ g6 D5 S3 u - 9 G% h& z5 o6 [7 Y ]4 L* v
复制代码
6 l3 M" o6 y8 L- g' v( O3 u e$ [' t- Q: `0 {
6.完整工程- Z+ j/ n( Q* W$ P2 V
& v, W3 w4 }2 @2 x
+ e( |! x7 Y0 A k. f6 M6 k# R* I" I0 P& u; L: l0 ^& k; f8 ?$ j# ^
————————————————
; a$ [; u% u7 B; g: w版权声明:无聊到发博客的菜鸟3 s8 G/ w* `8 l& I' i- h( `; n; x6 L
如有侵权请联系删除
9 k& }$ H/ b! [* f* Q6 u$ K/ J- j* j C! q) e+ i; b+ W
9 V% s" ?) \. `3 h/ w
q. {. {9 C9 J2 g# o' b: G
|