6 FreeRTOS事件标志组
-
6.1 事件标志组的简介
信号量可以用来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步。而有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量将无法完成此类事情。但是FreeRTOS为我们提供了事件标志组。
事件位
事件位用来表明某个事件是否发生,事件位通常用作事件标志,具体是当某个事件发生时,其对应的标志位将会被置1,未发生该事件则置0。
事件组
一个事件组就是一组事件位,事件组中的事件位通过编号来访问,具体是一个事件组中有很多个事件位,每一个事件位表示某事件是否发生。
事件标志组和事件标志位的数据类型
事件标志组的数据类型为EventGroupHandle_t,当configUSE_16_BIT_TICKS为1时,事件标志组就可以存储8个事件位,当config_USE_16_BIT_TICKS为0时,事件标志组存储24个事件位。
事件标志组中的所有事件位都是存储在一个无符号的EventBits_t类型的变量中,EventBits_t在event_groups.h中作如下定义:Typedef TickType_t EventBits_t; #if (configUSE_16_BIT_TICKS == 1) Typedef uint16_t TickType_t; #define portMAX_DELAY ( TickType_t )0xffff #else Typedef uint32_t TickType_t; #define portMAX_DELAY ( TickType_t )0xffff_ffffUL #define portTICK_TYPE_IS_ATOMIC 1 #endif
-
6.2 创建事件标志组
函数 xEventGroupCreate( )
EventGroupHandle_t xEventGroupCreate( void );
函数 xEventGroupCreateStatic( )
EnevtGroupHandle_t xEventGroupCreateStatic( StaticEnevtGroup_t *pxEnevtGroupBuffer );
返回值:
NULL:事件标志组创建失败;
其他值:创建成功的时间标志组句柄。
-
6.3 设置事件位
函数 xEventGroupClearBits() EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ); 函数 xEventGroupClearBitsFromISR() BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); 参数: xEventGroup :要操作的事件标志组的句柄。 uxBitsToClear:要清零的事件位,比如要清除 bit3 的话就设置为 0X08。可以同时清 除多个bit,如设置为 0X09 的话就是同时清除 bit3 和 bit0。 返回值: pdPASS : 事件位清零成功。 pdFALSE: 事件位清零失败。 函数 xEventGroupSetBits( ) EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ); 函数 xEventGroupSetBitsFromISR( ) BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t * pxHigherPriorityTaskWoken );
-
6.4 获取事件标志组值
函数 xEventGroupGetBits() EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup ); 函数 xEventGroupGetBitsFromISR() EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ); 返回值: 任何值:当前事件标志组的值。
-
6.5 等待指定的事件位
某个任务可能需要与多个事件进行同步,那么这个任务就需要等待并判断多个事件位(标志),使用函数 xEventGroupWaitBits()可以完成这个功能。调用函数以后如果任务要等待的事件位还没有准备好(置 1 或清零)的话任务就会进入阻塞态,直到阻塞时间到达或者所等待的事件位准备好。函数原型如下:EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, const TickType_t xTicksToWait ); 参数: xEventGroup : 指定要等待的事件标志组。 uxBitsToWaitFord:指定要等待的事件位,比如要等待bit0和(或)bit2的时候此参数就是 0X05,如果要等待 bit0 和(或)bit1 和(或)bit2 的时候此参数就是 0X07,以此类推。 xClearOnExit: 此参数要是为pdTRUE的话,那么在退出此函数之前由参数uxBitsToWait For所设置的这些事件位就会清零。如果设置位 pdFALSE 的话这些事件 位就不会改变。 xWaitForAllBits: 此参数如果设置为 pdTRUE 的话,当 uxBitsToWaitFor 所设置的这些 事件位都置 1,或者指定的阻塞时间到的时候函数 xEventGroupWaitBits() 才会返回。当此函数为 pdFALSE 的话,只要 uxBitsToWaitFor 所设置的 这些事件位其中的任意一个置1,或者指定的阻塞时间到的话函数 xEventGroupWaitBits()就会返回。 xTicksToWait : 设置阻塞时间,单位为节拍数。 返回值: 任何值: 返回当所等待的事件位置 1 以后的事件标志组的值,或者阻塞时间到。根据 这个值我们就知道哪些事件位置 1 了。如果函数因为阻塞时间到而返回的话 那么这个返回值就不代表任何的含义。