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可灵活实现任务间的事件通知与同步。

相关推荐
灵感__idea1 小时前
JavaScript高级程序设计(第5版):无处不在的集合
前端·javascript·程序员
dmy3 小时前
n8n内网快速部署
运维·人工智能·程序员
憨憨睡不醒啊5 小时前
如何让LLM智能体开发助力求职之路——构建属于你的智能体开发知识体系📚📚📚
面试·程序员·llm
程序员岳焱6 小时前
Java 程序员成长记(二):菜鸟入职之 MyBatis XML「陷阱」
java·后端·程序员
liangdabiao8 小时前
让AI写出真正可用的图文并茂的帖子(微信公众号,小红书,博客)
程序员
安妮的心动录8 小时前
人是习惯的结果
面试·程序员·求职
小兵张健9 小时前
笔记本清灰记录
程序员
陈随易12 小时前
Univer v0.8.0 发布,开源免费版 Google Sheets
前端·后端·程序员
陈随易1 天前
Element Plus 2.10.0 重磅发布!新增Splitter组件
前端·后端·程序员
陈随易1 天前
2025年100个产品计划之第11个(哆啦工具箱) - 像哆啦A梦口袋一样丰富的工具箱
前端·后端·程序员