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

基于STM32F103的移植FreeRTOS

[复制链接]
攻城狮Melo 发布时间:2023-3-24 21:41
前言! R+ F4 i8 G6 X
演示STM32F103移植FreeRTOS完整过程,文末提供移植好的完整工程' ~5 I' D8 ]# s7 y3 a* i1 W
& T* ]6 W2 f8 c( R! m4 `
1.下载源码
% V- m$ V) P7 O6 F下载FreeRTOSv9.0.0.zip解压如下图
* Z# s* k0 H  N' ?& ]5 k
- G2 V7 e2 o7 i+ z3 f
19e323b668614914b5ff1c3650318367.png
! e4 p& U4 Z7 f  O/ Z& }+ a
; B4 N6 j! x* P' q. O
只用关注第一个文件夹FreeRTOS中的内容
2 D  `2 d, L. b( h8 ~$ [3 u$ ]! g! r6 \
652df39d09bf4de399b0792b897a4205.png 5 }$ M( T2 p8 u% U! J) s

4 ~3 i- a$ ?5 Z/ NDemo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
9 s! ^0 o% ^3 t2 A7 A% USource是源文件。! A+ g! R+ Q( s# y9 L, z. u

1 q2 F' }8 I( }% F! y' c" m$ z2.拷贝源码

2 s# j& q) `5 R* P, O$ z  f在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
  t, j% n% _. X. p! y* M, @/ b% e, J1 w) C* m
0e6a2341df8d4aebbfc03d0c85c6f52b.png
+ a2 B# V# X. v9 y

9 Q$ m  f) O( B' f- O将Source/include文件夹拷贝到FreeRTOS下
  O6 f) u/ ?( ^9 l6 E# g& o  h将Source中的C文件拷贝到FreeRTOS/src下) D; v8 A# ?: q( J8 f! n. ^
* E2 p2 ?) R, j1 C
8084ebe3b4ff42ceaf1f92bb20c56e8d.png
/ s* F* f: Y& d% K% C

