一、基础概念
作用:与信号量对比,信号量任务只能是单个的事件或任务进行同步。有时候某个任务可能会需要与多个事件或任务进行同步(初学者可能理解不了同步的含义,同步就是在操作系统的机制下面运用某个机制让本来属于不同任务的轮询片按顺序执行),此时信号量就无能为力了。FreeRTOS 为此提供了一个可选的解决方法,那就是事件标志组。
二、运行机制
事件也是一种通信机制,其可以直白理解为标志位,但是这个标志位是对应与多个标志的,不只是一个触发,其可以由一个或者多个标志触发成为事件组,在stm32中可以最多支持24个事件。
1、与信号量的区别
事件可使用于多种场合,它能够在一定程度上替代信号量,用于任务与任务间,中断与任务间的同步。一个任务或中断服务例程发送一个事件给事件对象,而后等待的任务被唤醒并对相应的事件进行处理。但是它与信号量不同的是,事件的发送操作是不可累计的,而信号量的释放动作是可累计的。
事件另外一个特性是,接收任务可等待多种事件,即多
个事件对应一个任务或多个任务。同时按照任务等待的参数,可选择是“逻辑或”触发还是“逻辑与”触发。这个特性也是信号量等所不具备的,信号量只能识别单一同步动作,而不能同时等待多个事件的同步。
2、运行机制大白话
最多设置24个事件标志,这些标志可以通过设置,设置为满足一个事件发生的时候是置1还是置0.其中这些标志位的触发可以由多个事件或者一个事件触发,接收的任务也可以由多个或者一个标志位决定,这些运算通过逻辑与、或编写。
接收事件时,可以根据感兴趣的事件类型接收事件的单个或者多个事件类型。事件接收成功后,必须使用 xClearOnExit 选项来清除已接收到的事件类型,否则不会清除已接收到的 事件 ,这样就需要用户显 式清除事件位。
用户可以自定义通过传入参数xWaitForAllBits 选择读取模式,是等待所有感兴趣的事件还是等待感兴趣的任意一个事件。设置事件时,对指定事件写入指定的事件类型,设置事件集合的对应事件位为 1,可以一次同时写多个事件类型,设置事件成功可能会触发任务调度。清除事件时,根据入参数事件句柄和待清除的事件类型,对事件对应位进行清 0 操作。
事件不与任务相关联,事件相互独立,一个 32位的变量(事件集合,实际用于表示事件的只有 24 位),用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0 表示该事件类型未发生、1表示该事件类型已经发生),一共 24种事件类型。任务1对事件3 或事件 5 感兴趣(逻辑或),当发生其中的某一个事件都会被唤醒,并且执行相应操作。而任务 2 对事件 3 与事件 5 感兴趣(逻辑与),当且仅当事件 3 与事件 5 都发生的时候,任务 2 才会被唤醒,如果只有一个其中一个事件发生,那么任务还是会继续等待事件发生。如果接在收事件函数中设置了清除事件位 xClearOnExit,那么当任 务唤醒后将把事件 3 和事件 5 的事件标志清零,否则事件标志将依然存在。
三、API函数
使用事件组机制的典型流程如下:
- 事件创建函数 xEventGroupCreate()
创建一个句柄,然后创建事件组
EventGroupHandler=xEventGroupCreate(); //创建事件标志组
- 事件组置位函数 xEventGroupSetBits()
- 等待指定的事件位、获取事件标志组值xEventGroupWaitBits()
API官网
https://freertos.org/a00116.html
四、实验代码分析
正点的
1、创建事件组通信机制,也就是句柄和创建事件
2、设置了触发的事件,两个是任务中按键触发一个是中断按键触发
3、事件组响应,这里设置了全部置一的逻辑与触发阻塞任务就绪。
4、这个任务是查询事件组实际开发可以不用
总结:
就是一种通信机制,代码里面编写在需要满足条件的情况发送事件,当这些事件满足了执行想执行的任务。