FreeRTOS-事件标志组
- 一、事件标志组简介
- 二、事件标志组API函数
- 三、事件标志组实验
一、事件标志组简介
- 事件标志位:用一个位来表示事件是否发生,裸机中的中断标志位等等
- 事件标志组:是一组事件标志位的集合,简单认为就是一个整数
- 事件标志组特点:它每一个位表示一个事件(高8位不算)。每一位事件的含义由用户自己决定(1表示发生,0表示未发生)。任意任务或中断都可以读写这些位。可以等待某一位成立或者等待多位同时成立
- 事件标志组的32位标志位,其中的高8位用来存储事件标志组的控制信息,低24位用作存储事件标志,一个事件组最多可以存储24个事件标志,位23表示事件标志23等以此类推
二、事件标志组API函数
xEventGroupCreate();
xEventGroupCreateStatic();
xEventGroupClearBits();
xEventGroupClearBitsFromISR();
xEventGroupSetBits();
xEventGroupSetBitsFromISR();
xEventGroupWaitBits();
xEventGroupSync();
EventGroupHandle_t xEventGroupCreate(void)
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear)
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet)
EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForALLBits,TickType_t xTicksToWait)
- 设置其中某一个标志位后,并等待其他标志位也置1—同步
EventBits_t xEventGroupSync(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait)
三、事件标志组实验
- 实验设计:设计三个任务,start_task:创建task1和task2,并创建事件标志组。task1:按键扫描,不同按键值将事件标志组相应事件置1。task2:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define START_TASK_STACK_SIZE 128
#define START_TASK_PRIO 1
TaskHandle_t start_task_handle;
#define TASK1_STACK_SIZE 128
#define TASK1_PRIO 2
TaskHandle_t task1_handle;
#define TASK2_STACK_SIZE 128
#define TASK2_PRIO 3
TaskHandle_t task2_handle;
void task1( void * pvParameters )
{uint8_t KeyNum = 0;while(1){KeyNum = Key_GetNum();if(KeyNum == 1){xEventGroupSetBits(eventgroup_handle,0x01);}else if(KeyNum == 2){xEventGroupSetBits(eventgroup_handle,0x02);}vTaskDelay(10);}
}
void task2( void * pvParameters )
{while(1){xEventGroupWaitBits(eventgroup_handle,0x01|0x02,pdTRUE,pdTRUE,portMAX_DELAY);}
}
EventGroupHandle_t eventgroup_handle;
void Start_task( void * pvParameters )
{taskENTER_CRITICAL();eventgroup_handle = xEventGroupCreate();xTaskCreate(task1,"task1",TASK1_STACK_SIZE,NULL,TASK1_PRIO,&task1_handle);xTaskCreate(task2,"task2",TASK2_STACK_SIZE,NULL,TASK2_PRIO,&task2_handle);vTaskDelete(start_task_handle);taskEXIT_CRITICAL();
}void freertos_demo()
{xTaskCreate(Start_task,"Start_task",START_TASK_STACK_SIZE,NULL,START_TASK_PRIO,&start_task_handle);vTaskStartScheduler();
}