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

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

[复制链接]
STMCU小助手 发布时间:2022-6-21 13:05
# e. l- c9 L2 X" L( S7 X. j! w
b7fab167dd363ff71e43e0e67266c046.png ! S  c5 ?' V1 Y1 M- j  A& i; `

% q0 ~6 j* h0 F概述:适用于 STM32F103C8 的 FreeRTOS
) L# ~( T0 T% G6 G1 H  `1 G% `
; p7 R9 `: [# u6 t8 |/ Y7 {1 XSTM32F103C 是一款ARM Cortex M3 处理器。我们可以在 Arduino IDE 中使用适用于 STM32F103C8 的 FreeRTOS。我们也可以使用 Keil,但这个过程相对冗长:我们需要将下载的文件下载并粘贴到 Keil 路径中,这里我们使用 Arduino IDE 的方式。1 _/ |8 M2 X, ?  C$ p+ m

: s2 n( c, z( `) M: Z# g6 ^7 X1 v要了解 FreeRTOS 文档和方法定义,您可以查看FreeRTOS STM32F103C8。
( H/ Z5 K& s- c6 S. g. L9 z/ u! n- s2 D% M
什么是 FreeRTOS?
) H, w) X6 r/ B& J) `& T" J/ U/ J* I# \9 J0 f
FreeRTOS 可能是一种免费的开源实时操作系统 (RTOS),可在包括 STM32 在内的许多流行微控制器上运行。
, `% b6 K8 A4 Z0 {7 j/ L6 B
& ~+ j! _. f, t操作系统可以是在计算系统期间管理其他软件和硬件资源的软件。通用操作系统通常在设计时关注用户体验。$ i9 c% G* ]$ ^/ V5 v2 R$ w7 {
/ R; Z6 a$ ?  B9 j  O/ \
例如,假设我们正在为手机操作系统开发一个应用程序。用户可能想要流式传输电影,因此我们可以将流式传输体验分为两个工作:工作1 从 Web 下载视频;工作2将每个视频块显示给用户。这些工作可能是等效工作的一部分程序,也就是同时进行的。在这种情况下,它们可以实现为并发运行的线程。2 G6 q2 l- Z) d7 U

5 U- R3 v% y( ~& Q& r8 x$ \: H如果我们的处理器只有 1 个核心,我们的流应用程序可能需要在作业 1 和作业 2 之间快速跳转,以同时向用户提供下载和查看。' y$ V/ s  ]' G2 B, I3 H

; b4 t$ T$ Y# R a407c6066ad00a8c7c03424d87857d2c.png " Z, J! u' O" ?- s9 @

9 k3 G: f0 T4 I了解 Arduino IDE 中的 STM32F103C8 如何捆绑 FreeRTOS 非常重要。虽然 FreeRTOS 是一个允许切换任务、调度等的底层软件框架,但我们不会直接调用 FreeRTOS。ARM 已经创建了 CMSIS-RTOS 库,它允许我们形成对底层 RTOS 的调用,从而提高了各种 ARM 处理器之间代码的可移植性。1 q8 Q) b) u+ ]+ K9 H0 w& L
8 z. m  K7 M2 b4 ?
如何在 Arduino IDE 下载安装 STM32F103C8 可使用的FreeRTOS?

