def:事件标志组简介
事件标志位:用一个为来表示事件是否发生
事件标志组是事件标志位的集合可以简单的理解事件标志组,就是一个整数
事件标志组的特点:
-
1:它的每一个位表示一个事件(高8位不算)
-
2:每一个事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit表示是否接收到消息......(这些位的值为1:表示事件发生了,值为0:表示事件未发生)
-
3:任意任务或中断都可以读写这些位
-
4:可以等待某一位成立,或者诸多位同事成立
事件标志组简介
一个事件组就包含了一个EventBits_t 数据类型的变量,变量类型EventBits_t的定义如下所示。
事件标志组简介(了解)
虽然使用了32位无符号的数据类型变量来存储事件标志,但其中的高8位用作存储事件标志组的控制信息,低24位用作存储事件标志,所以说一个事件组最多可以存储24个事件标志!
事件标志组与队列,信号量的区别?
事件标志组API函数简介
创建标志组
使用动态的方式创建事件标志组
使用事件组之前,要先创建,得到一个句柄;使用事件组时,要使用句柄来表明使用哪个事件组。有两种创建方法:动态分配内存、静态分配内存。函数原型如下:
EventGroupHandle_t xEventGroupCreate ( void ) ;
返回值 | 描述 |
NULL | 事件标志组创建失败 |
其他值 | 事件标志组创建成功,返回句柄 |
创建示例:
清除事件标志位API函数
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear);
形参 | 描述 |
xEventGroup | 待操作的事件标志组句柄 |
uxBitsToSet | 待清零的事件标志位 |
返回值 | 描述 |
整数 | 清零事件标志位之前事件组中事件标志位的值 |
设置事件标志位API函数
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t
uxBitsToSet)
形参 | 描述 |
xEventGroup | 待操作的事件标志组句柄 |
uxBitsToSet | 待设置的事件标志位 |
返回值 | 描述 |
整数 | 事件组中的事件标志位值 |
可以设置事件组的某个位、某些位,使用的函数有2个:
-
在任务中使用 xEventGroupSetBits()
-
在ISR中使用 xEventGroupSetBitsFromISR()
有一个或多个任务在等待事件,如果这些事件符合这些任务的期望,那么任务还会被唤醒。函数原型如下:
注:
值得注意的是,ISR中的函数,比如队列函数 xQueueSendToBackFromISR、信号量函数xSemaphoreGiveFromISR,它们会唤醒某个任务,最多只会唤醒1个任务。
但是设置事件组时,有可能导致多个任务被唤醒,这会带来很大的不确定性。
所以xEventGroupSetBitsFromISR函数不是直接去设置事件组,而是给一个FreeRTOS后台任务(daemon task)发送队列数据,由这个任务来设置事件组。
如果后台任务的优先级比当前被中断的任务优先级高, xEventGroupSetBitsFromISR会设置 *pxHigherPriorityTaskWoken为pdTRUE。
如果daemon task成功地把队列数据发送给了后台任务,那么 xEventGroupSetBitsFromISR的返回值就是pdPASS。
等待事件标志位的API函数
形参 | 描述 |
xEventGroup | 等待事件标志组句柄 |
uxBitsToWaitFor | 等待事件标志位,可以用逻辑或等待多个事件标志位 |
xClearOnExit | 成功等待事件标志位后,清除事件组中对应的事件标志位, pdTRUE: 清除uxBitsToWaitFor指定位 pdFALSE: 不清除 |
xWaitForAllBits | 等待uxBitsToWaitFor中的所有事件标志位(逻辑与) pdTRUE:等待的位,全部为1 pdFALSE:等待的位,某个为1 |
xTicksToWait | 等待的阻塞时间 |
返回值 | 描述 |
等待事件标志位值 | 等待事件标志位成功,返回等待到的事件标志位 |
其他值 | 等待事件标志位失败,返回事件组中的事件标志位 |
特点:可以等待某一位也可以等待多位,等到期望事件后,还可以清除某些位
同步函数
例子:
Task 1 : 做饭
Task 2 : 做菜
Task1做好自己的事情之后, 需要等到菜也做好后,大家再一起吃饭
事件标志组API函数实验
-----------------------------后续编写代码验证--------------------------------------