第二部分 事件组
一、事件组的简介
1、事件
事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。其实事件组的本质就是一个整数(16/32位)。可以是一个事件发生唤醒一个任务,或者多个事件唤醒一个或多个任务。
2、与队列/信号量的区别:
①信号量/队列当事件发生时只去唤醒一个任务,而事件组可唤醒多个任务,起到一个广播的作用。 ②信号量/队列是一个消耗性资源,即数据读走了就减少,而事件组可以选择清除事件也可以选择保留事件。 ③事件组只能是起到一个同步的作用,并不能传递数据。 ④事件组可以实现多个任务之间的同步,队列/信号量则只能是两个任务之间的同步。
3、事件组
1)整数的位数: 如果宏configUSE_16_BIT_TICKs = 0,那么这个整数是32位的,其中⽤低24位来表示事件组,代表24 个事件,剩余8位用于管理事件。 如果宏configUSE_16_BIT_TICKs = 1,那么这个整数是16位的,其中⽤低8位来表示事件组,代表8个事 件。
2)每⼀位事件的含义由我们自己定义。
3)这些位,值为1表示事件发生了,值为0表示事件没发⽣。
4)⼀个或多个任务、ISR都可以写这些位。
5)⼀个或多个任务可以等待某⼀位、某几个位。
特点
①与信号量不同设置,事件组不会阻塞,多个任务设置同一时间等于设置一次。
②支持事件超时等待机制,等待该事物类型的任务会进行阻塞态
③逻辑与:任务所期望的事件全部发生,任务才能被唤醒
逻辑或:任务所期望的事件只要有任意一个事件发生,任务即可被唤醒。
全局变量的区别
1.全局变量使用在操作系统中存在被多个任务同时读写的风险,则事件组它会直接禁止任务调度来规避风险。 2.使用全局变量需要自己去实现阻塞机制(成本太高)。 3.使用事件组能更方便的实现多任务之间的同步。
二、API函数
接口函数 | 函数功能 |
---|---|
xEventGroupCreate() | 动态创建事件组 |
xEventGroupSetBits() | 事件组置位函数 |
xEventGroupWaitBits() | 等待事件函数 |
Even |