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

基于STM32F103移植FreeRTOS经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 15:28
1.下载源码
, i; M! I0 M0 X) M& j2 u  F下载FreeRTOSv9.0.0.zip解压如下图
3 T7 G" a2 l+ y. P
: F0 F' l" c; F1 g$ R4 d4 s6 U4 }
19e323b668614914b5ff1c3650318367.png " B) R+ Y9 L0 u8 n1 p" D# `, _" S

0 o9 N5 R% e6 W5 ~3 p" w只用关注第一个文件夹FreeRTOS中的内容
* s8 X0 `( p$ N. HDemo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。& P( @# f" {; _+ e
Source是源文件。+ P8 Z( K$ h6 ^

6 ^) E# `5 j+ w
6 \9 G9 E6 ]: D! k- g
2.拷贝源码! P8 e5 j3 r8 q9 V9 x
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port! `; e4 _' u0 p& w, z& _
将Source/include文件夹拷贝到FreeRTOS下
; [. T5 g0 c6 I5 c
8 }; T+ T6 C2 \* ]0 {& j
0e6a2341df8d4aebbfc03d0c85c6f52b.png
# [  r. x4 i3 v( l0 ?" F$ _1 X* Q1 p/ i

; c6 E; X: d; @' H6 f$ T8 t7 @# Y将Source中的C文件拷贝到FreeRTOS/src下
" J& B. j. t) l- ?) {( y& d2 S$ L8 q% G0 q1 x
8084ebe3b4ff42ceaf1f92bb20c56e8d.png ! J! U4 N3 ?6 Y0 j6 M
  g* U) q1 S* p3 a' T
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,, w& X9 @# Z  Y$ V7 X* U  d8 p
& A& z. ?! Q" V" H3 G/ e9 \4 T
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。& F1 Q: }& I- E+ g
* J& `9 N+ a6 ]; ~6 n4 Q' T* [. H
3d367e236be94ca5ae616b13bd3072ec.png
0 p/ f" V3 r8 x/ r3.添加到工程
: J/ }+ V! C* H0 u3 X
& S( r* ~" W9 M- k3 j5 f
2529a830445449c6ae890e724efa39fe.png + X# F  j$ |" O0 Q. q; s

$ J5 a  N' l& _5 r$ U新建FreeRTOS/src和FreeRTOS/port组
( c3 S5 T, L1 r" m+ A" R1 k  K* WFreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
' e: E' B' X) B3 L+ oFreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和5 _2 c1 x+ K% B
FreeRTOS\port\RVDS\ARM_CM3中的port.c3 q! C$ V" T- o6 S& x5 z- b, m- s

+ Y" ~  E& i0 [- q% ]6 n
) [1 m. s9 P; @# o8 V8 v( O- }9 g
添加头文件路径
) `2 J8 A0 a! }/ Z) h# u0 `1 `& |* c  v% x7 i
ae4795e36a2d44f09b120be18c5d4c56.png
1 V5 D5 G! k$ n; x

1 D0 o. `, ^2 T7 C拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程5 S3 f: d- |( C% ^1 V6 B4 ]

6 m7 U7 O; }1 Z- v+ {: s; b5 t' e

. A3 E. k2 t- J4 j9 s4 D4.修改配置
2 a2 s8 J0 L6 P& d- V: V在FreeRTOSConfig.h中添加
- M* Q  g- b. y' {2 V2 V+ W' P$ s4 L
  1. #define xPortPendSVHandler         PendSV_Handler
    9 [0 J; _" M, K* Y( ~
  2. #define vPortSVCHandler         SVC_Handler
    ( K. n7 |/ x: O/ u5 M3 ~3 s; ~
复制代码

& p1 Q1 k( z3 W5 k! w; ~在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断/ m- @5 Z" z. @: |& U! s
  {7 h% w/ h; e$ O
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。$ @! K1 \0 U& v5 _$ ?5 B; _
  1. /**: S( {% R5 O! o1 ]8 U( N
  2.   * @brief  This function handles SysTick Handler.
    0 H$ h* j" R' v
  3.   * @param  None
    & W" e; R2 t  Y9 x9 Y
  4.   * @retval None1 S4 U* z; F; ]
  5. */1 L) _; Y7 m" ^3 j7 K4 H
  6. extern void xPortSysTickHandler(void);$ X" b- i% n' m+ J: G  }
  7. void SysTick_Handler(void)# s1 O: H  F; ~& e1 N2 _
  8. {# c- Y2 J& r! R6 W* D9 |5 E
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
    $ E% f: f) h) C
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
    2 i) K1 D( [& @# ~' i* Z$ |
  11.       {1 q% @2 k, ]) z$ A
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  
    - u/ {6 A, i3 s* E5 l" I2 L$ \- S
  13.         xPortSysTickHandler();
    $ u# T2 ?; F. [" t4 L" g
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
    & |" y+ ?  w. U$ t
  15.       }9 D% S9 _6 {* M; E
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */6 v' Q: W1 i3 b+ G
  17. }
    0 Y$ _) Y* f' E
复制代码

" T8 L- q- d* z7 D6 i

5 z3 h# e- G9 U' }5.验证demo
7 i. g" R$ A! O4 k
  1. #include "stm32f10x.h"
    5 U5 ], R0 _* |$ }
  2. #include "FreeRTOS.h"
    9 Z) F: q+ X0 R& }. W9 d
  3. #include "task.h"2 d6 ~- E/ a0 e$ J
  4. #include "portmacro.h"& U2 y% t  j% g, K! }5 J3 \
  5. #include "bsp_led.h"  
    $ [! B( O2 ~1 u1 J; N/ ?( h
  6. #include "log.h"/ m8 P5 C5 ^9 Y0 w6 I/ n7 z

  7. ! ~7 f! F9 {  O
  8. static TaskHandle_t led_task_handle = NULL;# j4 q+ ]' Y6 S+ l5 I

  9. * ^3 J/ R  }1 Z+ T7 y, S
  10. void led_task(void *arg)
    $ e& {% f" v/ L1 N
  11. {
    ' \2 {3 B1 M% \. N, A+ U: W1 i
  12.         while(1)                           
    ' x8 V# O" m' O0 o
  13.         {
      `9 b4 L( k1 u" \( S2 ]9 F
  14.                 led_status_set(LED_STATUS_ON);2 e7 z4 }3 x( F( B" u/ c
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");
    . `1 ^8 @% h0 G4 M
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);
    # j& }, {& u: c  @6 A$ C. E- X) n
  17.                 led_status_set(LED_STATUS_OFF);
    # R$ P9 r) J. Q
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");7 s& M5 F' T* I9 n
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);: j0 ?1 W; f# G# X7 q* ~8 B
  20.         }
    ( z5 s# {; c: y; d  m: z
  21. }
    3 y+ M  c: Q. \4 p

  22. ; |* {- ]) y- p; q) h+ g
  23. int main(void)- i; F3 |1 `, a* G: K1 j" T
  24. {
    5 x( @4 w7 ]' k
  25.         led_init();
    4 X: J) Q/ k8 a* g  K: F0 u( ?* G1 A
  26. 5 J' ~: R8 o4 K* r8 H
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);$ y/ Z4 X: B. U* T/ G
  28. ) l) V( ?$ g+ n: l; U9 t: N9 e
  29.         // 开启调度
    & |4 k' F3 q: `( D$ O+ p) h1 Z
  30.         vTaskStartScheduler();
    9 ~, k: f% ?- C( K1 M$ m
  31.         while(1);3 u+ e$ N0 q+ b1 {9 @- p
  32. }* w  m# O& N3 A# z, {
  33. ' `1 ?1 J5 s, h. M# U) ]
复制代码
9 i9 Z/ [' S' R3 r3 \# @- S" z

. |, v2 R- F6 x9 K' A8 _6.完整工程
8 X" }" l. c0 V& h5 J5 f  Y0 Q( D' H, g2 g
2ea8ac08b3934dfb89592333f3832937.png 8 G9 L+ \5 J: g0 O4 m

6 d+ ]9 h! m1 Y: b; k————————————————
8 b* [6 M5 |# `  P2 n8 G+ y8 S, }版权声明:无聊到发博客的菜鸟
! M3 e9 O) A1 ^* s9 g+ H如有侵权请联系删除
' Y  g  b* t7 ^! L# Q- N
; i5 q- k$ Z' k6 u0 g! B0 u) P
! A# \4 \2 w' H. y& S' i
$ G9 {9 i5 d: ]+ |$ Z; v/ T( R+ p
652df39d09bf4de399b0792b897a4205.png
收藏 评论0 发布时间:2023-5-1 15:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版