文章目录
- 一、事件组理论
一、事件组理论
区别于之前的队列、信号量、互斥量只能用于单个事件,事件组用于多个事件
事件组结构体:用uxEventBits整数来代表多个事件,每一位代表一个事件。类似于GPIOx_IDR寄存器。
typedef struct EventGroupDef_t
{EventBits_t uxEventBits;List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */#if ( configUSE_TRACE_FACILITY == 1 )UBaseType_t uxEventGroupNumber;#endif#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */#endif
} EventGroup_t;
创建事件组
使用事件组之前,要先创建,得到一个句柄;使用事件组时,要使用句柄来表明使用哪个事件组。
EventGroupHandle_t xEventGroupCreate( void );
设置事件,对应某一位
可以设置事件组的某个位、某些位
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,constEventBits_t uxBitsToSet);
参数 | 说明 |
---|---|
xEventGroup | 要操作的事件组句柄 |
uxBitsToSet | 要设置的事件位掩码。例如,设置为0x05会将bit0和bit2设置为1 |
等待事件,等待某一位
函数原型
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait );
参数 | 说明 |
---|---|
xEventGroup | 要等待的事件组句柄 |
uxBitsToWaitFor | 要等待的事件位掩码。若设置为pdTRUE ,则表示要等待的位全部为1;若设置为pdFALSE ,则表示只需有一个待等待的位为1即可 |
xWaitForAllBits | 等待条件,pdTRUE 事件都等待;pdFALSE 表示只需有一个事件发生即可 |
xClearOnExit | 在函数退出前是否要清除待事件。pdTRUE 表示清除;pdFALSE 表示不清除 |
xTicksToWait | 如果期待的事件未发生,阻塞的最长时间。可设置为0(立即返回)、portMAX_DELAY (无限等待直到成功)或期望的Tick Count(使用pdMS_TO_TICKS() 转换为Tick Count) |
返回值 | 返回的是事件值。如果等待的事件发生了,返回的是“非阻塞条件成立”时的事件值;如果是超时退出,返回的是超时时刻的事件值。 |
同步点:假设有ABC三个人合作,A做完哪个事件,声明需要等待哪些事件。可以用来协调多个任务。
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,const EventBits_tuxBitsToSet,const EventBits_tuxBitsToWaitFor,TickType_t xTicksToWait);
参数 | 说明 |
---|---|
xEventGroup | 要操作的事件组句柄 |
uxBitsToSet | 要设置的事件位掩码。比如,设置为0x05(二进制为0101)会导致事件组的bit0和bit2被设置为1 |
uxBitsToWaitFor | 等待的事件位掩码。比如,设置为0x15(二进制为10101)表示要等待bit0、bit2和bit4都为1 |
xTicksToWait | 如果期待的事件未发生,阻塞的最长时间。可设置为0(立即返回)、portMAX_DELAY (无限等待直到成功)或期望的Tick Count(使用pdMS_TO_TICKS() 转换为Tick Count) |
返回值 | 返回的是事件值。如果等待的事件发生了,返回的是“非阻塞条件成立”时的事件值;如果是超时退出,返回的是超时时刻的事件值。 |