程序小白
认证:优质创作者
所在专题目录 查看专题
关于软件的作用域和生命周期的一些理解
浅析RTOS中的钩子函数(HOOK)
RTOS的时间片调度不同处——FreeRTOS与RTT
FreeRTOS中任务间的同步——事件组与全局变量
FreeRTOS的优先级翻转与继承
作者动态 更多
小小调度器——开局default,优雅总藏于细节之中
2星期前
小小调度器——调度器核心的纯C实现
3星期前
小小调度器——原来C代码还能这么写,原作者没少挨打吧!
3星期前
解析由系统库引发的hardfault血案(RT-Thread+ESP32)
2023-07-17 16:04
TINA瞬时现象仿真分析——运放缓冲器振铃
2023-02-28 11:38

FreeRTOS中任务间的同步——事件组与全局变量


任务间的同步为什么要用事件组,而不用全局变量呢?


      在裸机开发当中,一般都是将任务用函数的形式进行分配,用全局变量进行同步再爽不过,其实主要存在两个原因,第一就是没有系统的调度,一切都在后台的超级循环中,通过全局变量进行选择查询的方式,进行函数执行顺序的同步。


      冒天下之大不韪:其实在有RTOS的系统中,你也可以通过全局变量进行任务间的同步,这么干的人可不止我一个。其实有好多人用RTOS并不是特别熟悉,任务创建那一套一上,基本上就是靠全局变量进行同步,他用的最多的关于RTOS的API,可能也就是delay了,这么干行不行,当然行,但是说实话有点大材小用,你都上了RTOS了,何不用系统自带的任务同步机制?——唯一的理由可能是这玩意儿学起来真有点费劲。

      当然你这么用的坏处也显而易见:RTOS最核心的任务调度机制已经被你废了一大半了。


      事件组本质上来讲:就是全局变量!!!(为啥没人说这句实话)

      虽然他是一个全局变量,但是他需要使用FreeRTOS提供的相关API进行访问,为啥子要这样干, 就是为了让RTOS的调度器知道,每个任务与事件组之间的依赖关系,通过事件组的设定的不同进行任务状态的划分定义,他才能真正起到调度的作用。

      说白了,调度器不光要负责根据任务的状态以及优先级完成调度工作,他还要给每个任务去定义任务当前的状态是什么。

      事件组则更好理解了,事件组 = 全局变量 + RTOS的API操作。目的有两个:

      1.让调度器清楚地知道事件组的状态。

      2.完成事件组的访问及设定功能。


      希望扯到这里,你能对FreeRTOS为啥要用事件组这种方式,而不是用全局变量进行任务同步有个清醒的认识,同时希望你明白,事件组的本质就是全局变量。


创建一个事件组:

设置一个事件组标志:

获取事件组的标志信息:


      备注:以上皆为任务间同步的事件组应用,中断服务例程与任务间通过事件组同步的API以及应用方式稍有不同。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 4
收藏 2
关注 114
成为作者 赚取收益
全部留言
0/200
  • chaochao1545 2021-10-12 13:30
    正好在学习freertos
    回复