一、简介
使用信号量来同步的话任务只能与单个的事件或任务进行同步,但是有时候需要多个事件或者多个任务进行同步,这时候就不适合使用信号量。
1、事件位
事件位用来表示某个事件是否发生,事件位通常用作事件标志。比如以下的几个例子:
- 当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置 1,当队列中没有消息需要处理的时候就可以将这个位(标志)置 0。
- 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置 1,当没有数据需要从网络发送出去的话就将这个位(标志)置 0。
- 现在需要向网络中发送一个心跳信息,将某个位(标志)置 1。现在不需要向网络中发送心跳信息,这个位(标志)置 0。
2、事件组
一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问,同样,以上面列出的三个例子为例:
- 事件标志组的 bit0 表示队列中的消息是否处理掉。
- 事件标志组的 bit1 表示是否有消息需要从网络中发送出去。
- 事件标志组的 bit2 表示现在是否需要向网络发送心跳信息。
3、事件标志组和事件位的数据类型
事件标志组的句柄类型为 EventGroupHandle_t,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24个事件位。
事件标志组中的所有事件位都存储在一个无符号的EventBits_t类型的变量中,EventBits_t在 event_groups.h 中有如下定义:
typedef TickType_t EventBits_t;
数据类型 TickType_t 在文件 portmacro.h 中有如下定义:
#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#define portTICK_TYPE_IS_ATOMIC 1
#endif
当configUSE_16_BIT_TICKS为0的时候TickType_t是个32位的数据类型,因此EventBits_t也是个32位的数据类型。EventBits_t 类型的变量可以存储24个事件位,另外的那高8位有其他用。
二、相关函数
1、创建事件标志组
一、简介
使用信号量来同步的话任务只能与单个的事件或任务进行同步,但是有时候需要多个事件或者多个任务进行同步,这时候就不适合使用信号量。
1、事件位
事件位用来表示某个事件是否发生,事件位通常用作事件标志。比如以下的几个例子:
- 当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置 1,当队列中没有消息需要处理的时候就可以将这个位(标志)置 0。
- 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置 1,当没有数据需要从网络发送出去的话就将这个位(标志)置 0。
- 现在需要向网络中发送一个心跳信息,将某个位(标志)置 1。现在不需要向网络中发送心跳信息,这个位(标志)置 0。
2、事件组
一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问,同样,以上面列出的三个例子为例:
- 事件标志组的 bit0 表示队列中的消息是否处理掉。
- 事件标志组的 bit1 表示是否有消息需要从网络中发送出去。
- 事件标志组的 bit2 表示现在是否需要向网络发送心跳信息。
3、事件标志组和事件位的数据类型
事件标志组的句柄类型为 EventGroupHandle_t,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24个事件位。
事件标志组中的所有事件位都存储在一个无符号的EventBits_t类型的变量中,EventBits_t在 event_groups.h 中有如下定义:
typedef TickType_t EventBits_t;
数据类型 TickType_t 在文件 portmacro.h 中有如下定义:
#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#define portTICK_TYPE_IS_ATOMIC 1
#endif
当configUSE_16_BIT_TICKS为0的时候TickType_t是个32位的数据类型,因此EventBits_t也是个32位的数据类型。EventBits_t 类型的变量可以存储24个事件位,另外的那高8位有其他用。
二、相关函数
1、创建事件标志组
- 函数xEventGroupCreate()
此函数用于创建一个事件标志组,是通过动态内存管理方法分配。由于内部处理的原因,事件标志组可用的 bit 数取决于 configUSE_16_BIT_TICKS , 当configUSE_16_BIT_TICKS1 为 1 的 时 候 事 件 标 志 组 有 8 个 可 用 的 位 (bit0~bit7) , 当configUSE_16_BIT_TICKS 为 0 的时候事件标志组有 24 个可用的位(bit0~bit23)。EventBits_t 类型的变量用来存储事件标志组中的各个事件位,
返回值:
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。
EventGroupHandle_t xEventGroupCreate( void )
- xEventGroupCreateStatic()
返回值:
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer )
//参数是保存事件标志组结构体
2、设置事件位
- xEventGroupClearBits()
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 要清零的事件位,比如要清除 bit3 的话就设置为 0X08。可以同时清除多个bit。
如设置为 0X09 的话就是同时清除 bit3 和 bit0。
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToClear );
- xEventGroupClearBitsFromISR()
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 要清零的事件位
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet );
- xEventGroupSetBits()
xEventGroup: 要操作的事件标志组的句柄。
uxBitsToClear: 指定要置 1 的事件位,比如要将 bit3 值 1 的话就设置为 0X08。可以同时将多个
bit 置 1,如设置为 0X09 的话就是同时将 bit3 和 bit0 置 1。
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet );
- xEventGroupSetBitsFromISR()
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, //要操作的事件标志组的句柄。
const EventBits_t uxBitsToSet, //要置 1 的事件位
BaseType_t * pxHigherPriorityTaskWoken );//是否进行任务切换的标志
3、获取事件标志组值
- xEventGroupGetBits()
参数:xEventGroup: 要获取的事件标志组的句柄。
返回值:当前事件标志组的值
EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )
- xEventGroupGetBits()
》》》用于中断中《《《《
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
4、等待指定的事件位(常用函数)
某个任务可能需要与多个事件进行同步,那么这个任务就需要等待并判断多个事件位(标 志),使用函数 xEventGroupWaitBits()可以完成这个功能。调用函数以后如果任务要等待的事件位还没有准备好(置 1 或清零)的话任务就会进入阻塞态,直到阻塞时间到达或者所等待的事件位准备好。
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,//要等待的事件标志组
const EventBits_t uxBitsToWaitFor,//:指定要等待的事件
//位,比如要等待bit0和(或)bit2的时候此参数就是0X05
const BaseType_t xClearOnExit,//此参数要是为pdTRUE的话,
//那么在退出此函数之前由参数uxBitsToWaitFor所设置的这些
//事件位就会清零。如果设置位 pdFALSE 的话这些事件位就不会改变。
const BaseType_t xWaitForAllBits,
/**
此参数如果设置为 pdTRUE 的话,当 uxBitsToWaitFor 所设置的这些事件
位都置 1,或者指定的阻塞时间到的时候函数 xEventGroupWaitBits()才会
返回。当此函数为 pdFALSE 的话,只要 uxBitsToWaitFor 所设置的这些事
件 位 其 中 的 任 意 一 个 置 1 , 或 者 指 定 的 阻 塞 时 间 到 的 话 函 数
xEventGroupWaitBits()就会返回。
**/
const TickType_t xTicksToWait );//设置的阻塞时间