FREERTOS队列集和事件标志组

news2024/11/27 22:28:43

队列集 

一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集!

作用:用于对多个队列或信号量(信号量本质上也是个队列)进行“监听”,其中不管哪一个消息到来,都可让任务退出阻塞状态。

假设:有个接收任务,使用到队列接收和信号量的获取,如下:

如果不使用队列集,而是使用常规的多个队列的方式

这样如果第一行被阻塞,那么第二行也就得不到执行。

但是如果使用的是队列集

只要其中有一个队列有效即可,我们可以根据队列的句柄来执行不同的动作。

队列集相关API函数

接下来分别说明。

创建队列集

队列添加到队列集中

注意,不能先往队列中发送消息后再添加到队列集。

从队列集中移除队列

获取队列集中有有效消息的队列

事件标志组

前面我们学习了使用信号量来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步。有时候某个任务可能会需要与多个事件或任务进行同步。

这里说明下,什么是跟多个任务进行同步?

用裸机中标志位的角度来看,就是:

if(flagA == 1 && flagB == 1 && flagC == 1 && flagD == 1){……}

想要实现这种需求,队列集没法用,因为队列集里的队列是“或”的关系;

貌似使用多个信号量也可以,其他任务都释放信号量,然后目标任务依次获取,只有都获取到才能执行后续的代码,不过比较麻烦。

FreeRTOS 为此提供了一个可选的解决方法,那就是事件标志组。

事件位(事件标志)

事件位用来表明某个事件是否发生,事件位通常用作事件标志,比如下面的几个例子:

● 当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)1,当队列中没有消息需要处理的时候就可以将这个位(标志)0

● 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)1,当没有数据需要从网络发送出去的话就将这个位(标志)0

● 现在需要向网络中发送一个心跳信息,将某个位(标志)1。现在不需要向网络中发送心跳信息,这个位(标志)0

事件组

一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问,同样,以上面列出的三个例子为例:

● 事件标志组的 bit0 表示队列中的消息是否处理掉。

● 事件标志组的 bit1 表示是否有消息需要从网络中发送出去。

● 事件标志组的 bit2 表示现在是否需要向网络发送心跳信息。

事件标志组和事件位的数据类型

事件标志组的数据类型为 EventGroupHandle_t,当 configUSE_16_BIT_TICKS 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 0 的时候事件标志组存储 24 个事件位。

事件标志组中的所有事件位都存储在一个无符号的 EventBits_t 类型的变量中,EventBits_t 在 event_groups.h 中有如下定义:

typedef TickType_t EventBits_t;

数据类型 TickType_t 在文件 portmacro.h 中有如下定义:

可以看出当 configUSE_16_BIT_TICKS 0 的时候 TickType_t 是个 32 位的数据类型,因此 EventBits_t 也是个 32 位的数据类型。EventBits_t 类型的变量可以存储 24 个事件位,另外的那高 8 位有其他用。事件位 0 存放在这个变量的 bit0 上,变量的 bit1 就是事件位 1,以此类推。

对于 STM32 来说一个事件标志组最多可以存储 24 个事件位,如下图所示:

其实就是一个uint32_t类型的数组,每个数组的位置存着一个标志位,只不过操作系统对其进行了管理。

创建事件标志组

FreeRTOS 提供了两个用于创建事件标志组的函数,如下表所示:

函数 xEventGroupCreate()

此函数用于创建一个事件标志组,所需要的内存通过动态内存管理方法分配。由于内部处理的原因,事件标志组可用的 bit 数取决于 configUSE_16_BIT_TICKS , 当configUSE_16_BIT_TICKS1 为 1 的 时 候 事 件 标 志 组 有 8 个 可 用 的 位 (bit0~bit7) , 当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组有 24 个可用的位(bit0~bit23)EventBits_t 类型的变量用来存储事件标志组中的各个事件位。

函数原型如下:

设置事件位

FreeRTOS 提供了 4 个函数用来设置事件标志组中事件位(标志),事件位(标志)的设置包括清零和置 1 两种操作,这 4 个函数如下表所示:

函数 xEventGroupClearBits()

