你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F103移植FreeRTOS经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 15:28
1.下载源码. k$ w+ ~8 P% t( r8 g+ e! e) I
下载FreeRTOSv9.0.0.zip解压如下图
! c8 \0 ~8 G8 p( C" y5 P
7 B9 Y; ~7 k$ v- l5 v
19e323b668614914b5ff1c3650318367.png 6 F( y! b2 n/ h4 Q; M
$ T% ]1 Q  u8 p3 z+ x7 K
只用关注第一个文件夹FreeRTOS中的内容
/ k0 u$ _6 H" }' V- \8 H: s# [Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
/ O, m! a& e5 i$ [! tSource是源文件。8 ^6 Q! m8 B$ x: j3 o: t7 n

$ a# k. n! F% _9 ~" D6 E
6 B! T/ g# ~9 p8 U  k+ B
2.拷贝源码
  M( N( a1 |8 _. X在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port# u( P1 c  Z; j/ m. o
将Source/include文件夹拷贝到FreeRTOS下. A& _$ f; |# E2 a& I

! ^& N( s) P7 a7 ~0 u$ M
0e6a2341df8d4aebbfc03d0c85c6f52b.png % A+ [6 t* h0 z9 \/ z
9 g" l+ i+ s4 ]7 b
将Source中的C文件拷贝到FreeRTOS/src下( L% E+ Z1 W* u( n  O5 |2 [

: K, R0 w$ V5 c9 x
8084ebe3b4ff42ceaf1f92bb20c56e8d.png
0 \  k5 c( K3 U9 Y7 i: _7 ~
) o* L- R; m1 o' p0 |
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
- B# w5 X( k: r/ F7 L" {+ f5 j$ {; d. F; [' a' c; p
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
2 K+ O: i' ?4 L- ^9 o! l" |: \3 E. N; ?% o
3d367e236be94ca5ae616b13bd3072ec.png
' r! Q8 z) D, ?6 D% o3.添加到工程
, [: l8 I- P  U- t' o5 [
2 l, b& ?7 g% C! X
2529a830445449c6ae890e724efa39fe.png
. {) [6 T+ t+ \& Z! |

) L0 x) F: t! L( L  ]2 r新建FreeRTOS/src和FreeRTOS/port组5 l& l, ^! V1 t" h6 \
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加  O1 U* S' M3 Q7 |/ y6 o3 [8 g
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和! T1 |9 ]+ p- f  a% G* s
FreeRTOS\port\RVDS\ARM_CM3中的port.c2 F8 h/ _$ r( Z4 a, }

' o/ x  T2 G/ ^2 U. ]

5 R% {! b) l; g; F: B添加头文件路径
7 _3 b2 j, F7 n0 D* R* K# x/ U/ c; K: a* c5 r' P$ _* A
ae4795e36a2d44f09b120be18c5d4c56.png 9 L2 ~3 ], \  p5 l. H$ b
; n( ^- x8 M& v4 {
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程3 b& y% R& S$ `
( T7 m0 q) T5 G( r! l
5 R" a* y0 B7 Z3 W
4.修改配置2 }: e8 i4 E3 C
在FreeRTOSConfig.h中添加; o3 C2 h* E# v( c
  1. #define xPortPendSVHandler         PendSV_Handler
    : ?+ e( [( p8 Y2 t$ E
  2. #define vPortSVCHandler         SVC_Handler
    & m9 h6 {0 C; X9 w* m
复制代码
0 n: Z5 T7 v0 {1 ?; X
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断9 e* Q+ k/ K1 D  r- _. F& f
  p) I& n: a  X- s' u
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。3 k" ^: _8 r" a! L, X, Y3 ~
  1. /**
    0 R- v0 F$ p1 i8 G+ N: E4 U
  2.   * @brief  This function handles SysTick Handler.
      b6 _" v. W: l6 p
  3.   * @param  None
    8 U+ I$ D3 r9 n5 y6 X
  4.   * @retval None
    4 ]' }4 T1 e$ x% O
  5. */
    , y1 Y3 H) r+ Y
  6. extern void xPortSysTickHandler(void);
    % F! |, T( l1 u3 j1 m
  7. void SysTick_Handler(void)  ^( ]" F* ~3 h* P+ |( H
  8. {
    8 J2 c4 P8 x2 i+ h/ y  z# U/ i7 q
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
    8 Q) r0 E! E% n6 @
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)* }5 M: b* K9 [
  11.       {
    7 ^& L0 }. Z( p/ M  M* }
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  $ O' F$ B1 C$ z- U1 P3 h3 Z) p5 s! o
  13.         xPortSysTickHandler();9 v& {0 P3 y" M0 L2 K! i% A4 ^7 f
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )+ y. J9 T5 c9 i
  15.       }- x1 O4 L$ P8 {
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */% w5 U9 T; n0 p; U" ]# w7 U
  17. }
    & P8 @& j. ]7 z; r/ z0 d
复制代码

7 v! P+ U. q% P8 D' w. w! |; U
) k  T8 f& v  ^1 w
5.验证demo
, V' J! @: }  o( m1 u# o6 [( b8 C
  1. #include "stm32f10x.h"
    0 P# q( Q+ Z( A' ]; M0 l- r9 S
  2. #include "FreeRTOS.h"
    3 c: `5 l4 Z/ y# i" R2 M. A
  3. #include "task.h"
    0 S4 m! i1 H+ g
  4. #include "portmacro.h"- K7 O" {4 n( Q. o
  5. #include "bsp_led.h"  
    ) B! r3 ~1 V  F' g* b2 Y
  6. #include "log.h"
    , j% L8 l+ W4 }' W  C0 E9 t1 b

  7. 1 T7 L. i* c+ N* ]
  8. static TaskHandle_t led_task_handle = NULL;
    + D) j" @$ m5 \

  9. : J. c9 H. l- n1 X- c
  10. void led_task(void *arg)
    - i  |7 B5 a4 x8 m
  11. {* o0 x! o- ], Q4 E- ^& n! U
  12.         while(1)                            . u1 _# W0 x  ~1 |
  13.         {2 E) p5 u6 Z, H/ p. _
  14.                 led_status_set(LED_STATUS_ON);
    # @# Q9 T; L& h: s. A
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");
    % k" O2 H+ d3 B2 _# u- d
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);. J; `, C" g% \" a' x( c5 D5 \
  17.                 led_status_set(LED_STATUS_OFF);
    ) C, S; `1 G% a" @, J
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");2 Q7 T& _: E8 g5 b# C
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);
    / r3 u# ~  T3 O
  20.         }
    & z  P* k. P* @
  21. }" b& m/ K  ?" {

  22. 1 Q, ]- M# v) [" g2 G% ]
  23. int main(void)
    ; Y' ^6 Y# N6 M& F# A( }7 Q- W0 B
  24. {
    1 q& e$ `1 _9 _6 X/ J) D1 f# T- ]
  25.         led_init();% W% d. l- ]+ H' X% X6 g
  26. % R2 }% |4 Y9 l( f
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);9 z1 O7 R+ }! J+ D6 u

  28. " Z$ k' \6 o) Y% @1 g& X
  29.         // 开启调度
    ( s8 J9 K0 n/ g4 N# Y; o
  30.         vTaskStartScheduler();
      U) \2 k( ~/ i
  31.         while(1);# z+ }+ D( X: S  G
  32. }+ E! ]- m  K+ E( [  [' x  o& T

  33. 7 b' s) [2 z: }1 z
复制代码

, k# w( p# z+ y- q/ g" n1 D$ N/ T0 w/ X9 _# A: o# J
6.完整工程5 t" ^4 s) E7 ^- B, E
$ f5 w. B# X" b( S  ?
2ea8ac08b3934dfb89592333f3832937.png , [. ?4 s9 j" {& B2 Z& o. z( o9 L
" x5 j, g$ R2 Q+ z
————————————————
# u9 c$ G& ^( i) {4 ~版权声明:无聊到发博客的菜鸟
' ]- V  C$ d. s# D; T9 s如有侵权请联系删除, \; `9 Z7 R" }
; B8 B, L. }$ m( j( i5 f: q3 o
; s7 w% w! H( z7 [  X5 p/ {
; T5 o: M  M  ?+ ?6 T( X% g+ e1 h
652df39d09bf4de399b0792b897a4205.png
赞 收藏 评论0 发布时间:2023-5-1 15:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版