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

基于STM32F407的FreeRTOS阶段性的总结(13)

[复制链接]
攻城狮Melo 发布时间:2023-11-4 16:04
讲完了直达任务通知,我们的FreeRTOS系列的基础部分也都基本上讲完了,我们根据RTOS官方参考手册中的开发者文档,API参考手册介绍了FreeRTOS的一系列基础功能和概念。后续内容便是相关于堆栈,任务管理,内存管理等一系列内容可能会在后续继续更新(也可能寥寥无期)
9 r7 q0 \5 h: ]& u- Z+ Y
之后如果有机会我可能会去寻找一些使用FreeRTOS的高并发项目实战使用FreeRTOS进行项目实战(纸上得来终觉浅,绝知此事要躬行)也将继续在这个系列进行更新。  I2 I# `# ~9 Q( v, k2 F3 E
; q5 P7 I2 k# U* v1 A( B
本期将梳理FreeRTOS的基础部分以及对前面公众号作出总结。" E3 v0 B; g: w% @; H/ I9 o+ G

$ k1 s8 H$ j3 L& j+ e
以下的所有标题均可以跳转到对应的链接。
( m% W- `9 O4 P
9 C' f9 u" n3 ]( B$ Q
3 C! ^/ U; H+ G  `7 C- r, J
环境搭建
5 F+ Q9 r% V7 |) s4 h/ K0 M- \; B* J0 X7 |2 W: E
微信图片_20231104155231.png

3 x: b+ L2 _0 s5 j& W
/ W0 h# ^+ I0 m5 l  y  H$ r4 h
在这期中我们介绍了RTOS实习操作系统和我们平时使用的裸机编程区别。我们着重的介绍了前系统和后系统以及教大家如何搭建FreeRTOS工程。
6 G& e* S, m7 X( W6 c# \! A4 H5 P! U: T
在搭建环境的过程中需要注意的是一定要配置好工程的文件架构,在FreeRTOSconfig.h文件中使能启动函数,宏定义使能以及修改定义使得我们的编译器能够正常使用。! w- F3 x' C7 @* w2 W* r& f" z
2 {# A- {* w7 c* I
# x/ _9 E- B! f3 n; D4 v+ P- r1 i! R
任务的创建与删除  c; }0 ^2 A! Q$ }0 d
在结束完环境搭建后,我们介绍了创建任务和删除任务的函数以及开始任务调度的函数。
* _; R+ _6 d, Q, L% U4 w% n& y* K4 i2 c+ s. a
微信图片_20231104155229.png

& y0 \  b( X" g1 V6 l) b/ v2 q$ L; F
. r$ Z+ o& W5 z2 o' x$ V1 P1 i
我们使用了一个任务创建函数,在该函数中我们创建了三个任务函数,之后在任务删除函数过程中输入参数NULL使得创建任务的任务完成后及时删除任务防止其占用空间。
5 s% T& z. y7 l4 z, Y( r0 C2 f  K( I; t4 |
注意的是我们在创建任务的过程中传递的参数一定要进行检查否则系统很有可能在运行过程中崩溃。  r2 F5 w8 L; Z# s2 Y

# @9 k8 t- f8 F. i
; `8 i# h- E4 I( u, m$ I
任务的挂起与恢复
) W. V) c% }/ S8 j0 q0 D6 j# ^当我们创建完任务后,我们介绍了任务的四个状态:就绪,挂起,阻塞,运行。我们使用一张图简单的介绍这四种状态。- O: X- f8 e8 h3 Q
7 p; c3 O# f5 |: P2 K

/ ], q5 v) k) F/ L
微信图片_20231104155225.png
8 ?6 K4 Z/ c. }. a+ H1 ]( Q4 ]

; a, i& u( S$ ~& ~& o- `$ j之后我们介绍了两个函数如何将任务挂起和使挂起的任务恢复运行。并且进行了简单的测试。3 P2 E2 r) e- p+ a7 S
' M8 z7 u* @' E7 a% y+ p4 q5 q# C

5 a5 D% j. C" W( z/ j获取各任务运行时间及占用情况
& A  R! S' K; Y6 Y" P本期我们介绍到我们可以使用STM32的硬件定时器(频率至少是FreeRTOS系统时钟的十倍)来进行时间计数以获得系统的运行时间以及各任务占用系统资源的情况。有助于我们合理的分配系统的资源以及防止个别系统占用资源过高。1 S* ^; h* _4 y/ |: l3 p

/ ]% w8 T  E# B$ \" U5 {: n) \) G

' }3 E# [  r- f
微信图片_20231104155220.png
$ \; y$ I) G' K" X
8 N& o, F/ `% p+ N  M' T
消息队列
) S" y1 h7 s, P( }. _- p1 G) P在介绍完如何使用任务,之后也就开始了FreeRTOS的任务间通信,消息队列就是一个最基本的任务间通信方式。
9 f3 W! Y" N$ [3 N$ d4 b
; l9 W% d5 D8 C- X8 @8 Q; T* h
微信图片_20231104155216.png
9 G; `- m6 U* L, X) S; l3 `2 ?
9 ]7 y2 c1 v5 h2 a$ ?  _
队列由多个长度统一的项目组成,我们通过对队列发送消息,在其他任务运行过程中就可以从队列中读取相对应的消息以此来实现不同任务之间的通信。
6 @# G: A: d3 {* R: i$ e5 _; w. F5 e; `  a0 x& W+ r; f

) J) j( ?6 M. j( Y+ y: u信号量
- X7 J: a& ~% ]4 d) b! E- |+ ~" n) H信号量可以看作是特殊的队列,信号量分为三种,分别是二进制信号量,计数信号量以及互斥信号量。在使用信号量的时候我们不关心信号量(这个队列)的值是多少,我们只关心它的空间以及是否有值。我们通过读取和释放函数来利用信号量在不同的任务间传递信息。1 _  Z$ L- U  D9 |& K, o7 g

