目录
1.事件标志组与队列和信号量的区别
队列与信号量:事件只会发生一次 只会唤醒一个任务 是消耗性的资源
事件标志组:事情发生时,会唤醒所有符合条件的任务,理解为广播的作用,被唤醒的任务有俩选择,可以让时间保留不变,也可以清楚事件。
2.时间标志组AP函数介绍
实例;动态方式创建事件标志组API函数
EventGroupHandle_t xEventGroupCreate ( void ) ;
3.事件标志组实验
#include "FreeRTOS.h"
#include "task.h"
#include "event_groups.h"
#include "stdio.h"
// 定义事件标志的位
#define BIT_0 (1 << 0)
#define BIT_1 (1 << 1)
// 全局变量,事件标志组句柄
EventGroupHandle_t xEventGroup;
// 任务函数1:设置事件标志
void vTask1(void *pvParameters)
{
while(1)
{
// 设置BIT_0和BIT_1标志
xEventGroupSetBits(xEventGroup, BIT_0 | BIT_1);
printf("Task 1: Set BIT_0 and BIT_1\n");
// 延时1秒
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
// 任务函数2:等待事件标志
void vTask2(void *pvParameters)
{
EventBits_t uxBits;
while(1)
{
// 等待BIT_0和BIT_1标志的设定(全部设定)
uxBits = xEventGroupWaitBits(
xEventGroup, // 事件标志组句柄
BIT_0 | BIT_1, // 需要等待的事件标志位
pdTRUE, // 等待结束时是否清除标志位
pdTRUE, // 必须全部满足
portMAX_DELAY // 永久等待
);
if((uxBits & (BIT_0 | BIT_1)) == (BIT_0 | BIT_1))
{
printf("Task 2: Received both BIT_0 and BIT_1\n");
}
}
}
int main(void)
{
// 创建事件标志组
xEventGroup = xEventGroupCreate();
if(xEventGroup == NULL)
{
printf("Failed to create event group\n");
return -1;
}
// 创建任务1和任务2
xTaskCreate(vTask1, "Task 1", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
xTaskCreate(vTask2, "Task 2", configMINIMAL_STACK_SIZE, NULL, 1, NULL);
// 启动任务调度器
vTaskStartScheduler();
// 通常不会运行到这里
for(;;);
}