前言! U: d2 I. G- _7 j3 [0 y
演示STM32F103移植FreeRTOS完整过程,文末提供移植好的完整工程
@" i' q3 N* e, X
( }9 l2 T7 E6 s- D. L1.下载源码
1 y) r7 G! T. B# [- S% W下载FreeRTOSv9.0.0.zip解压如下图
8 h( I( j& V2 S, `% L% L! l8 z# i2 a1 }' ?6 m5 }1 _# ^
) p2 ] K4 u8 G% ^
0 ?9 W7 C$ P" p/ K) o0 k只用关注第一个文件夹FreeRTOS中的内容
! W3 t# P- {/ W: s( d2 M$ S: ^
1 q* A1 _0 K( v; ]4 O+ H; a
4 |) O- H1 Z7 R+ }+ N+ K6 ~+ N% r8 @3 M( J- @
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
1 V' l }4 Y2 R$ ySource是源文件。' P' Q! e& i3 v, e. C5 @
" P; H p0 h& c, `& Q/ b8 t; C6 X! ?2.拷贝源码: K s6 [3 V) d, f" j0 ?
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
- _( g; k( ?, z* ~# }. E3 a9 p/ g) b. D" J5 I
1 m. P' r- o3 [/ a' c
" X+ c. m1 q, d ~( p' @0 {将Source/include文件夹拷贝到FreeRTOS下
3 u" r! y9 K! `3 H将Source中的C文件拷贝到FreeRTOS/src下% Q( }$ v* v# z
1 f) Z3 C* L/ J8 w; U' D2 l
# g3 }1 [' R2 ?( O7 v v& G* }' H2 V; ~; J* P% U" y2 [, O8 E
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
" s$ G5 c6 i% X5 `$ N) m- r r4 u
9 ^9 n) I v" l; ]* R其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。: M# G% F" V2 P8 V, c
: b! s4 C+ n. b4 p
: ^, }& n2 ^' o6 ?- y9 `8 x
( g. v# h/ q+ q7 J0 ~: o3.添加到工程* N. y P; Y0 {% r$ f) F( m" s: I" d( s
& N# b1 c' N9 h* h4 z: L
+ [+ ^" n, U$ E
- T, w& `$ m3 N7 v* l新建FreeRTOS/src和FreeRTOS/port组
4 o' r4 l. F3 I! F# H8 c
4 A0 g z. s! y/ E9 IFreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
3 x2 C/ y& b/ a% p3 |0 b6 M. T& |& @+ D" r& A; X/ o
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和
r' O. z, P+ h0 L7 e
4 _+ ?0 i- d- u3 |1 f5 d; a9 h! A1 N5 qFreeRTOS\port\RVDS\ARM_CM3中的port.c
0 H% U; D& h4 g8 X- y) e5 i1 K
% r; ~ [# f' t9 D2 A7 \3 x( D# g# a% x% S
添加头文件路径1 V. Q9 F5 `( j$ C3 v5 S
/ m, n, V8 r+ r+ X) B
7 G( }9 g$ y( T5 z! Y5 `7 |" P! {2 K. [& ^
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程9 l2 x+ f R+ u8 ~
& B; S6 a5 I- V v3 }% s
, C6 c& w/ i* ]" r! |% A
4.修改配置
9 I, B( z/ M$ R- v5 E7 r J I4 a在FreeRTOSConfig.h中添加& r, ^7 t z- ? S
- #define xPortPendSVHandler PendSV_Handler
2 p* K& b; u0 o9 p+ y: g6 W - #define vPortSVCHandler SVC_Handler
. e" o$ }2 ^1 Y
复制代码 9 R* z% i3 L0 V* D2 t( L
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
% d. M# v! V: l* u, V" E/ ?最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。' M9 w$ X) n3 z6 Q5 R( I
- /**
9 s! M. Q3 e. j. t+ g9 P - * @brief This function handles SysTick Handler.
1 _( b# \6 N1 P" w" m. ^4 `7 q - * @param None3 z' H# }$ i5 k+ }7 F1 c( {
- * @retval None
* F0 ]2 x- F+ H - */5 i+ l0 U, \. F3 {
- extern void xPortSysTickHandler(void);/ p) C- I% t1 D4 i# h% v0 j5 q9 A
- void SysTick_Handler(void)
' ? u* M1 I( X* `8 u - {
% q3 t$ h9 M6 M" d+ v! O3 E - #if (INCLUDE_xTaskGetSchedulerState == 1 )9 n/ V% X+ V0 K2 g% {. f$ G: i
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
! I2 |" Z; X* c. I4 _1 q# r - {
. F2 o! c5 d8 _6 `8 q - #endif /* INCLUDE_xTaskGetSchedulerState */
0 \; F5 E, ?7 o0 y' H& q - xPortSysTickHandler();
( m" ?, j" l/ W - #if (INCLUDE_xTaskGetSchedulerState == 1 )+ b! g4 L1 n7 V# y0 n K
- }
/ V, V0 N- k$ @& L) r H - #endif /* INCLUDE_xTaskGetSchedulerState */
! a; u! j; t v$ H7 M% n - }
t# I6 B& c# a+ C' G x- Z5 M% x+ x
复制代码 * v2 U, R( m! L2 y* b
5.验证demo2 d6 J, D1 \$ `: I5 A* l. t
- #include "stm32f10x.h"
& |$ M' t2 s5 v# I; e - #include "FreeRTOS.h"
: V( {' V( h2 }* g5 l' J5 x - #include "task.h", u3 a& c& g: U
- #include "portmacro.h"0 J% t @0 m+ {$ l; W' U
- #include "bsp_led.h" ( z# |1 t/ ]4 p; ]# O
- #include "log.h"
5 h" c, Y+ D6 d3 t+ F6 j6 }5 R - " t. i0 U+ z4 v3 P
- static TaskHandle_t led_task_handle = NULL;7 X$ V- N$ z: z; a8 m
' g) r! g2 t7 [9 h8 [9 _$ Z: Q- void led_task(void *arg) { ^ D2 f5 W
- {6 d; f) ~4 F( f; ^4 I
- while(1) 4 g( k9 t2 K0 u1 }8 h- j' O
- {& B8 G8 C* i2 @) I
- led_status_set(LED_STATUS_ON);
( z, H) ^4 ?7 B! D) A - LOG_DEBUG("LED_STATUS_ON\r\n");
3 q5 A3 Z6 k" O, J3 F( Q - vTaskDelay(500/portTICK_PERIOD_MS);
2 {+ x" ~; r. P2 [ - led_status_set(LED_STATUS_OFF);# B, Z- Y& V. x2 @: {! s% `
- LOG_DEBUG("LED_STATUS_OFF\r\n");
1 T0 a" u" k1 L! s/ h" ?6 B& G - vTaskDelay(500/portTICK_PERIOD_MS);
8 W9 i) @( R; Z# I) G+ P- o - }
( I0 D6 {, ?& X0 I/ ~/ |9 G$ G - }/ T: L* x6 u% Z) L
) x2 m& U: T4 u- int main(void)3 z' k5 X- }: h& p3 H: Y. ?) s
- {
& s9 j8 C3 X" C9 ~ - led_init();
& A$ H) ^/ P1 N0 h# |4 m3 N
- L* F3 i" [+ k7 o- i- xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);& _* _' f6 J) f/ b$ M& v
" _% a/ n' Q8 ^ k; ^7 |- // 开启调度+ t6 {8 w; h3 t
- vTaskStartScheduler();
. d! Y8 _* J3 U$ Z$ ~ - while(1);
2 m1 t9 `# l' U) U }! }# V - }
5 x( h5 Q- [; c- Q) `& s2 { - ) Z* y0 [/ ~, I8 D' I2 n3 o
复制代码
' c! D7 Y/ _. s1 U$ q w; A- V9 o; Z5 D3 b4 p
6.完整工程9 Y" b6 n+ X7 Y( ]- e0 J1 ?3 S
亲测可用; o$ m& ^! y, X% J
( I/ v+ Y( `0 W
& e0 A1 E2 P0 A) X2 f: ]
% o8 j# B3 X! u) i% o————————————————
, k1 {& G0 G0 W版权声明:无聊到发博客的菜鸟
( T: R: c/ Y' o. s如有侵权请联系删除5 g( B. F, L4 C
$ |5 |: a y1 p6 y6 o
" O- k8 j, x/ z( I, w! e/ s. H' h( y
|
完整工程呢???