以下是對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或位4pdTRUE, // 清除已設置的位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
可靈活實現任務間的事件通知與同步。