一.事件组是什么?
事件类似与信号量,可以等待某一个事件的发生,但是也可以等待某几件事情的发生。这个就比较重要了。列如,在环境监测中,温度达到30°以上同时湿度百分之50以上,就报警。在这种情况下信号量就不太适应了。这时候可以使用事件。
二.如何使用事件组
首先我们可以看到FreeRTOSConfig.h中
#define configUSE_16_BIT_TICKS 1
如果定义为1,EventBits_t就是16位,最多只能存储8个不同事件,为0的话,EventBits_t就是32位可以存储24个不同的事件。
当我们使用的时候,一个任务中可以令EventBits某一位置1,其他一个任务中可以一直阻塞等待EventBits_t的这一位置1.这样就完成了信号量的功能。我们也可以任务1发生,第一位置1,任务二发生,第二位置1,任务三一直阻塞等待第一位和第二位都为1.这样就完成事件专属的特性。
三.事件代码层
static EventGroupHandle_t Event_Handle=NULL; //创建Event_Handle Event_Handle=xEventGroupCreate(); static void task1(void * parameter) { while(1) { /* */ // 低一位置1 xEventGroupSetBits(Event_Handle,1<<0); } } static void task2(void * parameter) { while(1) { /* */ // 低二位置1 xEventGroupSetBits(Event_Handle,1<<1); } } static void task3(void * parameter) { while(1) { //等待阻塞 xEventGroupWaitBits(Event_Handle, (1<<0|1<<1), //感兴趣的位 pdTRUE, //退出时清0 pdTRUE, //满足感兴趣的所有事件 portMAX_DELAY);//一直等待 } }