FreeRTOS 事件标志组 详解

news2024/11/18 1:32:08

目录

什么是事件标志组?

事件标志位

事件标志组

事件标志组相关 API 函数

1. 创建事件标志组

2. 设置事件标志位

3. 清除事件标志位

4. 等待事件标志位

事件标志组实操


什么是事件标志组?

事件标志位

表明某个事件是否发生,联想:全局变量 flag。通常按位表示,每一个位表示一个事件(高8位不算)

事件标志组

是一组事件标志位的集合, 可以简单的理解事件标志组,就是一个整数。

事件标志组本质是一个 16 位或 32 位无符号的数据类型 EventBits_t ,由 configUSE_16_BIT_TICKS 决定。

虽然使用了 32 位无符号的数据类型变量来存储事件标志, 但其中的高8位用作存储事件标志组的 控制信息,低 24 位用作存储事件标志 ,所以说一个事件组最多可以存储 24 个事件标志!

事件标志组相关 API 函数

                                函数                                描述
xEventGroupCreate()使用动态方式创建事件标志组
xEventGroupCreateStatic()使用静态方式创建事件标志组
xEventGroupClearBits()清零事件标志位
xEventGroupClearBitsFromISR()在中断中清零事件标志位
xEventGroupSetBits()设置事件标志位
xEventGroupSetBitsFromISR()在中断中设置事件标志位
xEventGroupWaitBits()等待事件标志位

1. 创建事件标志组

EventGroupHandle_t xEventGroupCreate( void );

参数:

返回值:

成功,返回对应事件标志组的句柄;

失败,返回 NULL 。

2. 设置事件标志位

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
                                const EventBits_t uxBitsToSet );

参数:

xEventGroup:对应事件组句柄。 uxBitsToSet:指定要在事件组中设置的一个或多个位的按位 值。

返回值:

设置之后事件组中的事件标志位值。

3. 清除事件标志位

EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
                                const EventBits_t uxBitsToClear );

参数:

xEventGroup:对应事件组句柄。 uxBitsToClear:指定要在事件组中清除的一个或多个位的按位 值。

返回值:

清零之前事件组中事件标志位的值。

4. 等待事件标志位

EventBits_t xEventGroupWaitBits(
                        const EventGroupHandle_t xEventGroup,
                        const EventBits_t uxBitsToWaitFor,
                        const BaseType_t xClearOnExit,
                        const BaseType_t xWaitForAllBits,
                        TickType_t xTicksToWait );

参数:

xEventGroup:

  • 对应的事件标志组句柄

uxBitsToWaitFor:

  • 指定事件组中要等待的一个或多个事件位的按位值

xClearOnExit:

  • pdTRUE——清除对应事件位,
  • pdFALSE——不清除

xWaitForAllBits:

  • pdTRUE——所有等待事件位全为1(逻辑与),
  • pdFALSE——等待的事件位有一个为1(逻辑或)

xTicksToWait:

  • 超时时间,0 表示不超时,
  • portMAX_DELAY表示卡死等待

返回值:

等待的事件标志位值:等待事件标志位成功,返回等待到的事件标志位

其他值:等待事件标志位失败,返回事件组中的事件标志位

事件标志组实操

创建一个事件标志组和两个任务( task1 和 task2),task1 检测按键,如果检测到 KEY1 和 KEY2 都按过,则执行 task2 。

1.打开CubeMX,将FreeRTOS移植到STM32F103C8T6,具体看我之前写过的文章

将FreeRTOS移植到STM32F103C8T6

2.增加两个任务,配置两个输入引脚给按键Key1和Key2,导出代码

3.在代码中创建一个事件标志组

EventGroupHandle_t eventgroup_handle; // 事件标志组句柄

eventgroup_handle = xEventGroupCreate(); // 创建一个事件标志组

4.task1 检测按键,如果检测到 KEY1 和 KEY2 都按过,则执行 task2

freertos.c

void StartTaskKey1(void const * argument)
{
  for(;;)
  {
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
		{
			osDelay(20);
			if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET)
			{
				xEventGroupSetBits(eventgroup_handle, 0x01);
			}
			while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET);
		}
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET)
		{
			osDelay(20);
			if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET)
			{
				xEventGroupSetBits(eventgroup_handle, 0x02);
			}
			while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1) == GPIO_PIN_RESET);
		}
    osDelay(10);
  }
}

void StartTaskKey2(void const * argument)
{
  for(;;)
  {
    event_bit = xEventGroupWaitBits(eventgroup_handle,0x01|0x02,pdTRUE,pdTRUE,portMAX_DELAY);
    printf("返回值:%#x,按键都按下,任务2可以执行了\r\n",event_bit); // %#x是带格式输出, 效果为在输出前加0x. 
    osDelay(1);
  }
}

5.打开串口助手看运行结果

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

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

相关文章

【JAVA学习笔记】47 - 异常,try-catch处理,throw处理

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter12/scr/com/yinhai/exception_ 〇、异常处理的引入 程序出现一个小问题如int num1 10;int num2 0;num1 / num2 > 10 / 0 会抛出错误,但这样不算致命的小问题就…

android studio启动Task配置

Android studio 高版本默认不开启Task配置,需要自己手动开启 1.低版本配置路径:(复制他人图片) 2.高版本路径:添加下图勾选配置即可 3.gradle task 3.1 初识task gradle中所有的构建工作都是由task完成的,它帮我们处…

案例精选|聚铭网络多产品联合部署为北京迎祥酒店建立信息安全屏障

北京迎祥酒店位于龙脉之上的北京后花园昌平区,总面积约18666平米,主营餐饮、住宿、汤泉、婚礼四大业务,酒店每一个细节都散发着国潮气息,充满艺术气质,祥瑞的照壁、精工的雕花、厚重的石刻、颇具京韵京味,是…

