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

相关推荐
难受啊马飞2.01 小时前
如何判断 AI 将优先自动化哪些任务?
运维·人工智能·ai·语言模型·程序员·大模型·大模型学习
顺丰同城前端技术团队4 小时前
DeepSeek 国产大模型新标杆
前端·后端·程序员
AI大模型5 小时前
COZE实战部署(二)—— 创建Coze应用
程序员·llm·coze
redreamSo6 小时前
AI Daily | AI日报:ChatGPT识破10年顽疾,医疗AI震撼登场; 微信支付MCP开放,机遇与风险并存; 蒙娜丽莎图让大模型几乎全军覆没
程序员·aigc·资讯
程序员鱼皮7 小时前
Cursor 1.2重磅更新,这个痛点终于被解决了!
ai·程序员·编程·agent·软件开发
狂师8 小时前
啥是AI Agent!2025年值得推荐入坑AI Agent的五大工具框架!(新手科普篇)
人工智能·后端·程序员
坤坤爱学习2.010 小时前
求医十年,病因不明,ChatGPT:你看起来有基因突变
人工智能·ai·chatgpt·程序员·大模型·ai编程·大模型学
摆烂工程师10 小时前
Claude Code 为什么突然火了?聊一下Claude Code 跟 Cursor 之间的区别
程序员·claude·cursor
redreamSo1 天前
AI Daily | AI日报:马斯克Grok 4跑分泄露,有望改写LLM格局; 猫猫话术让大模型数学答错率翻3倍; 安克创新All in AI,代码采纳率破50%
程序员·aigc·资讯