事件组理论

文章目录


一、事件组理论

区别于之前的队列、信号量、互斥量只能用于单个事件,事件组用于多个事件

事件组结构体:用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)
返回值 返回的是事件值。如果等待的事件发生了,返回的是“非阻塞条件成立”时的事件值;如果是超时退出,返回的是超时时刻的事件值。

相关推荐

  1. 事件理论

    2024-05-12 03:30:04       9 阅读
  2. 分布式事务理论基础

    2024-05-12 03:30:04       34 阅读
  3. Unity件开发--事件管理器

    2024-05-12 03:30:04       35 阅读
  4. 事务复习1-理论基础

    2024-05-12 03:30:04       34 阅读
  5. HarmonyOS开发(十二):ArkTS件通用事件

    2024-05-12 03:30:04       28 阅读
  6. ElementPlus switch件初始化触发change事件处理

    2024-05-12 03:30:04       21 阅读
  7. 封装长按触发事件的uniapp

    2024-05-12 03:30:04       10 阅读
  8. FreeRTOS学习笔记-基于stm32(10)事件标志

    2024-05-12 03:30:04       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-12 03:30:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-12 03:30:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-12 03:30:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-12 03:30:04       20 阅读

热门阅读

  1. Python正则表达式入门指南

    2024-05-12 03:30:04       10 阅读
  2. RN使用js让输入框取消和获取焦点(及键盘的监听)

    2024-05-12 03:30:04       11 阅读
  3. Oracle完整截取汉字的方法

    2024-05-12 03:30:04       13 阅读
  4. python格式化显示复杂对象例如字典

    2024-05-12 03:30:04       9 阅读
  5. 线段树(以区间和为例)

    2024-05-12 03:30:04       13 阅读
  6. python的deap库使用记录

    2024-05-12 03:30:04       10 阅读
  7. AI绘画已如此厉害,为何我们仍需学习绘画?

    2024-05-12 03:30:04       13 阅读