FreeRTOS中xEventGroupWaitBits函数的详细解析

以下是对FreeRTOS中xEventGroupWaitBits函数的详细解析:


函数功能

xEventGroupWaitBits用于在事件组 中等待指定的位被设置。它可以配置为等待任意一个位所有位 ,并支持超时机制。
注意 :该函数不能在中断中调用


函数原型

c 复制代码
EventBits_t xEventGroupWaitBits(
    EventGroupHandle_t xEventGroup,
    const EventBits_t uxBitsToWaitFor,
    const BaseType_t xClearOnExit,
    const BaseType_t xWaitForAllBits,
    TickType_t xTicksToWait
);

参数解析

  1. xEventGroup

    • 事件组的句柄,必须通过xEventGroupCreate()创建。
  2. uxBitsToWaitFor

    • 指定需要等待的位掩码(bitmask)。例如:

      c 复制代码
      BIT_0 | BIT_4  // 等待位0或位4
  3. xClearOnExit

    • 控制是否在函数返回前清除事件组中被设置的位:
      • pdTRUE:清除uxBitsToWaitFor中所有已设置的位(仅当等待条件满足时)。
      • pdFALSE:不修改事件组的位。
  4. xWaitForAllBits

    • 决定等待条件:
      • pdTRUE:等待uxBitsToWaitFor所有位被设置。
      • pdFALSE:等待uxBitsToWaitFor任意一位被设置。
  5. xTicksToWait

    • 最大阻塞时间(单位:ticks)。
    • 使用portMAX_DELAY可无限期阻塞(需在FreeRTOSConfig.h中定义INCLUDE_vTaskSuspend为1)。

返回值

返回事件组在函数返回时的当前值。需通过位运算检查哪些位被设置:

  • 如果因超时返回,返回值可能不包含所有期望的位。
  • 如果因位设置返回,返回值是清除操作前的事件组值(当xClearOnExitpdTRUE时)。

典型用法

1. 等待任意一位

c 复制代码
EventBits_t bits = xEventGroupWaitBits(
    xEventGroup,      // 事件组句柄
    BIT_0 | BIT_4,    // 等待位0或位4
    pdTRUE,           // 清除已设置的位
    pdFALSE,          // 等待任意一位
    100 / portTICK_PERIOD_MS  // 最多等待100ms
);

if ((bits & BIT_0) != 0) {
    // 位0被设置
} else if ((bits & BIT_4) != 0) {
    // 位4被设置
} else {
    // 超时
}

2. 等待所有位

c 复制代码
EventBits_t bits = xEventGroupWaitBits(
    xEventGroup,
    BIT_0 | BIT_4,
    pdFALSE,          // 不清除位
    pdTRUE,           // 等待所有位
    portMAX_DELAY     // 无限期等待
);

if ((bits & (BIT_0 | BIT_4)) == (BIT_0 | BIT_4)) {
    // 所有位都被设置
}

注意事项

  1. 中断限制:不能在中断中调用此函数。
  2. 超时处理:需检查返回值是否包含期望的位,以判断是否超时。
  3. 位清除时机xClearOnExitpdTRUE时,仅在等待条件满足时清除位。
  4. 性能优化:避免过长的阻塞时间,防止影响系统调度。

与其他函数配合

  • 设置位 :使用xEventGroupSetBits()
  • 清除位 :使用xEventGroupClearBits()
  • 同步操作 :结合xEventGroupSync()实现更复杂的同步逻辑。

通过合理配置参数,xEventGroupWaitBits可灵活实现任务间的事件通知与同步。

相关推荐
小兵张健4 小时前
30天减20斤挑战:少一斤发100红包(14)
程序员
树獭非懒11 小时前
Claude Code 完全入门指南:让你的 AI 从"会说"到"会做"
人工智能·程序员·llm
zzh_nice12 小时前
Markdown 技术文章发公众号,代码块和表格为什么总是乱?
程序员
onlyOne在掘金5980613 小时前
AI 编程助手打造(五):扒开底裤看真相!逆天神技 READ_FILE 协议解析
人工智能·程序员
SamDeepThinking14 小时前
所有的框架源码,最怕的就是被debug
java·后端·程序员
xw51 天前
aardio从惊喜到失望到被拉黑二三事
程序员
小兵张健1 天前
30天减20斤挑战:少一斤发100红包(13)
程序员
SamDeepThinking2 天前
IntelliJ IDEA 中有什么让你相见恨晚的技巧?
java·后端·程序员
蓝瑟2 天前
当"指挥 AI"成为核心技能,工程师的护城河在哪里?
人工智能·程序员·ai编程
阿里嘎多学长2 天前
2026-05-08 GitHub 热点项目精选
开发语言·程序员·github·代码托管