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

相关推荐
mapbar_front5 小时前
进入职场第二课—融入
程序员
mapbar_front1 天前
进入新岗位的第一课——潜龙勿用
程序员
青旬2 天前
AI编程祛魅-最近几个失败的ai编程经历
后端·程序员
大模型教程2 天前
RAG核心基础 Embedding 概念与技术详解
程序员·llm·agent
大模型教程2 天前
一文搞懂大模型:何为深入理解Agent?
程序员·llm·agent
AI大模型2 天前
一文搞懂RAG:阿里70K算法岗为什么都在用它?
程序员·llm·agent
AI大模型2 天前
面试官狂问的 28 个 RAG 问题全解析:一次讲透,从基础到架构优化
程序员·llm·agent
Qinana2 天前
🌊 深入理解 CSS:从选择器到层叠的艺术
前端·css·程序员
欧雷殿2 天前
在富阳银湖做在地社区的三个月
程序员·产品·创业
Homeey3 天前
云服务器托管Hexo博客全攻略:从选型到部署的实践指南
后端·程序员