一、事件标志组简介
- 事件标志位:用一个位来表示事件是否发生,裸机中的中断标志位等等
- 事件标志组:是一组事件标志位的集合,简单认为就是一个整数
- 事件标志组特点:它每一个位表示一个事件(高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();
}