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

基于STM32F103移植FreeRTOS经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 15:28
1.下载源码
8 M& [# Q- o4 ?3 F0 [. `下载FreeRTOSv9.0.0.zip解压如下图
( X* J* E7 U8 u/ G, z* |
6 K' Y8 m. t( U4 W6 J. d
19e323b668614914b5ff1c3650318367.png
9 r- q! ~$ ~% d- l/ v: M  s

. ]* d) m0 i$ b7 O6 K只用关注第一个文件夹FreeRTOS中的内容
) T. {0 J& C; p) VDemo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。6 w  P/ E, u" ^  f7 s1 l
Source是源文件。
2 V- z6 b# i) ]* O6 y; k
, D) W! F  M0 ?; v0 P: D$ M+ i

# `, p/ f! {) W" m/ R0 H- T, j2.拷贝源码. s2 B5 ^3 g8 c# q6 K! Y% d
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
) T1 c5 s4 A" ~; `! q; l9 \( _将Source/include文件夹拷贝到FreeRTOS下
. Y6 n1 v1 S2 Y' X; o% R2 Y+ k
( [0 Q% h3 ?% A
0e6a2341df8d4aebbfc03d0c85c6f52b.png
3 a9 h2 U  M" {; C4 @4 A

4 c, S$ K; r6 q4 f& t' w将Source中的C文件拷贝到FreeRTOS/src下
0 N! S! Q1 `( r' [' Z2 D2 B$ U# L9 G- }- p, O0 t1 a
8084ebe3b4ff42ceaf1f92bb20c56e8d.png - Z, l1 J, r- V/ g- c
8 A1 g! g/ g* e9 h  k2 d7 s" q
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
/ \3 `, P6 \& I) [. k+ E/ _0 }
! P# k7 Y* h9 ]* v  `: |
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
* K* B0 D( m: v. J! _1 C4 _7 d- h% u0 M
3d367e236be94ca5ae616b13bd3072ec.png 1 l5 Y+ Z+ A- ^0 H5 k
3.添加到工程
/ t. g5 P4 a$ V1 a# k  ?$ l! m% t5 d7 q
2529a830445449c6ae890e724efa39fe.png
1 }" L- t* @5 x" o
, }7 |& I% j0 Z7 |/ Z2 j/ X  |9 c
新建FreeRTOS/src和FreeRTOS/port组! W+ o% p+ j5 ]' I: Z
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
( _# J! \. N2 BFreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和! ?: D, y* H! x) w& ?/ J& P
FreeRTOS\port\RVDS\ARM_CM3中的port.c: D2 ?4 |# H+ m4 G7 S2 G& a! j
( y( m/ {: f8 o% S

6 Q; V3 h- p5 ^$ |添加头文件路径6 s" u* x, o6 k: ?! P9 {/ P
; P" d6 h* Z' n0 v8 S5 }
ae4795e36a2d44f09b120be18c5d4c56.png ( |  A: g+ M/ p: n. \* `3 ^

$ I9 ?$ A* {. ]# A8 V拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程' q2 g- E0 D. J+ U
/ z  |  [7 K+ v3 U- y! i! X+ I
0 m0 X2 ~2 _0 }2 [. Y
4.修改配置
. F/ \2 w6 u7 J; C5 v# k3 h在FreeRTOSConfig.h中添加- ~! G/ `! [6 K2 O  T8 Y7 ~( i
  1. #define xPortPendSVHandler         PendSV_Handler4 ^8 Q5 F0 ?- u7 x( B- O/ ]9 A
  2. #define vPortSVCHandler         SVC_Handler
    $ A- ~, Q" d7 k) l1 c
复制代码
% ?' ]; i2 R* S# d8 d
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断" C* }' M! Q' K+ C
6 {  D' ~9 n0 A
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。! ]9 m- @+ K8 [% [  l/ Y3 }% y
  1. /**
    8 F* j, h% D( ]; e  s4 D3 N* X
  2.   * @brief  This function handles SysTick Handler.3 r; ]$ [: N0 h/ c- b& X$ c) ?
  3.   * @param  None+ ~1 t; B7 G) Q$ E; x
  4.   * @retval None1 h7 k. O% W& k0 D* R$ k! E
  5. */9 d+ a2 f2 E4 G3 [
  6. extern void xPortSysTickHandler(void);
    8 v* [  f+ ]# l! ~
  7. void SysTick_Handler(void)
    % u4 E% f: P) d
  8. {0 ~2 e, F7 ?, A, c  x, r
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 ); |- ^7 u, T9 ~/ y' c  G
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
    . v5 f( v) L8 k' l: e9 n6 X
  11.       {
    5 O/ s( f$ b4 D3 q( s
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  ' m. Q# ]$ W4 M# ~5 Z$ Y
  13.         xPortSysTickHandler();" g+ f% O5 a+ c0 X
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
    7 O! I5 a! c! J+ }; R
  15.       }0 `  c, f6 r, W/ s9 W2 f" a8 }
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */5 J9 E/ F7 i# E! l( B
  17. }
    6 |/ t( v8 d9 O# V; N: ~+ E
复制代码

' S9 l2 e# T) M' Y: m7 E$ o# D. ^2 ~

& t2 X: c* x1 ]5.验证demo  Y7 r+ f  {2 z! U' ?4 w; d
  1. #include "stm32f10x.h"
    1 s9 L. Y' q7 ~; V3 o% x
  2. #include "FreeRTOS.h"2 C: I. X" V; H. h
  3. #include "task.h"! {: [. T( H! m# `  t& `& Q
  4. #include "portmacro.h"
    . |. \7 p2 e; i' A+ r- l' T
  5. #include "bsp_led.h"  
    * B- N. s! _% L1 A/ L2 u
  6. #include "log.h"$ t& O. N- U/ K
  7. 8 d, [1 k( y' e+ k2 [& P1 p2 }; `
  8. static TaskHandle_t led_task_handle = NULL;. v! `2 X( j/ e( b) S1 f/ v/ |2 ^

  9. 8 X9 v/ \2 c& W+ \  z/ m" T
  10. void led_task(void *arg)
    6 H8 m' I8 s; Y3 }( v- s
  11. {
    ! E7 R3 a; ]  Z  A, y
  12.         while(1)                           
    3 s: Y4 ?/ N$ h  ^/ F# j" H
  13.         {
    2 e) _4 j3 G6 ^6 ]9 h. w$ q
  14.                 led_status_set(LED_STATUS_ON);
    4 i+ m% X- ~( R
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");
    ! V, Y# u& v9 U& [2 j! }! u
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);. _' f4 q3 Z) G# b. w! t
  17.                 led_status_set(LED_STATUS_OFF);+ v! O& B! u3 P/ I! R* V) Z. u' y8 m
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");4 S" z& t, B2 _7 m$ f
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);4 I1 m; R  V) n$ t
  20.         }
    + M1 D# [% t5 S5 L: H8 C
  21. }
    - e0 I$ f7 ?, Y; z; B
  22. ; N. c, _* z1 E" Q. n  \7 W( v  n
  23. int main(void)
      s: q5 U% j, E
  24. {
    / a) N  z6 q; @& S8 J; ^
  25.         led_init();
    9 A/ d$ X5 }% E

  26. 9 [5 ]& y, K1 ~# r: ]
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);3 R. S  Q# W4 `3 e5 y% V% f+ Q
  28. 6 v! V: S+ {$ L
  29.         // 开启调度
    ; @: }$ a) o% t7 z* t& w
  30.         vTaskStartScheduler();/ j" b: d4 w5 z( O1 m$ ?* b
  31.         while(1);. O8 |( ]3 W7 o
  32. }
    - X; M' H: f, Q0 c4 y
  33. : W3 B' z( o$ ^& y  ~8 h
复制代码

1 K7 z4 u% c) S- ]9 n3 j1 E0 e8 j# r' t
6.完整工程
  W! P6 Y$ Z7 n3 B% j  c( R4 u1 B' _/ g$ h, `0 ~
2ea8ac08b3934dfb89592333f3832937.png
4 {$ u, {$ l2 ~; @) \7 j4 O' M

/ c, u2 L0 l3 D+ d1 u( L————————————————! h# o6 Z, q7 M
版权声明:无聊到发博客的菜鸟* B! Z/ b4 t6 v1 X8 X
如有侵权请联系删除  B5 A- M* o$ F; b
8 @+ V3 L: f/ g

1 c2 k  R: j* n; H- {" {0 j3 }7 f* c
652df39d09bf4de399b0792b897a4205.png
赞 收藏 评论0 发布时间:2023-5-1 15:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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