任务间的同步为什么要用事件组,而不用全局变量呢?
在裸机开发当中,一般都是将任务用函数的形式进行分配,用全局变量进行同步再爽不过,其实主要存在两个原因,第一就是没有系统的调度,一切都在后台的超级循环中,通过全局变量进行选择查询的方式,进行函数执行顺序的同步。
冒天下之大不韪:其实在有RTOS的系统中,你也可以通过全局变量进行任务间的同步,这么干的人可不止我一个。其实有好多人用RTOS并不是特别熟悉,任务创建那一套一上,基本上就是靠全局变量进行同步,他用的最多的关于RTOS的API,可能也就是delay了,这么干行不行,当然行,但是说实话有点大材小用,你都上了RTOS了,何不用系统自带的任务同步机制?——唯一的理由可能是这玩意儿学起来真有点费劲。
当然你这么用的坏处也显而易见:RTOS最核心的任务调度机制已经被你废了一大半了。
事件组本质上来讲:就是全局变量!!!(为啥没人说这句实话)
虽然他是一个全局变量,但是他需要使用FreeRTOS提供的相关API进行访问,为啥子要这样干, 就是为了让RTOS的调度器知道,每个任务与事件组之间的依赖关系,通过事件组的设定的不同进行任务状态的划分定义,他才能真正起到调度的作用。
说白了,调度器不光要负责根据任务的状态以及优先级完成调度工作,他还要给每个任务去定义任务当前的状态是什么。
事件组则更好理解了,事件组 = 全局变量 + RTOS的API操作。目的有两个:
1.让调度器清楚地知道事件组的状态。
2.完成事件组的访问及设定功能。
希望扯到这里,你能对FreeRTOS为啥要用事件组这种方式,而不是用全局变量进行任务同步有个清醒的认识,同时希望你明白,事件组的本质就是全局变量。
创建一个事件组:
设置一个事件组标志:
获取事件组的标志信息:
备注:以上皆为任务间同步的事件组应用,中断服务例程与任务间通过事件组同步的API以及应用方式稍有不同。