7 z; K, S( J, \  I1 ~' p将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,+ z9 @! L' C% o' B) [

0 Y  I3 X. }" e1 ], B4 Q( F0 D其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。1 b+ }5 c6 }1 Q3 S+ \# U
8 i) p$ v7 V- F0 @% L0 c; Y  e" `
3d367e236be94ca5ae616b13bd3072ec.png
* l- {4 s, C" d

5 b' J7 }1 v" t  f3.添加到工程
1 Y, e# I  h, c$ }# i9 x' R/ d
" Q; a5 d: `) Y- y* ^- w! a* m" V5 a
2529a830445449c6ae890e724efa39fe.png ' h7 p8 [9 j- U* i3 H

- ]$ |- A% o9 V6 h# e/ a! i新建FreeRTOS/src和FreeRTOS/port组
, t- d# o8 A2 U# P& d3 R$ |
* F& d* p: H9 p3 Q" _& L8 ?2 w
FreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加. l$ S7 a( c" R5 o( m0 N) M8 J
) ~+ j1 y/ p% B6 o' B
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和& Y$ H( {2 x0 j- x

1 }$ J7 w# y! R2 H+ _! Z$ h6 g' wFreeRTOS\port\RVDS\ARM_CM3中的port.c
8 c7 A+ {' H! z; M# M0 ]" ]* j: S' w4 u* O" S: P& b+ }

8 b4 x( O/ S- i! D# Q& {! H添加头文件路径" {  Y; J" t5 c* e

+ e" Q7 w2 ?$ o- x! b' y* x
ae4795e36a2d44f09b120be18c5d4c56.png   N5 H7 ^, [: z3 z: `) C
1 B; }& a" t( v* l
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程4 P2 r: @3 S* y9 P. P' p; a

1 X5 Q! k  q8 Z$ r% m# Q
' _3 E1 U: B+ ^1 P% R: \
4.修改配置
8 X( h, F8 }6 _. I# J+ B7 f
在FreeRTOSConfig.h中添加/ V$ ?" T9 P: ~% B# Y: o8 _
  1. #define xPortPendSVHandler         PendSV_Handler
    6 e" M- I) l1 b4 P
  2. #define vPortSVCHandler         SVC_Handler
    # [) i9 m0 W. `( s
复制代码

* Y( L% T& q9 F  q在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
8 T' K# W$ w* N" ~- g8 X最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。
9 c1 f. H" D+ [3 n4 `3 x* z1 D
  1. /**
    $ J/ q* H/ U+ Z5 V3 r+ K
  2.   * @brief  This function handles SysTick Handler.
    0 Q. y) `- f) I( S- _8 u
  3.   * @param  None" T5 ?# ?& N" c
  4.   * @retval None
    ) G% P" a3 L! [" b
  5. */
    8 Z7 X) Q# \! Y9 j( w, a. C
  6. extern void xPortSysTickHandler(void);
    ' d3 A* P$ b$ ?  U. M
  7. void SysTick_Handler(void)
    5 ~& m1 O0 ]- @* r8 O
  8. {
    / `2 n& ]) n' s% T! ^8 W* Q! |3 o
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )5 \7 F  {6 n5 v+ W0 M
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
    % x+ U6 R  D/ v+ b9 W  K
  11.       {
    & ]: p+ ?/ r) A! e9 f
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  1 J* d7 ^5 k8 Y# R: Y+ e. s% T
  13.         xPortSysTickHandler();
    8 Z; y  k* y" j. K  B
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )3 }3 I, k$ p( Z' {( \) S+ G& H1 {! \
  15.       }  g: K  j$ W1 m% I4 ~# N: h
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */4 Y  P: D, G% I8 v9 x
  17. }
    4 H3 t% Z. G$ T' w& L- b  w" T# I
复制代码

' _- Y! O3 P+ h+ M5.验证demo
  t* F/ X8 M) @
  1. #include "stm32f10x.h"; C( J2 k. f+ r% u8 u" s1 K8 C3 r
  2. #include "FreeRTOS.h"
    1 X( f8 T3 S- {- @  V1 \( d
  3. #include "task.h"
    : g* G  w! N9 B
  4. #include "portmacro.h"2 X0 m* T- f: J: u
  5. #include "bsp_led.h"  
    , ?9 v5 z! x3 E+ B- o. Y9 L
  6. #include "log.h"
    ; ?: e4 Q, w: E" v' d; `$ n
  7. * Y0 G* k8 k. F& u5 L, S. j
  8. static TaskHandle_t led_task_handle = NULL;7 t. K: s- T: ~& O

  9. - U6 N& _( [6 S1 F  Z
  10. void led_task(void *arg)
    . _* h0 Y$ l5 a5 `' L8 N
  11. {# t0 s5 e+ k5 d! Y: A  M
  12.         while(1)                           
    / f" y5 r) b9 N  Q' h. D- e
  13.         {* X  l9 |1 E8 H
  14.                 led_status_set(LED_STATUS_ON);
    4 J( w+ m5 b" U/ G2 G1 }
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");3 \* `& r/ }2 q+ {4 G/ U( x/ ~
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);
    : K# u9 O! \( _/ O- B5 a
  17.                 led_status_set(LED_STATUS_OFF);
    8 d% Z9 s+ L4 B. F* a
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");# N) i1 O% c6 a5 I
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);9 A, L* Y" s% M& A! X
  20.         }
    4 \) j2 r: {* D* |" S" S' `7 U
  21. }
    - h2 x; |  G5 n
  22. ' N/ t! y: l; _
  23. int main(void)) V( {* i8 Y/ p* x* n
  24. {9 w( q0 x) z" E0 f
  25.         led_init();/ d/ B( @% \2 E2 l

  26. 6 d* L( ~) Z% Y' n; p0 ]
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);
    % Z+ {1 z7 w0 r7 v) x

  28. 3 M3 U6 t; t% J5 Z3 c2 J- m6 K
  29.         // 开启调度
    ( V) U. P4 T4 s; _) b
  30.         vTaskStartScheduler();& I: h' @( Z  X3 w/ b
  31.         while(1);. V' Q, y% n. m9 x6 l: J3 F1 N
  32. }( g. o. q; p, F; i3 ]
  33. 8 D, g) A* @7 C5 H8 h
复制代码

+ @* P9 E9 S2 c9 D7 R/ E2 i6 R7 e& `; }9 p
6.完整工程
) ?' v3 _; i* Z6 a* K) ?, n. T& i) N亲测可用3 g9 J! J% ]( v8 |! @+ d" q& B

' G2 s+ k+ ~5 f+ f$ m  l
2ea8ac08b3934dfb89592333f3832937.png
7 X5 \! `* Z* R6 T* E
! R/ i! c* B! b( M' u
————————————————5 B* m" |. l" \2 {0 \# s
版权声明:无聊到发博客的菜鸟
6 R: Z: W5 T% g( Y$ Q如有侵权请联系删除
, \; y' t7 q# [5 |4 S+ S( \) B8 d: n+ U- h$ B; v" @
5 ?% L- \# _/ V
收藏 评论1 发布时间:2023-3-24 21:41

举报

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

完整工程呢???

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版