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

基于STM32F103的移植FreeRTOS

[复制链接]
攻城狮Melo 发布时间:2023-3-24 21:41
前言
: q8 k' r; t/ [; k: X- D. L演示STM32F103移植FreeRTOS完整过程,文末提供移植好的完整工程' |; ]7 t: R' c  C8 b

  v# w4 F4 l/ Q1.下载源码
$ g: [6 y/ H' O下载FreeRTOSv9.0.0.zip解压如下图
# M; P- j4 Q" O. X6 P- ~: q2 l3 `3 P% v$ A
19e323b668614914b5ff1c3650318367.png
1 O1 _/ V5 z# i
- ~8 N" s' q9 y; q3 @2 f. S. s
只用关注第一个文件夹FreeRTOS中的内容" i% b# d: |% O2 p, X) \! V
8 |: u( H) d2 l  Q6 a9 G
652df39d09bf4de399b0792b897a4205.png * O. M, l* j2 q- J& j

- J! ?" c( A( P3 Y) ^* \/ U  lDemo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。; `' N' b2 N! ^
Source是源文件。
$ {' s2 f* l/ P; M0 z! }

6 R- F) g: c# x2.拷贝源码

+ K3 v0 X+ \2 @& j/ a在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
6 F  _: c" Y3 L- T# L) }
; H9 l1 z5 t1 C& G6 u; m8 |* E4 n
0e6a2341df8d4aebbfc03d0c85c6f52b.png
2 t2 N: C6 J' N* d( x2 s

- y8 c, T$ [: \将Source/include文件夹拷贝到FreeRTOS下6 {3 O' Y  k0 i. W& V
将Source中的C文件拷贝到FreeRTOS/src下
( ^/ j( J% O* g$ u: s: e/ ?
2 k' a" X3 k; ^3 M$ v
8084ebe3b4ff42ceaf1f92bb20c56e8d.png 8 H. Y" J- Z% Y/ f4 T2 i( b
( g- J* ?" r$ q
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
- B1 F& ^. [+ y+ M5 |
1 n# [! C9 S" v" ]! F' \; b其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。
. w' R' a# o- Q1 M! ~+ W3 o0 C4 ], F1 x" s9 u+ c$ p- c. n# g
3d367e236be94ca5ae616b13bd3072ec.png # j/ T" m+ P8 E" M& v% ?( Q; L, t

: y& ]6 |8 C- c' k3.添加到工程3 I. a4 ?# j2 j( g2 t

4 }5 \! k' b0 {; _( X8 Z0 E# ]3 a
2529a830445449c6ae890e724efa39fe.png 2 f$ }5 j' A( v/ D# x4 w

& Q$ C$ c& a- z* q: k6 t& V- L新建FreeRTOS/src和FreeRTOS/port组2 T; ]/ F5 q3 i5 c
0 @8 e2 Z  y4 O% i! S. t
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加# c2 C% z; ~1 D$ Y7 n; k
$ {" _3 N2 L1 L* \; Y. D* i
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和# i$ Q+ x4 p, h( X- l; d, {: d( m

. f0 t: d  p! u  p5 [# N& p( F0 p; EFreeRTOS\port\RVDS\ARM_CM3中的port.c
: d- H$ r3 u8 J1 P# [  Q
7 Z# V  ~/ z9 L* T6 e, w

: z4 L9 G: y3 X% ~" |添加头文件路径3 P5 m5 D% e  C* G- g5 E: ~0 }( c
% j1 Q6 ~0 b, [
ae4795e36a2d44f09b120be18c5d4c56.png
: W5 ?! t( ?( @0 R
) o. e' ^5 z; G$ x# g: j" N
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程. k0 s8 ?$ G( c% M/ d. j! J
# _, Q5 t8 }" _3 {9 p" x3 b

; S' S) b2 b8 ?$ ~& |( i; q: L# ~9 A4.修改配置

, K4 V3 x0 S) Y! t7 F在FreeRTOSConfig.h中添加
$ t# k/ ?( }# M
  1. #define xPortPendSVHandler         PendSV_Handler9 D7 _! U' P+ Y8 m8 b) _
  2. #define vPortSVCHandler         SVC_Handler* P" c& Q* B* E+ x: _2 n7 r  r( z
复制代码

; R) U9 o6 f# _& I在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
4 U! r% B9 @% o  H" Q最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。+ O0 x: i+ J. L  W; f  o: ~
  1. /**
    * W4 u* ~0 p4 T  D7 d7 I& ?) q
  2.   * @brief  This function handles SysTick Handler.
    ; C7 p' x) @5 t( M, H  }
  3.   * @param  None, I# q) w, L- G; {/ h3 m7 l
  4.   * @retval None
    ' R* k3 ^, ~1 ]# q! G  |9 l
  5. */! g* l4 p8 o8 I9 W: [
  6. extern void xPortSysTickHandler(void);
    6 t# e% P% ^, |6 F$ p
  7. void SysTick_Handler(void)
    + {, ?& @3 S5 K6 l
  8. {. k# k" n2 g2 G# z
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )5 F9 R$ A" [# `) F3 s$ G
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)! M' M/ J; b7 D+ C& v; F3 D+ O
  11.       {9 h) A1 R2 D" L# o' g/ Z
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  ( K9 {( Y7 v( O& P
  13.         xPortSysTickHandler();+ S9 U" I$ T9 x5 K2 L8 S
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )! J' I; E# _' D. t6 F2 E- q
  15.       }  e, f' H+ ~' E! L
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */
    & }8 K  }# Q, d- a
  17. }$ b8 F3 i6 l" l' L
复制代码

; m  ^( a) e5 |; X) x5.验证demo
9 \! Q$ \7 z5 n) t2 m5 E- m( w
  1. #include "stm32f10x.h"
    5 ^5 V2 S2 o7 r* K! K. u4 m
  2. #include "FreeRTOS.h"  l0 K! A( [/ b, ]7 ?5 \
  3. #include "task.h"
    * e6 v2 Q" ]. x% h* {/ ~
  4. #include "portmacro.h"4 z  D8 n+ \8 y. |) h. m: |
  5. #include "bsp_led.h"  
    ; W+ e; I* N  v7 l2 m7 ]! d
  6. #include "log.h"! f- @  p" O* A+ n7 O+ h
  7. 4 t! E5 w. j2 L/ [  i, b! D
  8. static TaskHandle_t led_task_handle = NULL;& h" s! Q5 s! c% A8 B1 M1 W: \

  9. 8 P( s6 }; J, y+ f0 t2 o1 y
  10. void led_task(void *arg); r1 W# i& a6 y. u
  11. {
    " S+ Y, S& T" ~% n
  12.         while(1)                            * c/ x' X5 M; q5 Z/ Q8 J
  13.         {! p" z! s! I. d9 C' J
  14.                 led_status_set(LED_STATUS_ON);, p+ k5 x4 i) p
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");
    : ]8 X( b, C& g# M
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);7 {% B+ w9 P. G; Q. r* g4 }
  17.                 led_status_set(LED_STATUS_OFF);
      V* i" @( l, P! l% d
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");4 C. R" G. |; O6 ^$ o2 w
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);/ c* @& e9 p+ ?- ~% h1 i5 ~2 L! [$ i
  20.         }  Q9 b& u  j# z3 C2 c
  21. }
    5 C  {) V  g- z
  22.   ]9 o/ v( m+ N5 t* D
  23. int main(void)/ \; a8 a& W; Q7 ?& t; B  M
  24. {# i9 g3 ^8 d+ F
  25.         led_init();! k" R* A3 Y3 z6 J0 X$ b

  26. 9 v0 a5 R6 c. `  T
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
    6 y) Y* i2 M0 D- N) ^

  28. : U6 z9 y( l) w7 |! M
  29.         // 开启调度
    & y5 @) Z( t! m3 @6 L
  30.         vTaskStartScheduler();5 z, s& L* r" i
  31.         while(1);
    # P2 `- t( g8 ~- H
  32. }% B& j0 y$ U* f# B: T" p- K( x

  33. ( i, ^4 z! b2 Q
复制代码
/ s4 _* T+ Z( l+ K0 L

3 }& P+ b+ S* c! f9 Y9 J' Y3 t6.完整工程
3 C  ^) c* P6 B% @6 J亲测可用6 b. v) s; P  q

( }1 V+ A6 p0 _2 B; f! l7 G2 y: ~9 O
2ea8ac08b3934dfb89592333f3832937.png
2 }& @# Y# R3 x
0 C8 I5 I6 Z% R
————————————————
" D2 @4 ~! o) {" m, a版权声明:无聊到发博客的菜鸟6 P1 q) l0 U  `, n, ~8 i
如有侵权请联系删除* X& D' N  ?/ _+ T# A
* ~1 t' i2 \, m  K; p5 k' N/ {
$ ~- ]  t7 V0 w; G4 }* y
赞 收藏 评论1 发布时间:2023-3-24 21:41

举报

1个回答
fafa1 回答时间:2023-3-26 10:09:49

完整工程呢???

所属标签

相似技术帖

官网相关资源

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