Python 自定义模块和包实现GUI(图形界面)登录界面

上一篇:Python 自定义模块和包设计英语生词本(文件版)-CSDN博客 紧接上一篇博文,当我们熟练掌握自定义模块和包、掌握文件的的读取与写入、掌握正则表达式内置模块"re"、掌握GUI(图形界面)的部分…

HarmonyOS原生分析能力,即开即用助力精细化运营

数据分析产品对开发者的价值呈现在两个层面,第一个是产品的层面,可以通过数据去洞察用户的行为,从而找到产品的优化点。另外一个就是运营层面,可以基于数据去驱动,来实现私域和公域的精细化运营。 在鸿蒙生态上&#…

Mac用NTFS文件夹读写NTFS硬盘 NTFS能复制多大的文件

Mac作为一款备受欢迎的计算机操作系统,具备了许多令人惊叹的功能和特性。然而,对于一些Mac用户来说,使用NTFS格式的硬盘可能存在一些疑问。他们可能想知道Mac是否能够读写NTFS格式的硬盘,以及NTFS格式的硬盘是否有文件大小的限制。…

067:mapboxGL上传CSV文件,显示图形,导出为Geojson文件

第067个 点击查看专栏目录 本示例的目的是演示如何在vue+mapbox中上传CSV文件,显示图形,导出为Geojson文件。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果使用的csv文件配置方式示例源代码(共140行)安装依赖相关API参考:专栏目标示例…

CentOS 搭建本地 yum 源方式 安装 httpd 服务

CentOS 搭建本地 yum 源方式 安装 httpd 服务 修改 yum 源 挂载光驱 mkdir -p /mnt/cdrom mount /dev/cdrom /mnt/cdromvi /etc/fstab追加以下内容: /dev/cdrom /mnt/cdrom iso9660 defaults 0 0手动修改CentOS-Base.repo 备份 yum 源配置文件 mv /etc/yum.re…

如何用FLStudio水果21中文版创作音乐?(官方基础教程中文版)

本文讲的是FL Studio的界面和基础工作流程。简言之,FL Studio能让你载入乐器和音频采样,通过手动输入音符数据或实时弹奏来演奏它们;录制外部声音(比如用麦克风录音)然后通过调音台来回放整个混音(还能添加…

私有云:架构图

私有云:架构图 1、架构图2、服务器分配及配置3、本地物理机hosts文件配置4、相关软件包5、本地物理机电脑配置参考【内存最好20G往上】 机缘巧合之下突然想玩玩虚拟化,然后就查资料本地自己搭建一套私有云 使用【VMware Workstation】这个虚拟化软件来进…

Linux系统下DHCP服务安装部署和使用实例详解(蜜罐)

目录 一、概述 二、具体配置如下: 一、概述 DHCP :动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途&…

状态模式-对象状态及其转换

某信用卡业务系统,银行账户存在3种状态,且在不同状态下存在不同的行为: 1)正常状态(余额大等于0),用户可以存款也可以取款; 2)透支状态(余额小于0且大于-20…

旅游业热潮中的数字化转型,拓世AI数字人直播一体机重新定义酒店服务的未来

国内经济的快速发展使得居民的生活条件逐渐改善,我国居民人均可支配收入持续增多,居民消费能力和消费水平均同步提高。物质生活条件的持续改善使得人们精神层面的需求加速释放,旅游需求迅速增多。人们出游意愿强烈,旅游行业复苏加…

02 # 手写 instanceof 的原理

instanceof 干什么的&#xff1f; instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。 instanceof 可以判断一个对象是否属于某个类 <script>function Person(name, age) {this.name name;this.age age;}Person.prototype.sayH…

基于springboot,vue学生宿舍管理系统

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vuevue-element-admin 服务端技术&#xff1a;springboot,mybatis…

【信创】银河麒麟V10 本地部署yum数据源

1. 下载银河麒麟系统ISO镜像文件。 https://fdoc.epoint.com.cn:3366/ISO/麒麟V10/ wget https://fdoc.epoint.com.cn:3366/ISO/麒麟V10/Kylin-Server-10-SP1-Release-Build19-20210319-x86.iso 一般这个镜像文件会默认放置在/home目录下&#xff0c;如图&#xff1a; 挂载到…

数学分析:傅里叶三角级数

贝塞尔不等式&#xff0c;就是勾股定理。不过要注意&#xff0c;因为他们的基并不是单位基&#xff0c;所以系数做过缩放。 三角级数的复形式。 通过复形式&#xff0c;可以进一步化简。 因为是等比数列&#xff0c;最终可以得到一个很好的地理克雷核。 这个引理的意思是&#…

flinksql kafka到mysql累计指标练习

flinksql 累计指标练习 数据流向&#xff1a;kafka ->kafka ->mysql 模拟写数据到kafka topic&#xff1a;wxt中 import com.alibaba.fastjson.JSONObject; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Produ…

数据结构—线性表(下)

文章目录 6.线性表(下)(4).栈与队列的定义和ADT#1.ADT#2.栈的基本实现#3.队列的形式#4.队列的几种实现 (5).栈与队列的应用#1.栈的应用i.后缀表达式求值ii.中缀表达式转后缀表达式 #2.队列的应用 (6).线性表的其他存储方式#1.索引存储#2.哈希存储i.什么是哈希存储ii.碰撞了怎么…

windows 安装小乌龟

这是什么 这里简单描述一下在windows上如何安装GIT代码管理工具和使用小乌龟版本来调用GIT&#xff0c;并且配置一下git相关信息&#xff0c;可以使用小乌龟来操作代码。也有一些常规git使用方法。 需要的资源 Git-2.42.0-64-bit.exe&#xff08;这个是git代码管理工具&…