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

相关推荐
Jing_Rainbow1 小时前
【AI-9/Lesson30(2025-11-12)】AI + Vibe Coding:Hulk 浏览器扩展开发全解析 —— 从需求文档到实战的完整指南🌈
前端·人工智能·程序员
文心快码BaiduComate1 小时前
CCF程序员大会码力全开:AI加速营决赛圆满落幕,大奖花落谁家?
前端·后端·程序员
大模型教程6 小时前
保姆级教程:从0手写RAG智能问答系统,接入Qwen大模型|Python实战
程序员·llm·agent
AI大模型6 小时前
【连载】零基础跟我学做AI Agent(第2课:用CrewAI配置一个软件虚拟团队)
程序员·llm·agent
大模型教程6 小时前
AI Agent开发入门:5 个关键步骤,帮你打通落地链路
程序员·llm·agent
AI大模型6 小时前
【连载】零基础跟我学做AI Agent(第1课:环境安装)
程序员·llm·agent
申阳6 小时前
Day 23:登录设计的本质:从XSS/CSRF到Session回归的技术演进
前端·后端·程序员
前端小蜗7 小时前
💰该省省,该花花!我靠白嫖飞书,把“每日生存成本”打了下来
前端·程序员·产品
阿里嘎多学长8 小时前
2025-12-10 GitHub 热点项目精选
开发语言·程序员·github·代码托管
SimonKing8 小时前
我为什么放弃了XMind和亿图,投向了这款开源绘图工具的怀抱?
java·后端·程序员