将事件标志组中的指定事件位清零,此函数只能用在任务中,不能用在中断服务函数中!中断服务函数有其他的 API 函数。函数原型如下:

函数 xEventGroupClearBitsFromISR()

此函数为函数 xEventGroupClearBits()的中断级版本,也是将指定的事件位(标志)清零。此函数用在中断服务函数中,此函数原型如下:

函数 xEventGroupSetBits()

设置指定的事件位为 1,此函数只能用在任务中,不能用于中断服务函数,此函数原型如下:

函数 xEventGroupSetBitsFromISR()

此函数也用于将指定的事件位置 1,此函数是 xEventGroupSetBits()的中断版本,用在中断服务函数中,函数原型如下:

获取事件标志组值

我们可以通过 FreeRTOS 提供的 API 函数来查询事件标准组值,FreeRTOS 一共提供了两个这样的 API 函数,如下表所示:

函数 xEventGroupGetBits()

此函数用于获取当前事件标志组的值,也就是各个事件位的值。此函数用在任务中,不能用在中断服务函数中。此函数是个宏,真正执行的是函数 xEventGroupClearBits(),函数原型如下:

函数 xEventGroupGetBitsFromISR()

获取当前事件标志组的值,此函数是 xEventGroupGetBits()的中断版本,函数原型如下:

等待指定的事件位

某个任务可能需要与多个事件进行同步,那么这个任务就需要等待并判断多个事件位(标志),使用函数 xEventGroupWaitBits()可以完成这个功能。调用函数以后如果任务要等待的事件位还没有准备好(1 或清零)的话任务就会进入阻塞态,直到阻塞时间到达或者所等待的事件位准备好。函数原型如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1530420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python(Django)之登录功能实现

