【嵌入式——FreeRTOS】事件标志组
- 简介
- 相关API
- 代码示例
简介
事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但是事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,事件可以实现一对多,多对多的同步,即一个任务可以等待多个事件的发生,可以是任意一个事件发生时唤醒任务唤醒任务进行事件处理,也可以是几个事件都发生后才唤醒任务进行事件处理。同样也可以是多个任务同步多个事件。
事件标志位:用一个位来表示事件是否发生。
事件标志组是一组事件标志位的集合,可以简单的理解事件标志组就是一个整数。
事件标志组特点
- 它的每一个位表示一个事件(高8位不算)
- 每一个位事件的含义,由用户自己决定,如bit0表示按键是否按下
- 这些位的值为1,表示事件发生了,值为0,表示事件未发生
- 任意任务或中断都可以读写这些位
- 可以等待某一位成立,或者等待多位同时成立
一个事件组就包含了一个EventBites_t数据类型的变量
EventBites_t实际上是一个16位或32位无符号的数据类型。
虽然使用了32位无符号的数据类型变量来存储事件标志,但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志,所以说一个事件组最多可以存储24个事件标志。
事件标志组与队列、信号量的区别
队列、信号量:事件发生时只会唤醒一个任务,是消耗型的资源,队列的数据被读走就没了,信号量被获取后就减少了。
事件标志组:事件发生时,会唤醒所有符合条件的任务,可以理解为"广播"的作用,被唤醒的任务有两个选择,可以让事件保留不动,也可以清除事件。
相关API
函数 | 描述 |
---|---|
xEventGroupCreate() | 使用动态方式创建事件标志组 |
xEventGroupCreateStatic() | 使用静态方式创建事件标志组 |
xEventGroupClearBits() | 清零事件标志位 |
xEventGroupClearBitsFromISR() | 在中断中清零事件标志位 |
xEventGroupSetBits() | 设置事件标志位 |
xEventGroupSetBitsFromISR() | 在中断中设置事件标志位 |
xEventGroupWaitBits() | 等待事件标志位 |
xEventGroupSync() | 设置事件标志位,并等待事件标志位 |
//返回值 NULL 事件标志组创建失败,其他值 创建成功,返回句柄
EventGroupHandle_t xEventGroupCreate( void )EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer )//xEventGroup 待操作的事件标志组句柄 uxBitsToClear 待清零的事件标志位
//返回值 整数 清零事件标志位之前事件标志组中事件标志位的值
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear )BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear )//xEventGroup 待操作的事件标志组句柄 uxBitsToSet 待设置的事件标志位
//返回值 整数,事件组中的事件标志位
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet )BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,BaseType_t * pxHigherPriorityTaskWoken )//xEventGroup 等待的事件标志组句柄
//uxBitsToWaitFor 等待的事件标志位,可以用逻辑或等待多个事件标志位
//xClearOnExit 成功等待到事件标志位后,清除事件组中对应的事件标志位 pdTRUE 清除uxBitsToWaitFor指定位,pdFALSE不清除
//xWaitForAllBits 等待uxBitsToWaitFor 中的所有事件标志位(逻辑与) pdTRUE等待的位全部为1,pdFALSE等待的位某个为1
//xTicksToWait 等待的阻塞时间
//返回值 等待的事件标志位值(等待事件标志位成功,返回等待到的事件标志位)
//其他值,等待的事件表示为失败,返回事件组中的事件标志位。
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait )
//xEventGroup 等待事件标志所在事件组
//uxBitsToSet 达到同步点后,要设置的事件标志
//uxBitsToWaitFor 等待的事件标志
//xTicksToWait 等待的阻塞时间
//返回值 等待的事件标志位,等待事件标志位成功,返回等待到的事件标志位
//其他值 等待事件标志位失败,返回事件组中的事件标志位
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait )
代码示例
#define EVENTBIT_0 (1<<0)
#define EVENTBIT_1 (1<<1)EventGroupHandle_t eventgroup_handle;
void init(){eventgroup_handle = xEventGroupCreate();
}void task1(){uint8_t key = 0;while(1){key = key_scan();if(key == KEY0_PRES){xEventGroupSetBits(eventgroup_handle,EVENTBIT_0);}else if(key == KEY1_PRES){xEventGroupSetBits(eventgroup_handle,EVENTBIT_1);}}
}void task2(){EventBits_t event_bit = 0;while(1){event_bit = xEventGroupWaitBits(eventgroup_handle,EVENTBIT_0 | EVENTBIT_1 ,pdTRUE,pdTRUE,portMax_DELAY);printf("event_bit = %x",event_bit);}
}