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

基于STM32F103的移植FreeRTOS

[复制链接]
攻城狮Melo 发布时间:2023-3-24 21:41
前言! U: d2 I. G- _7 j3 [0 y
演示STM32F103移植FreeRTOS完整过程,文末提供移植好的完整工程
  @" i' q3 N* e, X

( }9 l2 T7 E6 s- D. L1.下载源码
1 y) r7 G! T. B# [- S% W下载FreeRTOSv9.0.0.zip解压如下图
8 h( I( j& V2 S, `% L% L! l8 z# i2 a1 }' ?6 m5 }1 _# ^
19e323b668614914b5ff1c3650318367.png ) p2 ]  K4 u8 G% ^

0 ?9 W7 C$ P" p/ K) o0 k只用关注第一个文件夹FreeRTOS中的内容
! W3 t# P- {/ W: s( d2 M$ S: ^
1 q* A1 _0 K( v; ]4 O+ H; a
652df39d09bf4de399b0792b897a4205.png
4 |) O- H1 Z7 R
+ }+ N+ K6 ~+ N% r8 @3 M( J- @
Demo是官方提供的常见芯片的移植示例,包括STM32F103,我们需要用到其中的FreeRTOSConfig.h配置文件。
1 V' l  }4 Y2 R$ ySource是源文件。' P' Q! e& i3 v, e. C5 @

" P; H  p0 h& c, `& Q/ b8 t; C6 X! ?2.拷贝源码
: K  s6 [3 V) d, f" j0 ?
在工程目录下创建FreeRTOS文件夹并创建子文件夹src和port
- _( g; k( ?, z* ~# }. E3 a9 p/ g) b. D" J5 I
0e6a2341df8d4aebbfc03d0c85c6f52b.png
1 m. P' r- o3 [/ a' c

" X+ c. m1 q, d  ~( p' @0 {将Source/include文件夹拷贝到FreeRTOS下
3 u" r! y9 K! `3 H将Source中的C文件拷贝到FreeRTOS/src下% Q( }$ v* v# z
1 f) Z3 C* L/ J8 w; U' D2 l
8084ebe3b4ff42ceaf1f92bb20c56e8d.png
# g3 }1 [' R2 ?( O7 v  v& G* }
' H2 V; ~; J* P% U" y2 [, O8 E
将Source/portable下的MemMang和RVDS文件夹拷贝到FreeRTOS/port下,
" s$ G5 c6 i% X5 `$ N) m- r  r4 u
9 ^9 n) I  v" l; ]* R其中MemMang下的源文件是用于堆栈管理的,RVDS下的源文件是不同内核相关的接口文件。: M# G% F" V2 P8 V, c
: b! s4 C+ n. b4 p
3d367e236be94ca5ae616b13bd3072ec.png : ^, }& n2 ^' o6 ?- y9 `8 x

( g. v# h/ q+ q7 J0 ~: o3.添加到工程* N. y  P; Y0 {% r$ f) F( m" s: I" d( s

& N# b1 c' N9 h* h4 z: L
2529a830445449c6ae890e724efa39fe.png
+ [+ ^" n, U$ E

- T, w& `$ m3 N7 v* l新建FreeRTOS/src和FreeRTOS/port组
4 o' r4 l. F3 I! F# H8 c

4 A0 g  z. s! y/ E9 IFreeRTOS/src组中把FreeRTOS/src文件夹中的源文件全部添加
3 x2 C/ y& b/ a% p3 |0 b6 M. T
& |& @+ D" r& A; X/ o
FreeRTOS/port组添加FreeRTOS\port\MemMang中的heap4.c和
  r' O. z, P+ h0 L7 e

4 _+ ?0 i- d- u3 |1 f5 d; a9 h! A1 N5 qFreeRTOS\port\RVDS\ARM_CM3中的port.c
0 H% U; D& h4 g8 X- y) e5 i1 K
% r; ~  [# f' t9 D
2 A7 \3 x( D# g# a% x% S
添加头文件路径1 V. Q9 F5 `( j$ C3 v5 S
/ m, n, V8 r+ r+ X) B
ae4795e36a2d44f09b120be18c5d4c56.png
7 G( }9 g$ y( T5 z
! Y5 `7 |" P! {2 K. [& ^
拷贝FreeRTOSv9.0.0\FreeRTOS\Demo\CORTEX_STM32F103_Keil下的FreeRTOSConfig.h文件到工程9 l2 x+ f  R+ u8 ~
& B; S6 a5 I- V  v3 }% s
, C6 c& w/ i* ]" r! |% A
4.修改配置

9 I, B( z/ M$ R- v5 E7 r  J  I4 a在FreeRTOSConfig.h中添加& r, ^7 t  z- ?  S
  1. #define xPortPendSVHandler         PendSV_Handler
    2 p* K& b; u0 o9 p+ y: g6 W
  2. #define vPortSVCHandler         SVC_Handler
    . e" o$ }2 ^1 Y
复制代码
9 R* z% i3 L0 V* D2 t( L
在stm32f10x_it.c中屏蔽PendSV_Handler和SVC_Handler中断
% d. M# v! V: l* u, V" E/ ?最关键的一部,修改stm32f10x_it.c中的systick中断服务函数。' M9 w$ X) n3 z6 Q5 R( I
  1. /**
    9 s! M. Q3 e. j. t+ g9 P
  2.   * @brief  This function handles SysTick Handler.
    1 _( b# \6 N1 P" w" m. ^4 `7 q
  3.   * @param  None3 z' H# }$ i5 k+ }7 F1 c( {
  4.   * @retval None
    * F0 ]2 x- F+ H
  5. */5 i+ l0 U, \. F3 {
  6. extern void xPortSysTickHandler(void);/ p) C- I% t1 D4 i# h% v0 j5 q9 A
  7. void SysTick_Handler(void)
    ' ?  u* M1 I( X* `8 u
  8. {
    % q3 t$ h9 M6 M" d+ v! O3 E
  9.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )9 n/ V% X+ V0 K2 g% {. f$ G: i
  10.       if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
    ! I2 |" Z; X* c. I4 _1 q# r
  11.       {
    . F2 o! c5 d8 _6 `8 q
  12.     #endif  /* INCLUDE_xTaskGetSchedulerState */  
    0 \; F5 E, ?7 o0 y' H& q
  13.         xPortSysTickHandler();
    ( m" ?, j" l/ W
  14.     #if (INCLUDE_xTaskGetSchedulerState  == 1 )+ b! g4 L1 n7 V# y0 n  K
  15.       }
    / V, V0 N- k$ @& L) r  H
  16.     #endif  /* INCLUDE_xTaskGetSchedulerState */
    ! a; u! j; t  v$ H7 M% n
  17. }
      t# I6 B& c# a+ C' G  x- Z5 M% x+ x
复制代码
* v2 U, R( m! L2 y* b
5.验证demo2 d6 J, D1 \$ `: I5 A* l. t
  1. #include "stm32f10x.h"
    & |$ M' t2 s5 v# I; e
  2. #include "FreeRTOS.h"
    : V( {' V( h2 }* g5 l' J5 x
  3. #include "task.h", u3 a& c& g: U
  4. #include "portmacro.h"0 J% t  @0 m+ {$ l; W' U
  5. #include "bsp_led.h"  ( z# |1 t/ ]4 p; ]# O
  6. #include "log.h"
    5 h" c, Y+ D6 d3 t+ F6 j6 }5 R
  7. " t. i0 U+ z4 v3 P
  8. static TaskHandle_t led_task_handle = NULL;7 X$ V- N$ z: z; a8 m

  9. ' g) r! g2 t7 [9 h8 [9 _$ Z: Q
  10. void led_task(void *arg)  {  ^  D2 f5 W
  11. {6 d; f) ~4 F( f; ^4 I
  12.         while(1)                            4 g( k9 t2 K0 u1 }8 h- j' O
  13.         {& B8 G8 C* i2 @) I
  14.                 led_status_set(LED_STATUS_ON);
    ( z, H) ^4 ?7 B! D) A
  15.                 LOG_DEBUG("LED_STATUS_ON\r\n");
    3 q5 A3 Z6 k" O, J3 F( Q
  16.                 vTaskDelay(500/portTICK_PERIOD_MS);
    2 {+ x" ~; r. P2 [
  17.                 led_status_set(LED_STATUS_OFF);# B, Z- Y& V. x2 @: {! s% `
  18.                 LOG_DEBUG("LED_STATUS_OFF\r\n");
    1 T0 a" u" k1 L! s/ h" ?6 B& G
  19.                 vTaskDelay(500/portTICK_PERIOD_MS);
    8 W9 i) @( R; Z# I) G+ P- o
  20.         }
    ( I0 D6 {, ?& X0 I/ ~/ |9 G$ G
  21. }/ T: L* x6 u% Z) L

  22. ) x2 m& U: T4 u
  23. int main(void)3 z' k5 X- }: h& p3 H: Y. ?) s
  24. {
    & s9 j8 C3 X" C9 ~
  25.         led_init();
    & A$ H) ^/ P1 N0 h# |4 m3 N

  26. - L* F3 i" [+ k7 o- i
  27.         xTaskCreate(led_task, "led_task", 1024, NULL, 20, led_task_handle);& _* _' f6 J) f/ b$ M& v

  28. " _% a/ n' Q8 ^  k; ^7 |
  29.         // 开启调度+ t6 {8 w; h3 t
  30.         vTaskStartScheduler();
    . d! Y8 _* J3 U$ Z$ ~
  31.         while(1);
    2 m1 t9 `# l' U) U  }! }# V
  32. }
    5 x( h5 Q- [; c- Q) `& s2 {
  33. ) Z* y0 [/ ~, I8 D' I2 n3 o
复制代码

' c! D7 Y/ _. s1 U$ q  w; A- V9 o; Z5 D3 b4 p
6.完整工程9 Y" b6 n+ X7 Y( ]- e0 J1 ?3 S
亲测可用; o$ m& ^! y, X% J
( I/ v+ Y( `0 W
2ea8ac08b3934dfb89592333f3832937.png
& e0 A1 E2 P0 A) X2 f: ]

% o8 j# B3 X! u) i% o————————————————
, k1 {& G0 G0 W版权声明:无聊到发博客的菜鸟
( T: R: c/ Y' o. s如有侵权请联系删除5 g( B. F, L4 C
$ |5 |: a  y1 p6 y6 o
" O- k8 j, x/ z( I, w! e/ s. H' h( y
收藏 评论1 发布时间:2023-3-24 21:41

举报

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

完整工程呢???

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版