事件组(Event Group)
使用流程
- 创建事件组句柄
- 定义事件组标志位
- Task1:事件组标志位置 1
- Task2:创建等待事件组事件;检测事件组标志位是否置 1
注意事项
待补充,纯属一个 Flag。
代码示例
#include <FreeRTOS.h>
#include <task.h>
#include <event_groups.h>
// 创建事件组句柄
EventGroupHandle_t eventGroup;
// 定义事件标志位
#define EVENT_BIT_0 (1 << 0)
#define EVENT_BIT_1 (1 << 1)
// 任务1:发送事件(设置事件标志位)
void vTaskSetEvent(void *pvParameters) {
(void)pvParameters;
while (1) {
// 模拟事件的发生,设置事件标志位
xEventGroupSetBits(eventGroup, EVENT_BIT_0);
vTaskDelay(pdMS_TO_TICKS(1000)); // 任务延时 1 秒
xEventGroupSetBits(eventGroup, EVENT_BIT_1);
vTaskDelay(pdMS_TO_TICKS(1000)); // 任务延时 1 秒
}
}
// 任务2:等待事件的发生
void vTaskWaitForEvent(void *pvParameters) {
(void)pvParameters;
EventBits_t uxBits;
const EventBits_t uxBitsToWaitFor = EVENT_BIT_0 | EVENT_BIT_1;
while (1) {
// 等待指定事件标志位的发生
uxBits = xEventGroupWaitBits(
eventGroup,
uxBitsToWaitFor,
pdTRUE, // 清除等待的事件标志位
pdFALSE, // 只等待所有位都被设置
portMAX_DELAY // 无超时
);
// 检查所需事件是否已经发生
if ((uxBits & uxBitsToWaitFor) == uxBitsToWaitFor) {
// 所有所需事件已经发生
// 执行相应操作,例如打印消息
printf("Both events occurred!\n");
} else {
// 未等到所有所需事件的发生
// 可以执行相应操作
printf("Waiting for events...\n");
}
}
}
void main() {
// 创建事件组
eventGroup = xEventGroupCreate();
// 创建任务1和任务2
xTaskCreate(vTaskSetEvent, "TaskSetEvent", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
xTaskCreate(vTaskWaitForEvent, "TaskWaitForEvent", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
}
License:
CC BY 4.0