FreeRTOS事件标志组

事件标志组就是所有任务共享的3个字节(24位),相当于一个全局的标志变量,事件组有两个功能:等待和同步。

1.等待
当在某个任务执行到等待函数xEventGroupWaitBits(,Bit1,,,)时,CPU会判断该函数里面需要等待的位(Bit1)是否被置为1。若没有该任务停止执行,直到其他任务将该位置为1后继续执行。
相当于使用一个if(Bit1)进行循环判断,但是如果使用if判断需要一直浪费CPU的资源,使用事件组就可以节约很多资源。但是事件组也有一些缺点,一个事件组有24位,在写代码的过程中,需要明确每一位代表的含义。一旦一不小心弄错各个位所代表的内容,很可能造成程序上的错误,另一方面在读代码时也可能会很费劲。

2.同步
在实际的程序中,可能出现几个任务需要同时运行,事件组的同步功能就是同步各个任务执行的进度。实现的原理就是使用等待功能实现,只是换了几个函数的名字而已。

等待功能实现

1. 创建事件标志组

Ⅰ. 首先引用头文件#include <freertos/event_groups.h>
Ⅱ. 定义全局的事件组句柄static EventGroupHandle_t My_Event_Group; 一定要定义成全局的。
Ⅲ. 在主函数里面创建事件组My_Event_Group = xEventGroupCreate();

2. 等待事件

1
2
3
4
5
6
xEventGroupWaitBits(	My_Event_Group,	//事件组的句柄
SECRET_TASK, //等待事件组中的哪一位,可以是多位
pdFALSE, //执行后是否将对应的Bit重置为0
pdFALSE, //对于等待多位时,是使用与还是或判断,True为and false为or
portMAX_DELAY //等待的最大时长
); //记得加分号

3. 事件标志组置位函数

xEventGroupSetBits(My_Event_Group, Bit10); 这句话的含义是将My_Event_Group这个事件组里面的第十位置为1.
这个函数可以将事件标志组里面的某一位置为1,返回值是设置之后事件组的内容.

4. 其他函数
xEventGroupClearBits(My_Event_Group,0xffffff); 将某些位清为0
xEventGroupGetBits(My_Event_Group); 读取事件组内容