1、创建登陆函数 def login(request):if request.POST:username password username request.POST.get(username)password request.POST.get(password)user auth.authenticate(usernameusername, passwordpassword)if user is not None and user.is_active:auth.login(req…

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型

医药工厂5G智能制造数字孪生可视化平台,推进医药企业数字化转型。随着科技的不断发展,数字化转型已成为医药企业不可或缺的一部分。5G智能制造医药工厂数字孪生可视化平台作为数字化转型的重要工具,正在逐步改变医药企业的生产方式和管理模式…

MATLAB:函数与数值积分

一、数学函数图像的绘制 clc,clear fh (x)2*exp(-x).*sin(x); Xrange [0,8]; gx (x)3*exp(-x)*0.8.*sin(x); fplot(fh,Xrange,r-*,LineWidth,1.5) hold on grid on fplot(gx,Xrange,b-o,LineWidth,1.5) axis([-0.5,8.5,-0.1,0.85]) legend(fh (x)2*exp(-x).*sin(x),gx (x…

QB PHP 多语言配置

1: 下载QBfast .exe 的文件 2: 安装的时候 ,一定点击 仅为我 安装 而不是 所有人 3: 如果提示 更新就 更新 , 安装如2 4: 如果遇到 新增 或者编辑已经 配置的项目时 不起作用 : 右…

【Linux】编译器-gcc/g++的使用(预处理、编译、汇编、连接)

目录 01.预处理(宏替换) 02.编译(生成汇编) 03.汇编(生成机器可识别码) 04.连接(生成可执行文件或库文件) 05.选项 编译器在编译代码时包含以下四个步骤:1.预处理 2…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记15_虚拟助手

1. 虚拟助手 1.1. 站在全球视角,这些公司是:亚马逊、脸书、谷歌和苹果 1.1.1. 苹果的Siri 1.1.2. 亚马逊的Alexa 1.1.3. 脸书Messenger应用上的M 1.1.4. 谷歌语音助手Assistant 1.2. 借由人工智能技术,虚拟助手将对用户的个人电子档案、…

机器学习 - 选择模型

接着这一篇博客做进一步说明: 机器学习 - 准备数据 PyTorch moduleExplaintorch.nnContains all of the building blocks for computational graphs (essentially a series of computations executed in a particular way). nn 模块为用户提供了丰富的神经网络组件…

【软件】项目管理工具focalboard使用docker部署

github官方网址 使用宝塔进入docker从官方进行镜像仓库拉去mattermost/focalboard 容器》添加容器》容器名》镜像》暴露端口》加号》添加 注意的是原始容器端口号为8000和9092

Vue使用qrcodejs2实现生成二维码

Vue使用qrcodejs2实现生成二维码示例 业务需求 比如说我们需要对下方的列表数据访问地址列进行生成二维码,扫描后跳转对应的地址。 安装qrcodejs2依赖 npm i qrcodejs2引用 在我们需要使用的页面进行引用qrcodejs2 import QRCode from qrcodejs2定义我们的二维…

业务服务:redisson

文章目录 前言一、配置1. 添加依赖2. 配置文件/类3. 注入redission3. 封装工具类 二、应用1. RedisUtils工具类的基本使用 三、队列1. 工具类2. 普通队列2. 有界队列(限制数据量) 前言 redission是一个开源的java redis的客户端,在其基础上进…

备战蓝桥杯---牛客寒假训练营2VP

题挺好的,收获了许多 1.暴力枚举(许多巧妙地处理细节方法) n是1--9,于是我们可以直接暴力,对于1注意特判开头0但N!1,对于情报4,我们可以把a,b,c,d的所有取值枚举一遍,那么如何判断有…

机器学习——编程实现从零构造训练集的决策树

自己搭建一棵决策树【长文预警】 忙了一个周末就写到了“构建决策树”这一步,还没有考虑划分测试集、验证集、“缺失值、连续值”,预剪枝、后剪枝的部分,后面再补吧(挖坑) 第二节内容:验证集划分\k折交叉…

Docker-安装

Docker ⛅Docker-安装🌠各平台支持情况🌠Server 版本安装☃️Ubuntu☃️Centos 🌠Docker 镜像源修改🌠Docker 目录修改 ⛅Docker-安装 🌠各平台支持情况 🌠Server 版本安装 ☃️Ubuntu 🍂安装…

地脚螺栓的介绍

地脚螺栓简单来说,它是一种机械构件。通常用于铁路、公路、电力、桥梁、锅炉钢结构、塔吊、大型建筑等。一头预埋在地底下,另一头穿过设备用螺母拧紧,用来固定设备,钢结构设施,铁塔设施等,所以地脚螺栓拥有…

上海亚商投顾:沪指震荡调整 北向资金全天净卖出超70亿

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整,创业板指尾盘跌超1%。猪肉股集体反弹,播恩集团、湘佳股份、傲农生物…

vue项目:使用xlsx导出Excel数据

文章目录 一、安装xlsx二、报错及解决三、编写公共方法四、方法使用 一、安装xlsx 执行命令:npm i xlsx file-saver --save 二、报错及解决 使用时:import XLSX from "xlsx"; 发现如下报错信息 报错原因:xlsx版本不兼容。 解…

幼犬狗粮和成年犬狗粮该怎么挑选?

亲爱的狗友们,我们都知道,给狗狗选择适合的狗粮是非常重要的。那么,面对市面上琳琅满目的幼犬狗粮和成年犬狗粮,我们该如何挑选呢?别担心,接下来就让我来给大家支支招。 🐶 幼犬狗粮挑选篇 &…

Linux 网络接口管理

为了更深入的了解linux系统,为此做出网络接口管理的知识总结。看起来麻烦,其实一点都不难,相信多看多了解总会是没错的!❤️❤️ 一起加油吧!✨✨🎉🎉 文章目录 前言一、网络配置的文件介绍二、…

路由器怎么做端口映射

路由器在网络中起到了连接不同设备和提供网络服务的重要作用。端口映射是一项常见的操作,它允许外部网络中的设备通过路由器访问内部网络中的设备。我们将介绍如何在路由器上进行端口映射的设置。 理解端口映射 在开始操作之前,我们需要了解一些基本概念…

JJJ:改善ubuntu网速慢的方法

Ubuntu 系统默认的软件下载源由于服务器的原因, 在国内的下载速度往往比较慢,这时我 们可以将 Ubuntu 系统的软件下载源更改为国内软件源,譬如阿里源、中科大源、清华源等等, 下载速度相比 Ubuntu 官方软件源会快很多!…