【学习FreeRTOS】第16章——FreeRTOS事件标志组

news2025/1/4 19:18:35

1.事件标志组简介

事件标志位:用一个位,来表示事件是否发生
事件标志组是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。

事件标志组的特点:

  • 它的每一个位表示一个事件(高8位不算)
  • 每一位事件的含义,由用户自己决定,如:bit0表示按键是否按下,bit1表示是否接受到消息
    这些位的值为1:表示事件发生了;值为0:表示事件未发生
  • 任意任务或中断都可以读写这些位
  • 可以等待某一位成立,或者等待多位同时成立
    在这里插入图片描述

一个事件组就包含了一个 EventBits_t 数据类型的变量,变量类型 EventBits_t 的定义如下所示。EventBits_t 实际上是一个 16 位或 32 位无符号的数据类型 (一般设为32位)

typedef TickType_t EventBits_t;
#if ( configUSE_16_BIT_TICKS  = =  1 )
	typedef   uint16_t   TickType_t;
#else	
	typedef   uint32_t   TickType_t;
#endif
#define  configUSE_16_BIT_TICKS    0 

事件标志组与队列、信号量的区别

事件标志组和信号量存在区别,它们之间有一个可以沟通的桥梁——队列集,通过队列集可以模拟事件标志位
在这里插入图片描述

2.事件标志组相关API函数介绍

  • xEventGroupCreate():使用动态方式创建事件标志组
  • xEventGroupCreateStstic():使用静态方式创建事件标志组
  • xEventGroupClearBits():清零事件标志位
  • xEventGroupClearBitsFromISR():在中断中清零事件标志位
  • xEventGroupSetBits():设置事件标志位
  • xEventGroupSetBitsFromISR():在中断中设置事件标志位
  • xEventGroupWaitBits():等待事件标志位
  • xEventGroupSync():设置事件标志位,并等待事件标志位
  • vEventGroupDelete():删除事件标志组
  • xEventGroupGetBits():获取事件组中各事件标志位的值
  • xEventGroupGetBitsFromISR():在中断中获取事件组中各事件标志位的值

2.1.使用动态方式创建事件标志组xEventGroupCreate()

EventGroupHandle_t    xEventGroupCreate (void) ; 
  • 返回值:NULL,事件标志组创建失败;其他值,事件标志组创建成功,返回其句柄

2.2.清零事件标志位xEventGroupClearBits()

EventBits_t xEventGroupClearBits( 	EventGroupHandle_t 	xEventGroup,
									const EventBits_t 	uxBitsToClear) 
  • 形参xEventGroup:待操作的事件标志组句柄
  • 形参uxBitsToSet:待清零的事件标志位
  • 返回值:整数,清零事件标志位之前事件组中事件标志位的值

2.3.设置事件标志位xEventGroupSetBits()

EventBits_t  xEventGroupSetBits(  	EventGroupHandle_t 	xEventGroup,
									const EventBits_t 	uxBitsToSet)
  • 形参xEventGroup:待操作的事件标志组句柄
  • 形参uxBitsToSet:待设置的事件标志位
  • 返回值:整数,函数返回时事件组中事件标志位的值

2.4.等待事件标志位xEventGroupWaitBits()

EventBits_t	xEventGroupWaitBits(EventGroupHandle_t	xEventGroup,
                                const EventBits_t 	uxBitsToWaitFor,
                                const BaseType_t 	xClearOnExit,
                                const BaseType_t 	xWaitForAllBits,
                                TickType_t 			xTicksToWait)
  • 形参xEvenrGroup:等待的事件标志组句柄
  • 形参uxBitsToWaitFor:等待的事件标志位,(可以用逻辑或等待多个事件标志位)
  • 形参xClearOnExit:成功等待到事件标志位后,清除事件组中对应的事件标志位,pdTRUE清除;pdFALSE:不清除
  • 形参xWaitForAllBits:等待uxBitsToWaitFor 中的所有事件标志位(逻辑与)pdTRUE,等待的位全部为1;pdFALSE,等待的位某个为1
  • 形参xTicksToWait:等待的阻塞时间
  • 返回值
    等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位
    其他值:等待事件标志位失败,返回事件组中的事件标志位
  • 特点:可以等待某一位、也可以等待多位,等到期望的事件后,还可以清除某些位

