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

基于STM32F103移植FreeRTOS经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 15:28
1.下载源码
% w6 ~) {7 p/ B4 a3 Z% _下载FreeRTOSv9.0.0.zip解压如下图
; k1 K1 b# o; N/ n' d- b( ^0 u+ F) P( D: m
19e323b668614914b5ff1c3650318367.png / F2 ?' T5 h5 x4 L0 C
# ~) }. f  V7 V
只用关注第一个文件夹FreeRTOS中的内容" M/ B- W5 V/ ]; X! W- A5 B
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。1 {/ K6 J# L0 _1 k, D2 Q4 j$ M" ?
Source是源文件。3 f% y" s9 I! d8 w
% K2 f) p# W* a% u, N
2 [7 \* x7 }5 G1 C3 H4 v4 o
2.拷贝源码
/ k' f) g1 O5 j  M! h4 i  C4 O2 S在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port! z7 w( G/ @$ p( A/ @$ y' B% `
将Source/include文件夹拷贝到FreeRTOS下2 V( y& B- B5 P# q7 e

2 f# p8 T; M& l$ u
0e6a2341df8d4aebbfc03d0c85c6f52b.png
+ q7 y+ b; P, n9 O

) q) g9 h% x, M& R- R0 [/ u7 H5 Y2 L将Source中的C文件拷贝到FreeRTOS/src下! b+ s) c) u  G
( @! _( m  I( h5 Z1 `7 `3 y" p8 D
8084ebe3b4ff42ceaf1f92bb20c56e8d.png
& j% i7 T; u( V) ^, x
5 ~8 ?% [* i1 {2 i% R; d- S
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,. B) g' \9 N$ y7 t

3 |. b3 N( {6 D
其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。) r2 B5 @3 t  x( h/ L/ V0 E/ z
/ G! y- ~/ u" z- f7 L# b
3d367e236be94ca5ae616b13bd3072ec.png
2 H9 b9 @: Q; i( b' P; e3 U5 K3.添加到工程
- e& q3 g1 o  F; f0 p1 j3 T+ N
' D/ d8 Y- \5 C9 `+ C
2529a830445449c6ae890e724efa39fe.png - Z; N# S" G4 {% R" _

- C6 p6 }' z- t* s! ~新建FreeRTOS/src和FreeRTOS/port组
, p2 v3 G7 `) WFreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加0 ~& @: s" M9 \* t1 c$ G7 S
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和0 H. t; }9 |7 V" A
FreeRTOS\port\RVDS\ARM_CM3中的port.c
* U- Q5 q6 S; I
; ]+ w; J' E% T

# z) {: M; o% Y  C$ J0 j添加头文件路径; b& N# d& _! [' k4 Q0 f

+ v# N1 b: m; X/ B
ae4795e36a2d44f09b120be18c5d4c56.png
" J. e7 S- }0 ]8 D2 n

) Q/ L! t; w$ p% W4 |拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程, B5 v2 t% x  J! v
& t9 n5 b4 H4 b% r# d

5 J$ {3 K; H, s6 s. m; G4.修改配置& \' X7 e" v" R$ R
在FreeRTOSConfig.h中添加
/ e: a9 y4 E8 H% q7 c  C
  1. #define xPortPendSVHandler         PendSV_Handler
    / _0 E3 z+ n7 F
  2. #define vPortSVCHandler         SVC_Handler+ t0 e. u& _# ]
复制代码

/ ^8 [; P" y5 z+ n在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断6 j2 o- k9 m- C& ]& u
7 D) U& o- r/ y3 Q/ h2 t
最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。3 F  Z! k8 U% E% V6 v; a
  1. /*** h  v) o- ?$ G# j2 h
  2.   * @brief  This function handles SysTick Handler.) J% l1 T9 ^3 `
  3.   * @param  None
    1 }, H& B1 i1 r9 O
  4.   * @retval None* `/ q: w! w1 A! k1 }/ C
  5. */# O, {( k  ~) v3 c) d
  6. extern void xPortSysTickHandler(void);: w- k! E5 W% C
  7. void SysTick_Handler(void)
    9 i. B4 y' q* p7 S3 Q2 c  u
  8. {# p+ S  d3 a4 K+ M& D6 ^+ g1 X
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )
    2 R: T7 ]! D' ~8 u+ Z8 F
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)- T+ ]: M9 H+ T- m; [  ]
  11.       {3 M& x1 I+ K, m
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  / v- R0 z- \% G+ ]& f
  13.         xPortSysTickHandler();3 ^- n9 Z( D9 O" G+ O! M
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )7 `* |3 p  ~" Q# R. P, b
  15.       }- o/ u9 b7 `( Y
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */
    # P3 i. S$ s) N/ x! O
  17. }: I; ^# e9 ~+ B& M. I
复制代码

* d# f$ N( Z, {  h, M1 s

" T9 l  w8 t# T5.验证demo# C" g3 v/ J9 y0 \
  1. #include "stm32f10x.h") J9 f' s: j% I, r4 q! N0 p
  2. #include "FreeRTOS.h"
    5 h4 l4 V! r7 A+ `3 W! o
  3. #include "task.h"3 J' _% e5 `* d
  4. #include "portmacro.h"& P( ^. x$ R1 Z9 K* r
  5. #include "bsp_led.h"  
    % p: g- V2 j" z7 d1 d5 \9 g
  6. #include "log.h"
    0 [" ?0 R, b6 i& Q
  7. 6 E8 f! T0 |! A9 @/ r! t
  8. static TaskHandle_t led_task_handle = NULL;
    2 ]: l% U) e- d* Z( A

  9. 4 D- {+ \- |; O2 U/ |2 b2 S2 Z3 J
  10. void led_task(void *arg)0 d+ o+ \9 n4 ?6 V9 E9 `# y& H
  11. {: F2 x0 I. X% H# J+ \7 n* V
  12.         while(1)                           
    - l2 i' P( e; J
  13.         {0 v' v1 h# D$ I3 C  m, z& F4 F
  14.                 led_status_set(LED_STATUS_ON);0 x. U! y8 N0 W5 r0 j$ ?
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");
    * P1 W: L# H: z1 w3 K* R* i: K
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);7 L5 A( s& ]' |& i
  17.                 led_status_set(LED_STATUS_OFF);
    ( t( u. R! J3 W6 ]
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");7 o) J; j; _+ K" w& K- M
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);0 O4 h8 L* }, d0 [3 r( {$ d1 r
  20.         }* c( Y! S* E# l; |
  21. }
    3 E$ ^4 V$ l# `" ~( l4 \9 L. u

  22. & c0 v  @% h  W7 c7 d. q; X
  23. int main(void)# ]& _+ G1 C5 n- u" f
  24. {, `2 }' R# t: q
  25.         led_init();( I. \  Z, C% ?7 R9 q7 [) d
  26. ! s3 o. p  T7 {5 ~
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
    % h8 f, z3 M9 t( n/ q% {" M
  28. ; q2 N$ o: \# X
  29.         // 开启调度* j  e0 C) H7 l0 \6 G- k
  30.         vTaskStartScheduler();8 n* r; g# l( D! w- p
  31.         while(1);; d1 ^1 f2 V# u8 r% {- H% `. n' Y
  32. }
    * ~1 w2 {9 I+ _" u! M9 f

  33. 8 u1 n: L7 p- U; }+ x
复制代码

2 _( `; F4 H2 r8 ^+ ]0 r) i) i$ X$ z! ~
6.完整工程) p, B' X! S# _/ r& e# t

* s* n- _( R$ }' N0 ~3 N 2ea8ac08b3934dfb89592333f3832937.png
2 y: u$ N# e/ e  p

" y+ i3 B; Y' Z. g6 s# F. h2 g9 g————————————————7 Z2 u' K5 ]! e: o. u4 z+ I
版权声明:无聊到发博客的菜鸟6 P7 k  h6 o+ a9 f
如有侵权请联系删除
: `5 x, G5 X* ^+ F7 U! v% R3 _. _  x0 [3 b: X2 f, l% L# j5 C8 o

+ [; i& F" _/ N6 Z6 E" S/ n9 m1 \
652df39d09bf4de399b0792b897a4205.png
赞 收藏 评论0 发布时间:2023-5-1 15:28

举报

0个回答

所属标签

相似技术帖

官网相关资源

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