以下是对FreeRTOS中xEventGroupWaitBits
函数的详细解析:
函数功能
xEventGroupWaitBits
用于在事件组中等待指定的位被设置。它可以配置为等待任意一个位或所有位,并支持超时机制。
注意:该函数不能在中断中调用。
函数原型
EventBits_t xEventGroupWaitBits(
EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait
);
参数解析
-
xEventGroup
- 事件组的句柄,必须通过
xEventGroupCreate()
创建。
- 事件组的句柄,必须通过
-
uxBitsToWaitFor
- 指定需要等待的位掩码(bitmask)。例如:
BIT_0 | BIT_4 // 等待位0或位4
- 指定需要等待的位掩码(bitmask)。例如:
-
xClearOnExit
- 控制是否在函数返回前清除事件组中被设置的位:
pdTRUE
:清除uxBitsToWaitFor
中所有已设置的位(仅当等待条件满足时)。pdFALSE
:不修改事件组的位。
- 控制是否在函数返回前清除事件组中被设置的位:
-
xWaitForAllBits
- 决定等待条件:
pdTRUE
:等待uxBitsToWaitFor
中所有位被设置。pdFALSE
:等待uxBitsToWaitFor
中任意一位被设置。
- 决定等待条件:
-
xTicksToWait
- 最大阻塞时间(单位:ticks)。
- 使用
portMAX_DELAY
可无限期阻塞(需在FreeRTOSConfig.h
中定义INCLUDE_vTaskSuspend
为1)。
返回值
返回事件组在函数返回时的当前值。需通过位运算检查哪些位被设置:
- 如果因超时返回,返回值可能不包含所有期望的位。
- 如果因位设置返回,返回值是清除操作前的事件组值(当
xClearOnExit
为pdTRUE
时)。
典型用法
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)) {
// 所有位都被设置
}
注意事项
- 中断限制:不能在中断中调用此函数。
- 超时处理:需检查返回值是否包含期望的位,以判断是否超时。
- 位清除时机:
xClearOnExit
为pdTRUE
时,仅在等待条件满足时清除位。 - 性能优化:避免过长的阻塞时间,防止影响系统调度。
与其他函数配合
- 设置位:使用
xEventGroupSetBits()
。 - 清除位:使用
xEventGroupClearBits()
。 - 同步操作:结合
xEventGroupSync()
实现更复杂的同步逻辑。
通过合理配置参数,xEventGroupWaitBits
可灵活实现任务间的事件通知与同步。