注意,本函数只能完成设置标志位的某一位或者全部,并不能设置某几位。比如8各中的1个或8个,不能设置2-7个

2.5.设置事件标志位,并等待事件标志位xEventGroupSync()

EventBits_t	xEventGroupSync(EventGroupHandle_t	xEventGroup,
							const EventBits_t 	uxBitsToSet,
							const EventBits_t 	uxBitsToWaitFor,
							TickType_t 			xTicksToWait)
  • 形参xEvenrGroup:等待的事件标志组句柄
  • uxBitsToSet:达到同步点后,要设置的事件标志
  • uxBitsToWaitFor:等待的事件标志
  • xTicksToWait:等待的阻塞时间
  • 返回值
    等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位
    其他值:等待事件标志位失败,返回事件组中的事件标志位
  • 特点:同步——用于Task1完成后置1,等待Task2完成之后才算完成事件

3.事件标志组实验

  • 实验目的:学习 FreeRTOS 的事件标志组API函数的使用。
  • 实验设计:将设计三个任务:start_task、task1、task2
    start_task-用来创建task1和task2任务,并创建事件标志组
    task1-读取按键按下键值,根据不同键值将事件标志组相应事件位置一,模拟事件发生
    task2-同时等待事件标志组中的多个事件位,当这些事件位都置 1 的话就执行相应的处理
    在这里插入图片描述

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

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

相关文章

spring练习32-删除用户操作

18-Spring练习-删除用户操作_哔哩哔哩_bilibili 106 1、删除操作怎么做,点击删除的时候,我要发请求,就是controller某个方法当中,要不要携带参数那,因为你点这个,那个,都不一眼 2、你点这个你…

低压风机单片机方案

低压风机通常由电机、转子、机壳、进气管、出气管、齿轮和减速机等组成。电机带动转子旋转,旋转的转子带动齿轮和减速机转动,进而形成空气被吸入转子内部,通过旋转而产生的离心力把气体压缩,并将气体排出。 低压风机方案的主控型…

【C++入门到精通】C++入门 —— 模版(template)

阅读导航 前言一、模版的概念二、函数模版1. 函数模板概念2. 函数模板定义格式3. 函数模板的原理4. 函数模版的实例化🚩隐式实例化🚩显式实例化 5. 函数模板的匹配原则 三、类模板1. 类模板的定义格式2. 类模板的实例化 四、非类型模板参数1. 概念2. 定义…

GPT4模型架构的泄漏与分析

迄今为止,GPT4 模型是突破性的模型,可以免费或通过其商业门户(供公开测试版使用)向公众提供。它为许多企业家激发了新的项目想法和用例,但对参数数量和模型的保密却扼杀了所有押注于第一个 1 万亿参数模型到 100 万亿参…

Docker是什么?详谈它的框架、使用场景、优势

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、什么是 Docker? 二、Docker 的架构 1、Docker客户端 2、Docker守护进程 3、Docker镜像 4、Docker容器 5、Docker…

锚定医学营养 健启星深耕不辍

在生命医学中,营养被称为维持患者生命的物质基础。医学营养,是结合了医学临床营养、营养素与疾病预防等方面,并根据患者的医疗记录、身体检查及心理情况,由医生及专业营养师给出配比完善的营养素,以此来增加患者身体的…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第三天)动态SQL

动态SQL—SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录(第三天)Mybatis的动态SQL操作 昨天我们深入学习了Mybatis的核心对象SqlSessionFactoryBuilder,掌握MyBatis核心配置文件以及元素的使用,也掌握My…

《Zookeeper》源码分析(十九)之 LearnerHandler

目录 LearnerCnxAcceptorrun() LearnerCnxAcceptorHandlerrun() LearnerHandlerrun()syncFollower()SNAP全量同步startSendingPackets() LearnerCnxAcceptor 在Leader.lead()方法中创建并启动LearnerCnxAcceptor线程,该线程主要是建立LearnerCnxAcceptorHandler并将…

