freeRTOS事件标志组(1-16)

发布于:2024-05-03 ⋅ 阅读:(24) ⋅ 点赞:(0)

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函数实验

-----------------------------后续编写代码验证--------------------------------------