2 B4 ~$ |0 }9 q7 Z
0 ^7 S- c  O# Z' v3 ]4 N5 F
微信图片_20231104155213.png

! X1 L, C6 ?0 M; ^8 D
: O# N, v/ s5 F5 _% u4 K& Z

) x' f/ u2 V5 k; U. ?2 x但是在使用二进制信号量的时候很有可能发生优先级反转的现象,因此我们学习了如何使用互斥锁来解决优先级反转的现象。
% w: B* d+ H7 j6 Z& [0 }3 t
  a' \8 j& r3 v! t( e' y7 a

, c4 g# f: O( u5 x软件定时器$ {0 b6 x: W7 ]! {6 S
在这期内容中,我们介绍了软件定时器与硬件定时器的区别以及如何在FreeRTOS中使用软件定时器并使用软件定时器触发冲断调用回调函数。我们测试了软件定时器的使用以及其注意事项(不能加任何阻塞)" \4 b, N6 Y! y: I7 \

+ l! `7 [( `9 l( P8 b
微信图片_20231104155208.png
. {6 Z/ ?  H' u; f

. q) y) _1 D# r3 U0 t事件组0 ^/ R, L: C! j) U9 g1 j
事件组由许多的事件位组成,不同的事件位可以由不同的事件触发而改变,我们利用事件组可以很好的管理任务。
' s+ ^% }! X9 d( x
/ z0 G9 F) A# w% h" _0 O6 V
微信图片_20231104155155.png
) d6 q/ O- V4 Q1 y# }1 w9 h

8 V0 G/ h$ C& |# O# S任务通知" o9 U/ v2 w- ]' }7 Z
最后我们学习了任务通知以及如何利用任务通知实现信号量以及事件组,任务通知可以帮助我们实现轻量级的任务间通信。, b$ [& E( y4 }! ~
% p4 X& n! [$ G
微信图片_20231104155150.png
3 ~2 R% P. A% I& c

1 @$ Y0 n, @( l* t- G+ P. F
1 U5 y4 C7 K9 N: J+ K# z转载自:电路小白
7 g- h+ V, {. W! w6 T如有侵权请联系删除7 q- Z& r2 m# D3 H. b& {
) ]3 \9 y+ ]$ Q) ?2 ^
4 t6 J1 u5 f7 F7 M5 x. _% @# ^9 Y5 S

0 f8 w* j( g) }, I! J
收藏 评论1 发布时间:2023-11-4 16:04

举报

1个回答
xu@xupt 回答时间:2023-11-5 10:10:56

能不能整理一个完整版本的

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