小智机器人中的部分关键函数,FreeRTOS中`xEventGroupWaitBits`函数的详细解析

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


函数功能

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


函数原型

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)。例如:
      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. 等待任意一位
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. 等待所有位
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可灵活实现任务间的事件通知与同步。