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

【经验分享】适用于 STM32F103C8 的 FreeRTOS,STM32的多任务同时进行

[复制链接]
STMCU小助手 发布时间:2022-6-21 13:05
* e( H. ?  R$ X- P) d! Y
b7fab167dd363ff71e43e0e67266c046.png
- E' K0 v% _# C% h: [# X3 a6 i) w# }' n' H7 g5 O
概述:适用于 STM32F103C8 的 FreeRTOS
" C' k* f  G; Q% F0 S: H$ K* _2 g% b5 q$ [7 r8 P7 v+ V( ~
STM32F103C 是一款ARM Cortex M3 处理器。我们可以在 Arduino IDE 中使用适用于 STM32F103C8 的 FreeRTOS。我们也可以使用 Keil,但这个过程相对冗长:我们需要将下载的文件下载并粘贴到 Keil 路径中,这里我们使用 Arduino IDE 的方式。
( [# }% \0 U' T4 Z# w) F5 a5 @# I2 @2 w
要了解 FreeRTOS 文档和方法定义,您可以查看FreeRTOS STM32F103C8。
1 E+ z0 X) M  q' m: Z$ E4 D" {
9 Y+ E+ ?( y. ], N2 C什么是 FreeRTOS?
0 a9 _9 l, U  l. u
1 {2 _" ^! H# d, B, p  Q" yFreeRTOS 可能是一种免费的开源实时操作系统 (RTOS),可在包括 STM32 在内的许多流行微控制器上运行。6 h; h. r9 }0 N; u" p: J

4 Y* C9 B( C2 j+ W( J% P操作系统可以是在计算系统期间管理其他软件和硬件资源的软件。通用操作系统通常在设计时关注用户体验。3 i0 D1 j  a9 J0 [* u- F- r( }6 P

  p" s6 M( d7 b# \( l2 A例如,假设我们正在为手机操作系统开发一个应用程序。用户可能想要流式传输电影,因此我们可以将流式传输体验分为两个工作:工作1 从 Web 下载视频;工作2将每个视频块显示给用户。这些工作可能是等效工作的一部分程序,也就是同时进行的。在这种情况下,它们可以实现为并发运行的线程。
* i; G' ?- H; F  l9 S, o$ [0 Q: b6 r/ \3 n, {
如果我们的处理器只有 1 个核心,我们的流应用程序可能需要在作业 1 和作业 2 之间快速跳转,以同时向用户提供下载和查看。
6 W, n! i- ?* @# p, M2 h6 {* |" v# I+ e' G& h! w
a407c6066ad00a8c7c03424d87857d2c.png - }% B; E. q4 j# y3 j5 _
+ n5 U1 e0 c7 D+ _0 I! Y  u0 w5 T
了解 Arduino IDE 中的 STM32F103C8 如何捆绑 FreeRTOS 非常重要。虽然 FreeRTOS 是一个允许切换任务、调度等的底层软件框架,但我们不会直接调用 FreeRTOS。ARM 已经创建了 CMSIS-RTOS 库,它允许我们形成对底层 RTOS 的调用,从而提高了各种 ARM 处理器之间代码的可移植性。# j4 N7 `( U% \2 y" A% a$ T. r& |

% X# {& }5 g& x) [2 g  Q如何在 Arduino IDE 下载安装 STM32F103C8 可使用的FreeRTOS?

/ q/ j7 o% R5 M# J" X% j$ x2 l  G, u$ [/ d( E1 V5 O2 U' x! u0 _
第1步:* Z# X) D1 l0 `2 e; k
1 f8 R. n4 H# T# I3 _! f
在 Arduino IDE 中,首先转到 文件-> 首选项。复制下面的链接并按照下图粘贴到附加板管理器中。
( B1 Y2 _  ]3 h) T' y2 v
3 S8 f; b1 V) C 65bc46da144842c14ed87081666f73af.jpg $ @3 o$ W, {8 d# G! X2 I

+ o: Y9 Q% h8 k4 d$ t6 Q* \, I" }第2步:. x% L7 }2 B$ e" K- b4 I
/ N2 u5 [, ^) v
现在我们需要下载 FreeRTOS 库文件。如需下载,请转到项目->加载库,然后单击管理库。
7 ^* @' @' Z! |9 s# Y
: H; n, S) U  [ AH9RE_RMFXB3](~LRL{{}XW.png # E# n7 G* G$ e

! X% V3 m* ^2 {第 3 步:
# c4 M: ]* [: q9 n" H2 p; L1 m& J0 Y
现在,在搜索栏中输入 FreeRTOS,它会显示一些库文件,向下滚动并找到Richard Barry 的 STM32duino FreeRTOS。然后选择该库并单击安装。安装需要一些时间。安装后显示为INSTALLED。
- ~/ N! @! B: P8 I  I- ~
' x: g- O4 ?! \* `% M $[Y%[89_P3)K$N9]M5372%Y.png ) l; n/ \( A6 |

0 w) P# t( a$ U: ^9 ^第4步:
7 Y, B* V, f# g$ G$ `4 s  [9 J) r  }( b, b- b/ i
现在我们可以在 Arduino 使用 STM32F103C8 的 freeRTOS 库了。我们为板载 LED 和另一个单独的 LED 编写一个简单的闪烁程序。7 p, R% o! n+ K3 v

! k4 v  D  K& p! ^; `3 c准备配件
6 V& r+ o6 l. ^) h: ]- s5 L# y) k$ H0 V/ \+ V
本教程需要以下硬件。
0 N- E& O& `9 ]. ~' e7 S3 }' C  q4 F* ], U9 N
1. STM32F103C板
# C, [1 v1 I, F% r
% s- v! l3 @! M  j6 U- o2. FTDI
9 G/ b8 d7 t7 u
1 U. @( n9 }* E% a3. LED
$ H$ n* X0 S  T, k5 q/ Q+ O
2 T9 R, P0 F( F4. 跳线
, F1 X9 }8 A$ D# _, Q! [# q  v- L
5. 面包板
& \3 l" Y% f, P' b5 i* B! m' @2 `: L0 Z. `$ a+ k* c+ J
在这里,我将一个LED 连接到 PB11。9 H2 b% ?" B) }. c8 ], h) K2 \

( ]# u6 y# x7 r1 ~# c K5NZC]H8%_J`{CW_94FI_E0.png
5 q6 g* s& U+ z6 I' U  e  W0 Y, m# e8 c
如何使用 FreeRTOS 在 STM32F103C8 上运行两个不同的任务?
, x# r) I% ]' Q6 c; |9 |3 Z" D, v: S
使用两个 LED,并为这两个LED创建两个任务。一个 LED 每秒闪烁 1 次,另一个 LED 每200ms 闪烁一次。现在,让我们开始使用 FreeRTOS 编写这两个 LED 闪烁的代码。
* B2 k0 Y4 E0 _! @. j4 S! u3 \/ n) L* F7 O2 S3 t
下面是部分代码:
* p. k2 u) @8 n
3 p, Y/ K5 K+ o, K: a- f9 e
  1. static void task1(void * pvParameters) {
      c4 }5 M7 _# {5 ~/ S
  2. $ a; p) M- W( F( P! |
  3.   for (; ; ) {. J; g* a9 L" w, F0 C) R

  4. 7 e$ Q8 O6 m, q; Y
  5.     vTaskDelay(1000);
    & i7 _2 W; V, Z! P# Z
  6. : J# k' A7 a( q  l5 L6 E/ J- _- i
  7.     digitalWrite(BOARD_LED_PIN, HIGH);
    7 k& s8 @% B4 j

  8. 4 J- w% u5 ^# `2 Q  k
  9.     vTaskDelay(1000);) \! v$ a- e, u1 r0 _
  10. 4 B4 M6 H, q5 q6 N- c
  11.     digitalWrite(BOARD_LED_PIN, LOW);
    3 ?8 [" r0 j) i+ z

  12. 8 R) V" R' @. ~8 Z1 |/ ?/ i
  13.   }# D$ ?% d) e; U" i( q
  14. ( d0 X4 z0 ^3 g6 \5 B+ _$ t7 O4 n
  15. }
    " G. R0 g) m, {, U: Z. d; P

  16. ( _) r7 ?1 E: y2 k, `; I' B# x
  17. static void task2(void * pvParameters) {' ?  x9 p5 V2 u7 {  n

  18. - Q/ `: }2 v9 @8 ^  @9 m0 Z
  19.    for (; ; ) {
    1 b$ a- t8 A& q5 E4 r$ Z6 B

  20. 2 y+ ?5 z% {  I& j7 {
  21.     vTaskDelay(200);
    6 E3 z. L: u3 C6 Q' I( X8 {
  22. 1 {* p, W& j) T  {9 Q* |
  23.     digitalWrite(LED_PIN, HIGH);1 z6 }2 Q7 r  ]; n7 {
  24. 0 n: {3 ?! A+ N+ k/ |
  25.     vTaskDelay(200);: N' [9 l/ w3 ]- j  }9 Y7 u/ l

  26. * a! Y: z, ~! H( p7 r$ o
  27.     digitalWrite(LED_PIN, LOW);
    , j4 E' `0 r& o% p* `: R
  28. ' p6 m- Y- H. `" l. a
  29.   }
    1 @- S: Y* G# ~! y5 y6 z

  30. + h0 r! n# f# U( R' v  Q) H. t
  31. }
复制代码

5 [: e( \( \( p2 R8 M$ q% a上传代码后,即可看到结果。
& L, @0 h4 \9 T8 K, I7 \* f* S3 ?/ t# M  H2 U3 o4 Q
+ d( u& Q, _6 g4 Y& E8 C0 s9 Y5 [
赞 收藏 评论0 发布时间:2022-6-21 13:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

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