**如何在** **STM32H533** **开发板上移植最新** **FreeRTOS**4 v2 H3 V& y5 W( M' k, u5 d
! M9 V% f+ J5 u# w- z/ p D* K" G8 w
1:官网下载FreeRTOS源码
* n( U: V( ~1 _* _3 d* Q9 Z6 L$ {: U$ _/ W6 v) Y
FreeRTOS官网:[https://www.freertos.org/
2 g0 H7 h0 {6 S+ }! o4 H) W; x/ f \. d0 g9 F8 q' m* `
1 l& P, p' F9 m前面一个是最新版的,内部包含了一些典型的单片机的例程,下面一个是长期支持的版本,相对来说稳定一些,所以如果是工程上使用建议使用LTS版本,如果是学习的话,建议使用上面的版本,毕竟有例子,移植起来相对来说比较方便。我们这里选择就是上面的版本。
V; B v6 `1 ~
% f* ?( b4 @( k4 W, ]官网上还有很多资料可以参考和下载,大家有富裕时间的可以认真研究一下。
/ S# [& u' `: b H
- a* D! B1 \0 b- z/ t) @' T0 S/ p: e6 t9 n( K, K* J# w
% H9 \8 P8 b) |8 p
2 找到合适的案例,完成文件的拷贝,我们目前使用的是H533的芯片,属于是M33的内核,我们这里就选择M33的核作为参考工程,完成文件的拷贝工作。
% k9 I) @6 E' s% K0 H8 _8 W7 z* s' |, Y, z. n& V6 D( J
5 a0 v3 c2 Q: f3 s0 d, R8 j
% N( ]/ |- c* X. i我们首先在已经测试好的工程下面建立三个文件夹,分别装内核,头文件,接口文件。
& |- B) g+ W, E ^7 k* n+ m
/ P l J0 m8 l4 d0 P接着就是拷贝文件了。
1 Y" c) ?* _6 x Z; k N' d. R+ g! l" v. r
" o6 l2 ?" d* l7 A/ \* T( B; }! |7 ?5 O7 F; ~* @
上面的就是内核的几个文件,对应的拷贝到Core 文件夹。
1 `# h; ?' u- x! W2 {0 D% b k2 } X2 x
! }3 q0 S# }3 g) G0 E4 M2 i: E1 Y0 [+ z- {
Include整个文件夹直接拷贝
' l B2 m& z1 R ?; O还有就是最后的PORT文件,我们按照现有工程的文件路径的文件进行拷贝。
. t( L, z$ n! R+ s0 e0 k/ e
; J; p- q6 D0 X. q" ~3 q1 {/ R2 z8 U
, B" _. e# P$ W
3 _4 x' b4 ]: ~, g+ a
" @- Y5 ]4 } ]- x& ]我们在工程内建立路径,并且添加文件以及文件路径。
6 K$ A: X( N& g4 W3 c# M" G0 }" l8 D% R' r8 X* k
手次编译出现如下问题,我们将宏定义做一下修改,不使用TrustZone。8 d5 L0 T7 |$ E* P' \
" t w/ H. g, y$ G- j8 a0 l$ _
- s0 X* j0 S: s: g5 L0 X. j/ n7 \
& F( I7 b. [) \/ I接下来就是我们的重复定义的我们将函数的内容拷贝到滴答函数里面去,完成整个系统的计时的要求。
! G, q( r+ V: `: y, d$ t# W) j/ N
2 W n, [9 t( Z4 p! G" U接下来编译出现这些问题,基本都是task.c 和port.c的,我们根据情况做修改。0 l6 R& ]0 @2 a# D2 P* K
还有一个就是添加heap4.c到工程。
5 D. N7 W4 i7 W6 ?& i6 M. Y5 {3 H1 r) j9 J+ y
% \, w* P, d3 }7 `) u5 ]2 Z+ \将MPU设置为0 ,错误会减少很多。
5 I0 [1 O+ O& {: J4 C$ W0 l3 u2 L+ B) y/ q ~+ R7 q0 L$ [7 ^
8 F6 m. L, ]4 k
9 ^# A) g6 z4 B3 w/ D- H然后后就是各种改配置,最后建立自己的任务,实现任务调度。6 M6 }4 h4 o9 u) z
" H$ H) N* n! Y5 w8 l4 D% T下面就是任务调度的函数,这里就简单发一下
2 _/ m; I5 E- W- T6 ?; y/ j; P
% g$ ]" D8 C! ~4 l- void Task_LED(void * pvParameters): |9 i7 n6 H' }
- {3 y$ N# [" q2 O) o4 v6 { _- r( e
- while(1)6 C6 X* y! V7 H$ T
- {) `, G" a9 g* E4 C" i3 K q' E
- LED_Test();
9 A1 k& a) G# k7 Q. v* b - vTaskDelay( 500 );/ U) G, I8 S) f$ x
- }
B/ o' K, \7 J$ C) ` - }
1 I6 v s7 A( N6 U3 f6 \) D; N - ' Z7 ~0 N, Z9 u
6 K6 Y/ t( v. a3 Z9 Q N- void vApplicationStackOverflowHook( TaskHandle_t xTask,/ I5 v. b ?) [5 y5 |
- char * pcTaskName )
3 l. s0 |( `% m# z: P, c: O - {
6 l& ]" Y& f S3 N5 a -
; l, Y+ o, m( r, ^4 B- W& @& q - }, g5 C8 O8 N! r2 o- O
- ! E l; H4 g$ R. s3 W
- int main(void)
# V- Q0 E, V3 ~6 O+ P F8 u8 n - {
% a k& p) \/ K/ p* C \7 j; g - SystemClock_Config();
3 e* Q# X7 v6 j - HAL_Init();! ?6 Y) ~- z* U4 n
- 3 z6 j! O& P: v2 O; ]% j
- LED_Init();
& p$ F9 r" }6 i% @" w/ O - UART_Init();5 D* z+ J. t# q/ X4 a: A" u
- TIM_Init();: |: U7 D6 y l. X0 |& L
- 2 s0 I5 C2 z& ]" `' U; ?
- xTaskCreate(Task_LED,"Test_LED",1000,NULL,NULL,NULL);
* R) O" f& H2 g' E- E1 a) a1 H' Q! D - vTaskStartScheduler();0 N2 i8 D5 X" L* ^
- ; D0 m, M8 v+ T
- while (1)' E E6 W# ^( A5 x9 a& R% V& i
- {
- U0 `0 a' ~, n - // LED_Test();
2 [1 }2 ^- W7 }0 Y: V - }
$ e+ f( C: P$ C) P6 C R - /* USER CODE END 3 */
9 }3 I; S- K! P) a) w L) ~* r - }
; r$ U4 S2 I! Z( d; |9 ?
复制代码 好了,我们就把源代码发上来
5 L# O* N9 E! Z, S6 `* \2 a9 q============================================== E0 e$ x8 r' C
RTOS源码:
04-Demo_Free_RTOS.rar
(3.15 MB, 下载次数: 1)
|
学习学习