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 ( ) ;
}