讲完了直达任务通知,我们的FreeRTOS系列的基础部分也都基本上讲完了,我们根据RTOS官方参考手册中的开发者文档,API参考手册介绍了FreeRTOS的一系列基础功能和概念。后续内容便是相关于堆栈,任务管理,内存管理等一系列内容可能会在后续继续更新(也可能寥寥无期)2 Y% ?" X8 j- R L( c 之后如果有机会我可能会去寻找一些使用FreeRTOS的高并发项目实战使用FreeRTOS进行项目实战(纸上得来终觉浅,绝知此事要躬行)也将继续在这个系列进行更新。. ?4 A5 V! f' x2 R 本期将梳理FreeRTOS的基础部分以及对前面公众号作出总结。 以下的所有标题均可以跳转到对应的链接。7 r* |: Z, a+ P: P8 `1 W 8 s: g& F, R r8 } 环境搭建2 b6 g% I% X9 q3 y# c / K- G9 Y: X1 r/ c: y2 m9 l8 a 在这期中我们介绍了RTOS实习操作系统和我们平时使用的裸机编程区别。我们着重的介绍了前系统和后系统以及教大家如何搭建FreeRTOS工程。7 _- m$ k/ ^/ Z' G/ J 在搭建环境的过程中需要注意的是一定要配置好工程的文件架构,在FreeRTOSconfig.h文件中使能启动函数,宏定义使能以及修改定义使得我们的编译器能够正常使用。 $ w# Q r9 J R3 C& |# T . z. S7 t- c1 k( U; ] 任务的创建与删除 在结束完环境搭建后,我们介绍了创建任务和删除任务的函数以及开始任务调度的函数。( z% Z: f3 {) n& j+ p+ B8 @" y 4 m, a; ?, ^& x 我们使用了一个任务创建函数,在该函数中我们创建了三个任务函数,之后在任务删除函数过程中输入参数NULL使得创建任务的任务完成后及时删除任务防止其占用空间。: f7 o2 u1 y' j% g! [5 i- Y . w) M: Z; U! i4 k+ e 注意的是我们在创建任务的过程中传递的参数一定要进行检查否则系统很有可能在运行过程中崩溃。" T" E1 J0 @2 C! ~5 y 任务的挂起与恢复 当我们创建完任务后,我们介绍了任务的四个状态:就绪,挂起,阻塞,运行。我们使用一张图简单的介绍这四种状态。# d6 g9 w" O4 X, ?* j5 V+ b 6 l* q8 S) R) k1 } r/ n: H' ? 之后我们介绍了两个函数如何将任务挂起和使挂起的任务恢复运行。并且进行了简单的测试。 ( x4 [6 Y$ ?7 j" ^ 获取各任务运行时间及占用情况9 i" z2 ^4 I, a4 Q q3 m5 q2 I1 h 本期我们介绍到我们可以使用STM32的硬件定时器(频率至少是FreeRTOS系统时钟的十倍)来进行时间计数以获得系统的运行时间以及各任务占用系统资源的情况。有助于我们合理的分配系统的资源以及防止个别系统占用资源过高。 , {8 D/ l9 l" X* S ! `2 Q6 k2 s: E( v7 o 4 y: o+ J+ x. i. O+ d" q 消息队列; k5 [! e7 r" Z& c! m* m 在介绍完如何使用任务,之后也就开始了FreeRTOS的任务间通信,消息队列就是一个最基本的任务间通信方式。! n1 {3 S) `" f ; Y; d% a) o+ r2 N. Q 6 \9 u; T3 _8 U. ^- c/ [ 队列由多个长度统一的项目组成,我们通过对队列发送消息,在其他任务运行过程中就可以从队列中读取相对应的消息以此来实现不同任务之间的通信。 ! Y' |1 \ u+ Q3 u! B" z" R6 k; r - \! I' u( k& o O5 U 信号量8 v# ^7 P7 k* D. e5 g+ g% N 信号量可以看作是特殊的队列,信号量分为三种,分别是二进制信号量,计数信号量以及互斥信号量。在使用信号量的时候我们不关心信号量(这个队列)的值是多少,我们只关心它的空间以及是否有值。我们通过读取和释放函数来利用信号量在不同的任务间传递信息。* R+ J9 N- c1 Y 9 L. Q3 g0 i" { M 但是在使用二进制信号量的时候很有可能发生优先级反转的现象,因此我们学习了如何使用互斥锁来解决优先级反转的现象。% m' n8 h# T9 t2 l9 G* P! Y 1 v/ y" X+ a9 I! n/ A ! w4 _' E* n9 @" [/ } 软件定时器 在这期内容中,我们介绍了软件定时器与硬件定时器的区别以及如何在FreeRTOS中使用软件定时器并使用软件定时器触发冲断调用回调函数。我们测试了软件定时器的使用以及其注意事项(不能加任何阻塞)' l3 R0 J6 ^6 v& M! d- j 0 M5 [6 m) }! D) Y ) P: l% n/ t1 z+ i 事件组 事件组由许多的事件位组成,不同的事件位可以由不同的事件触发而改变,我们利用事件组可以很好的管理任务。 \0 |5 L$ [% p5 a' F& ^ L ( G: b9 x; }6 e" J' H# J3 D 6 G! b7 p: r2 c1 S$ e 任务通知# l8 z# q. j. a( i" Q 最后我们学习了任务通知以及如何利用任务通知实现信号量以及事件组,任务通知可以帮助我们实现轻量级的任务间通信。4 Q# l4 A) m4 Z/ l & w& O5 G9 `; L% J3 { 0 v1 V7 U* r9 D+ v; M 2 k& N( Z3 O$ b+ w5 J 转载自:电路小白 如有侵权请联系删除 4 g" C$ l2 [/ k% R( i$ Y+ q( R 7 v/ ?: C- F* { |
STM32固件库分享,超全系列整理
【中文文档】AN3965_STM32F40x和STM32F41x基于串口的IAP
STM32F4-DISC 实现USB主机(U盘)和USB设备(虚拟串口)自动切换
STM32F4中文用户手册
STM32F400、STM32F402 Cortex-M4超值单片机
基于STM32F407的FreeRTOS获取各任务运行时间及占用情况(4)
基于STM32F407的FreeRTOS任务的挂起与恢复(3)
基于STM32F407的FreeRTOS任务的创建与删除经验分享(2)
基于STM32F407的FreeRTOS环境搭建经验分享(1)
用STM32F4实现的USB摄像头UVC,配合上位机可识别车牌
能不能整理一个完整版本的