介绍两个js补环境项目

1. v-jstools 这个项目是一个浏览器插件,用来补环境的话,是非常好的一个插件。项目地址是:GitHub - cilame/v_jstools: https://github.com/cilame/v_jstools 这里是我的配置 这个是使用后的效果 可以看到,里面调用的环境都被检…

【ARM AMBA AXI 入门 10 - AXI 总线 DATA信号与 STRB 信号之间的关系 】

文章目录 AXI STRB 信号 AXI STRB 信号 AXI总线是ARM公司设计的高性能处理器接口,其中STRB和DATA信号在AXI协议中有特殊的含义和关系。 DATA信号:在AXI中,DATA信号用于在读写操作中传输实际的数据。数据的大小可以根据AXI接口的位宽来变化&…

Redis(缓存预热,缓存雪崩,缓存击穿,缓存穿透)

目录 一、缓存预热 二、缓存雪崩 三、缓存击穿 四、缓存穿透 一、缓存预热 开过车的都知道,冬天的时候启动我们的小汽车之后不要直接驾驶,先让车子发动机预热一段时间再启动。缓存预热是一样的道理。 缓存预热就是系统启动前,提前将相关的…

I2C读写eeprom的问题

接线 在配置I2C的时候要把IO的口设置为开漏模式,为什么要设置开漏模式呢? 答:I2C协议支持多个主设备与多个从设备在一条总线上,如果不用开漏输出,而用推挽输出,会出现主设备之间短路的情况所以总线一般会…

基于闪电搜索算法优化的BP神经网络(预测应用) - 附代码

基于闪电搜索算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于闪电搜索算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.闪电搜索优化BP神经网络2.1 BP神经网络参数设置2.2 闪电搜索算法应用 4.测试结果:5…

使用Linux本地快速搭建web网站,并内网穿透发布上线「内网穿透」

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道,指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

最小二乘法,残差,线性模型-线性回归

目录 什么是最小二乘法 残差是什么意思 线性模型 线性回归 方法一:解析解法 代码实战: 方法二:数值解法 代码实战: 解析法(最小二乘)还是数值法(梯度下降),如何…

笔记:自注意力机制

1、和其他网络的比较 自注意力机制适合处理长文本,并行度好,在GPU上,CNN和Self-attention性能差不多,在TPU(Tensor Processing Uni)效果更好。 2、输入特点 原生的Transformer中nn.embeding输入需要非负整…

住宅IP代理与数据中心IP代理的区别,最详解

跨境业务中常见到浏览器指纹防关联,但说到底,最重要的指纹是您的IP地址。在多个账号使用相同的IP地址简直触犯了大忌,这样做往往会导致账号惨遭暂停。 现在越来越多的跨境业务场景需要用到IP代理,那么我们常见的数据中心代理与住…

Instagram最新防封教程,看这一篇就够了

Instagram一直以来都是海外社媒巨头,也是跨境外贸引流推广的必争之地。在庞大的用户量中,真正了解平台规则的却并不多。它有一系列的社区准则和使用条款,稍有不慎违反规定就会造成限流,甚至导致账号被封禁,进而造成客户…

C++学习--函数实现

##MakeFileMAIN :Examples/main.cpp#主文件目录MAIN.o:objs/main.o##目标文件目录cpp_srcs :$(shell find src -name "*.cpp")cpp_objs :$(patsubst src/%.cpp,objs/%.o,$(cpp_srcs))#加头文件的编译选项 include_dirs :/home/shenlan/Group/00.lsa/project/include …

无涯教程-PHP - eregi()函数

eregi() - 语法 int eregi(string pattern, string string, [array regs]); eregi()函数在pattern指定的整个字符串中搜索string指定的字符串,。搜索不区分大小写。 Eregi()在检查字符串的有效性时特别有用。 可选的输入参数regs包含一个由正则表达式中的括号分组的所有匹配…