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

基于STM32F103移植FreeRTOS经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 15:28
1.下载源码; _7 P* z$ X( q. }6 f, d3 V
下载FreeRTOSv9.0.0.zip解压如下图
) P* \, ~; M; K5 q, H' |; Z: h1 v# x
19e323b668614914b5ff1c3650318367.png 3 \4 x3 h' j4 _

- i) n. u  z8 P2 P- z5 r  l. Q只用关注第一个文件夹FreeRTOS中的内容  u# H* _, k. ~* p# l  ?
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。- s- W! G% `: ~& H+ `# c
Source是源文件。
  h9 M" N8 g4 b6 z% P3 X$ `1 D% g+ O

0 h+ ^2 `4 U8 c/ T( a2.拷贝源码
2 l, R6 @. u6 c8 M: V* w) `在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port1 ^; Y5 \! t* n1 R! P
将Source/include文件夹拷贝到FreeRTOS下0 I; [& N& L% q9 a# K+ G3 B

; p6 H, s1 g% t& z3 \' [
0e6a2341df8d4aebbfc03d0c85c6f52b.png
5 j9 A( Q' f. L1 h9 F4 h
6 j" t) [! w7 z8 i8 r+ t3 @
将Source中的C文件拷贝到FreeRTOS/src下
! g* x: M9 y/ o7 {; `9 s" U/ y. K; {' |0 X( t
8084ebe3b4ff42ceaf1f92bb20c56e8d.png
' e  i) C9 |* w

. z8 U4 e* }  n- p& @( p将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
( ]" \; U) g4 l* f
4 Z  ~. u5 ^0 S( B$ N; _) G
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。( e* A# V( I, Q

4 L0 ^3 U! u4 e6 `
3d367e236be94ca5ae616b13bd3072ec.png
, ?1 A5 r8 A* p' i1 p5 B# j7 F4 `% |3.添加到工程( }% u! T+ s/ N. ]; W/ m0 ]- e1 I8 T
. E. r0 N. n0 \' Q, j1 M6 r8 b$ U
2529a830445449c6ae890e724efa39fe.png
8 T4 V) n. @& N% F3 @

* t8 U! q/ N0 `0 s1 l新建FreeRTOS/src和FreeRTOS/port组1 |: q, e% E; x/ Z6 @9 F% N3 K
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加/ e' C/ k( c! O' q% C( j9 e
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和3 E  Z2 b, e  S4 y' j
FreeRTOS\port\RVDS\ARM_CM3中的port.c2 g9 r0 `. @7 q. x: H7 C# S

+ w5 \' O, e1 |& ~& b4 O" v
1 K( L0 c( y& O' {2 ~3 k& H
添加头文件路径8 b. {* M' b# E& W  `0 ]. n

; s/ {/ R  J$ ?) P& o, q
ae4795e36a2d44f09b120be18c5d4c56.png + z2 f3 w9 Y# _8 z6 J+ k
3 M$ s  n4 {6 I+ p
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程
8 e' ?, j9 G1 K( R& l9 J  B1 l( B" ]. z3 r+ L" w( Q5 H
1 a) c; a0 S1 `& c
4.修改配置- W& Q8 x1 Y. I. v  v# c7 K
在FreeRTOSConfig.h中添加
8 g8 ~( m! d8 V1 F4 T3 @; M& b8 r
  1. #define xPortPendSVHandler         PendSV_Handler, u# c$ J+ _" g
  2. #define vPortSVCHandler         SVC_Handler
    / l) {1 _" `4 S; D: F( b
复制代码
: q1 p9 W& Y* H  J' H
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
. A% R+ z# W: J3 J! r. h
2 j5 E6 T; c( P! W2 ^( x; R& U最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
0 B; s% x5 w* S" B: C* {
  1. /**
    . a0 V& ^# P2 a6 k& ^! M3 N
  2.   * @brief  This function handles SysTick Handler.) U& p) @" p) j2 J3 t8 A& {
  3.   * @param  None9 m' G4 r3 |; H
  4.   * @retval None
    ) P$ u1 U- c/ N- z# y/ _
  5. */8 K; u1 C3 R: H4 N+ X
  6. extern void xPortSysTickHandler(void);$ ?7 x+ I- A2 |+ B0 R$ E" j
  7. void SysTick_Handler(void)
    0 C: I) ?2 p- L$ D5 V
  8. {( e  D3 G: I$ a5 o8 a
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 ): p6 q. c. K% f7 }! s4 [+ m3 J
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)1 f  n* |# n9 a
  11.       {7 F$ q  Z/ B, w
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  / B( d% y4 H/ {' d/ K5 o8 _+ F
  13.         xPortSysTickHandler();
    ( }- X& j. `" m& m
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )7 G" \# b5 y6 B1 Z/ l
  15.       }! j. o& t7 |: X8 c
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */; s* J% p& H, Q1 h, T3 _# n
  17. }
    / q% B! h$ A5 c+ l+ x7 S& e
复制代码

: a6 ?* e/ c6 G% D$ o6 H. q

$ U* d( k! S8 y5.验证demo) H% T. x7 R2 a& L$ q, v
  1. #include "stm32f10x.h"9 V0 V) _: L# R) C7 W. E
  2. #include "FreeRTOS.h"
    4 E3 u) W+ i' Y. i. T7 z; ]/ A
  3. #include "task.h"! f! z3 y6 m; W7 w* K% P9 g4 R5 b+ Y
  4. #include "portmacro.h", C  b. F+ x) E- M; |
  5. #include "bsp_led.h"  
    # ]0 D& \4 F9 g6 c! K
  6. #include "log.h"
    + p% Z; }7 J4 S+ [; q2 \+ f/ y
  7. % ]9 T# j% A3 v7 W+ j
  8. static TaskHandle_t led_task_handle = NULL;* ?& E$ o* W  X3 N6 M7 Z' C7 d; E- E/ @
  9. 1 R( ~) [: Q- J
  10. void led_task(void *arg)! I/ d. N+ F8 V7 P! n' m
  11. {) o6 v. x. P2 U5 n0 J/ p
  12.         while(1)                            2 W  u% K( a  v8 Z8 h) K3 W
  13.         {8 r) k5 b5 U% K8 }
  14.                 led_status_set(LED_STATUS_ON);" ]  J9 z4 g2 s' s2 h
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");
    ) o: }3 a; R0 K9 X8 H1 n: F
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);
    & w0 c) R3 M$ _$ n2 t+ O7 K- K$ o
  17.                 led_status_set(LED_STATUS_OFF);
    $ E9 i6 j- o+ q
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");+ p0 v1 e4 d8 Z3 a2 ~
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);
    & M7 r7 n! E6 x- _- V
  20.         }0 @; O7 d1 U  c# D$ t* v; c
  21. }
    ) I( A- d- E6 |7 e# w" r

  22. # {' D8 s4 K9 a; x$ o! Q; l* ?
  23. int main(void)$ \  H" c3 x/ o' p; Z3 `
  24. {
    # }( j1 Z7 R( s8 G# [: d8 h
  25.         led_init();, T$ I1 _0 }/ V, ]) P9 D

  26. / Z6 H& g9 P& V$ C# r5 s) A
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
    6 @9 a& Q; X( Z  d3 L

  28. 8 E& e: w: g* }+ E. O
  29.         // 开启调度
    - Y+ b4 C" q' k9 `
  30.         vTaskStartScheduler();
    9 S4 T  j# T$ t# l
  31.         while(1);
    ; q. u# X2 |. S" ]5 F) b
  32. }' C" t1 b* H( s
  33. # r' O% m0 t  T" F! Q9 e2 w
复制代码

( b, |& G5 Q" z4 g4 V- M8 z) I
, B4 Q/ Q# v3 V6 S# J3 C1 r6.完整工程
  }- \7 K$ O' m& v4 N# }
1 z$ {7 }& A- e$ ^3 G* E 2ea8ac08b3934dfb89592333f3832937.png
6 L3 f3 }( P' S& t' I  r
  [' s  |+ D  t( p! \
————————————————* n( ?% @1 M$ K' Y! j* \$ a/ I
版权声明:无聊到发博客的菜鸟
& J/ s  d3 l. S/ f如有侵权请联系删除
# `2 N  t  j/ I9 ~9 A7 d  l' j
' M& e" i! o5 d, r* _, O3 {" c6 S) }1 e# \0 ?* j# f( q* ^
! P5 h, O, m) [3 R
652df39d09bf4de399b0792b897a4205.png
赞 收藏 评论0 发布时间:2023-5-1 15:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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