% T& ~5 w+ }4 U6 C( v9 g0 P9 i( r& j: z3 u, A( U
第1步:1 G. ^% w3 A. M  b* l3 q

8 x( ?; q5 U: G  a% O+ c. W- l在 Arduino IDE 中,首先转到 文件-> 首选项。复制下面的链接并按照下图粘贴到附加板管理器中。
7 w4 }# L" W7 E
4 k# _  c* I$ E4 y/ s 65bc46da144842c14ed87081666f73af.jpg   _2 _9 @* ?  ]7 x+ ]* @
6 @! g* o5 g( H: |3 U: D: _- t. n
第2步:
( I! P2 I- X, N6 k- j& x
$ B# O& s. R- j% G+ k8 z% @! I现在我们需要下载 FreeRTOS 库文件。如需下载,请转到项目->加载库,然后单击管理库。
$ y4 _( A& l$ p/ S$ h6 z: P6 z
. a1 f3 F! D: O$ Z AH9RE_RMFXB3](~LRL{{}XW.png 6 r, Q, R7 N2 e
) @$ E2 u) |9 [* Q) G- K
第 3 步:
, s9 W  n# G$ [5 w- }, \
4 k8 X7 O- C0 u$ N% o' m: n! W4 Q现在,在搜索栏中输入 FreeRTOS,它会显示一些库文件,向下滚动并找到Richard Barry 的 STM32duino FreeRTOS。然后选择该库并单击安装。安装需要一些时间。安装后显示为INSTALLED。1 w$ V& |/ c% g' D0 X, F5 j

. O7 q3 N- @$ R8 @ $[Y%[89_P3)K$N9]M5372%Y.png
3 ], g1 j0 m( y6 |
# f  f. r; H2 m: `+ S第4步:
" ^5 P# u5 q5 g( e8 _
, G: I& X/ T' Y& l& N现在我们可以在 Arduino 使用 STM32F103C8 的 freeRTOS 库了。我们为板载 LED 和另一个单独的 LED 编写一个简单的闪烁程序。: t6 x' ]0 i' z. ]

- V/ \5 \0 f) b' Q8 B准备配件; x0 @3 \: ^$ I; b
6 r1 f% A9 j8 T1 d$ i: A0 H  t
本教程需要以下硬件。
, L( I/ I" K" @, z- c! H- B1 Y
8 T& ?$ {! B! [1. STM32F103C板
2 E. _' K7 G% q6 H) e! L# Z6 S" R6 C/ ?5 X
2. FTDI7 e! {% t8 l5 N4 r! ~+ W" D

+ i2 s: O0 y$ A1 z( F6 P3. LED
0 C# [" _0 _/ E. Z8 H( ]7 R+ ?- G( q9 u; F  b
4. 跳线
+ ]+ E  D1 G: @2 m. {6 B
6 Q  S" O( M4 n' B# r7 h6 C& @1 H5. 面包板
& ]0 o8 \5 V; E( Z* |2 i4 l
: }" [- T% v0 Q* X% E0 e/ k在这里,我将一个LED 连接到 PB11。
5 C3 K. Z& L4 y$ Q$ Z  h4 ^& _: ~2 C1 K7 X% g6 D
K5NZC]H8%_J`{CW_94FI_E0.png
3 a: s9 {! V, }+ r6 x7 l! C6 C. q
; B+ y3 A) t8 P9 S& h/ `) X- U如何使用 FreeRTOS 在 STM32F103C8 上运行两个不同的任务?, Y9 b5 A& B) c1 T; A* m; P( G
/ L, L9 g) N  z5 p  o+ F- N
使用两个 LED,并为这两个LED创建两个任务。一个 LED 每秒闪烁 1 次,另一个 LED 每200ms 闪烁一次。现在,让我们开始使用 FreeRTOS 编写这两个 LED 闪烁的代码。4 Q8 K7 P- d7 O' N* f4 x
/ T# w5 F% A4 ^( }
下面是部分代码:1 ~/ x8 ^$ X0 b, f+ e4 X; T" Z
% J4 O2 j/ E& I4 |
  1. static void task1(void * pvParameters) {2 P! Z/ |! S* {9 S! c- @
  2. . g4 p  f0 m/ `. F9 M) u& D) y, a
  3.   for (; ; ) {
    ) ], E: G4 s& c! J1 Q* R2 E: A' ]( u
  4. * Q. G1 ~# O  E7 n) \& c9 J
  5.     vTaskDelay(1000);, L5 g; y( w% M! [, W% u
  6. % C9 c0 v% L5 U) m% Z9 N0 @
  7.     digitalWrite(BOARD_LED_PIN, HIGH);
    # _, w! z& B6 d3 O

  8. ' a* `% i; v4 {7 w* E' |( {; G
  9.     vTaskDelay(1000);' d; z( K) c9 D& g
  10. ; ]# y. a' @& a, Y/ j: `7 S. g
  11.     digitalWrite(BOARD_LED_PIN, LOW);
    : N2 u7 K1 u" q0 \" _' m

  12. 8 i0 z( r! r; ]" Y
  13.   }
      [$ b$ B9 a  h; {* p% ^! u' X
  14. . z$ a+ D3 s. }
  15. }, b( O3 m1 N! s7 D* |; m) @

  16. + c8 u( d  z# A) p2 H$ p
  17. static void task2(void * pvParameters) {0 \2 r8 L& a' |
  18. 5 w& d* K! t3 @* j" V) }3 V
  19.    for (; ; ) {
    9 K: n  P% E7 D! o
  20. * m5 {, Y6 k0 Z5 t
  21.     vTaskDelay(200);
    * |4 V1 {( e3 C4 ^
  22.   m# _( v" D; Z
  23.     digitalWrite(LED_PIN, HIGH);2 A! L% q8 d& m8 F7 h

  24. * L+ z) s, l' k+ {2 l, A
  25.     vTaskDelay(200);
    ( r8 e) M: f3 x. D2 q( }

  26. 6 ?0 w" ~$ [) f5 f
  27.     digitalWrite(LED_PIN, LOW);( Y+ D. m2 f6 p% G

  28. 0 A% i5 X  Y- I. a& \
  29.   }6 s- j, q( b% `" S8 a

  30. 6 j5 s4 p. A2 n/ \9 m
  31. }
复制代码

3 v0 {+ O3 d. [! L3 Z0 w5 b上传代码后,即可看到结果。
* ?) n9 a/ N6 J' \1 ]/ Q' x0 c
7 ]2 t7 I0 [2 f- b9 `' N( f3 K
/ X3 c  [5 r$ D
收藏 评论0 发布时间:2022-6-21 13:05

举报

0个回答

所属标签

相似技术帖

官网相关资源

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