FreeRTOS(事件组)

本文围绕FreeRTOS实时操作系统中的事件机制展开。介绍了事件概念、特点及应用场景,阐述了任务间和中断方式事件标志组的运作机制,详细讲解了事件相关的API函数,最后给出了任务与任务、中断与任务间事件应用的具体配置和代码示例。

 资料来源于硬件家园:资料汇总 - FreeRTOS实时操作系统课程(多任务管理)

目录

一、事件的概念与应用 

1、事件的概念

2、事件的应用

二、事件的运作机制

1、FreeRTOS中事件组的句柄

2、FreeRTOS 任务间事件标志组的实现

3、FreeRTOS 中断方式事件标志组的实现

三、事件的API函数‍

 1、事件的典型流程与API

2、事件组创建与删除

3、任务内置位事件组

4、中断内置位事件组

5、等待事件组

四、事件的应用 - 任务与任务

1、任务配置

2、创建事件组

3、按键任务部分代码

4、同步任务代码

五、事件的应用 - 中断与任务

1、任务配置

2、开启FreeRTOS软件定时器

3、创建事件组

4、同步任务代码

5、串口回调函数代码

一、事件的概念与应用 

1、事件的概念

事件是实现任务与任务或任务与中断间通信的机制,用于同步,无数据传输。

与信号量不同的是,事件可以实现一对多、多对多的同步,即一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。

FreeRTOS提供的事件具有如下特点:

① 事件相互独立,一个32位的事件集合(EventBitst类型的变量,实际可用于表示事件的只有低24位)用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0表示该事件类型未发生,1表示该事件类型已经发生),一共有 24种事件类型。

②事件仅用于同步,不提供数据传输功能。

③ 事件无排队性,即多次向任务设置同一事件(如果任务还未来得及读取),等效于只设置一次。

④允许多个任务对同一事件进行读写操作。

⑤ 支持事件等待超时机制。

在FreeRTOS 事件中,获取每个事件时,用户可以选择感兴趣的事件,并且选择读取事件信息标记。它有3个属性,分别是逻辑与、逻辑或以及是否清除标记。当任务等待事件同步时,可以通过任务感兴趣的事件位和事件信息标记来判断当前接收的事件是否满足要求,如果满足,则说明任务等到对应的事件,系统将唤醒等待的任务;否则,任务会根据用户指定的阻塞超时时间继续等待下去。

2、事件的应用

FrecRTOS的事件用于任务与任务或任务与中断间的同步。为什么不直接用变量呢?那样岂不是更有效率?若是在裸机编程中,用全局变量是最有效的方法,但是在操作系统中,使用全局变量就要考虑以下问题了:

①如何对全局变量进行保护?如何处理多任务同时对它进行访问的情况?

②如何让内核对事件进行有效管理?

如果使用全局变量,就需要在任务中轮询查看事件是否发送,这会造成CPU 资源的浪费,此外,用户还需要自己去实现等待超时机制。所以,在操作系统中最好还是使用系统提供的通信机制,简单、方便、实用。

在某些场合,可能需要多个事件发生后才能进行下一步操作,比如一些危险机器的启动,需要检查各项指标,当指标不达标时就无法启动。但是检查各个指标时,不会立刻检测完毕,所以需要事件来做统一的等待。当所有的事件都完成了,那么机器才允许启动,这只是事件的应用之一

事件可用于多种场合,能够在一定程度上替代信号量,用于任务与任务间、中断与任务间的同步。一个任务或中断服务例程发送一个事件给事件对象,而后等待的任务被唤醒并对相应的事件进行处理。但是事件与信号量不同的是,事件的发送操作是不可累计的,而信号量的释放动作是可累计的。事件的另外一个特性是,接收任务可等待多种事件,即多个事件对应一个任务或多个任务。同时按照任务等待的参数,可选择是“逻辑或”触发还是“逻辑与”触发。这个特性也是信号量等所不具备的,信号量只能识别单一同步动作,而不能同时等待多个事件的同步。

各个事件可分别发送或一起发送给事件对象,而任务可以等待多个事件,任务仅对感兴趣的事件进行关注。当有它们感兴趣的事件发生并且符合条件时,任务将被唤醒并进行后续的处理动作。

二、事件的运作机制

1、FreeRTOS中事件组的句柄

图片

uxEventBits: 对于STM32,此变量为32位,其中低24位用于事件位,高8位用于其他用途。

图片

2、FreeRTOS 任务间事件标志组的实现

任务间事件标志组的实现是指各个任务之间使用事件标志组实现任务的同步机制。

下面的框图说明FreeRTOS 事件标志的实现:

图片

运行条件: 创建 2 个任务:Task1 和 Task2

运行过程描述如下:

 任务 Task1 运行过程中调用函数 xEventGroupWaitBits,等待事件标志位被设置,任务 Task1 由运行态进入到阻塞态。

 任务 Task2 设置 Task1 等待的事件标志,任务 Task1 由阻塞态进入到就绪态,在调度器的作用下由就绪态又进入到运行态。

上面就是一个简单的 FreeRTOS 任务间事件标志通信过程。

3、FreeRTOS 中断方式事件标志组的实现

FreeRTOS 中断方式事件标志组的实现是指中断函数和 FreeRTOS 任务之间使用事件标志。

下面的框图说明FreeRTOS 事件标志的实现:

图片

运行条件: 创建一个任务和一个串口接收中断

运行过程描述如下:

 任务 Task1 运行过程中调用函数 xEventGroupWaitBits,等待事件标志位被设置,任务 Task1 由运行态进入到阻塞态。

 Task1 阻塞的情况下,串口接收到数据进入到了串口中断服务程序,在串口中断服务程序中设置 Task1等待的事件标志,任务 Task1 由阻塞态进入到就绪态,在调度器的作用下由就绪态又进入到运行态。

上面就是一个简单的 FreeRTOS 中断方式事件标志通信过程。

实际应用中,中断方式的消息机制要注意以下三个问题:

 中断函数的执行时间越短越好,防止其它低于这个中断优先级的异常不能得到及时响应。

 实际应用中,建议不要在中断中实现消息处理,用户可以在中断服务程序里面发送消息通知任务,在任务中实现消息处理,这样可以有效地保证中断服务程序的实时响应。同时此任务也需要设置为高优先级,以便退出中断函数后任务可以得到及时执行。

 中断服务程序中一定要调用专用于中断的事件标志设置函数,即以 FromISR 结尾的函数。

三、事件的API函数‍

 1、事件的典型流程与API

> 创建事件组  xEventGroupCreate()

> 置位事件组  xEventGroupSetBits() , xEventGroupSetBitsFromISR()

> 等待事件组  xEventGroupWaitBits()

> 删除事件组  vEventGroupDelete()

2、事件组创建与删除

>事件组控制块(句柄)

图片

uxEventBits: 对于STM32,此变量为32位,其中低24位用于事件位

xTask

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhang丶&|!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值