8.物联网操作系统之事件标志组

。事件标志组定义

FreeRTOS事件标志组介绍

FreeRTOS事件标志组工作原理

一。事件标志组定义

信号量信号量只能实现任务与单个事件或任务间的同步。但是某些任务可能会需要与多个事件或任务进行同步,此时就可以使用事件标志组来解决。事件标志组能够实现某个任务与多个事件或任务间的同步。

 如上图所示:

        事件可以由两个或两个以上来触发运行,所以引入事件标志组定义。

2.FreeRTOS事件标志组介绍

有24个位,中断或者任务运行结束,把为SET为1,当满足条件时,运行Task2. 

3.FreeRTOS事件标志组工作原理

 任务1需要事件3与4同时运行,任务0需要事件3或者4运行,所以当事件3运行后,任务0激活,任务1不激活。当事件4发生后,任务0才激活。

二。实验:事件标志组函数的应用

1.功能需求

1、使用事件标志组检测多个按键输入(K3、K4、K5、K6)

2、当检测到任何一个按键按下,串口打印输出按键信息

3、当4路按键都已经按下,触发蜂鸣器报警

2.API

(1)xEventGroupCreate()创建事件标志组#include "event_groups.h"

(2) xEventGroupSetBits()在任务中设置事件标志单位

 (3)xEventGroupSetBitsFromISR()中断设置事件标志组位

 (4)xEventGroupGetBits()在任务中获取事件标志组位值

 (5)xEventGroupGetBitsFromISR()中断中获取事件标志组位的值

(6)xEventGroupWaitBits()等待事件标志组位触发

 (7)xEventGroupSync()此功能通常用于同步多个任务

3.功能需求及具体实现方法

1、使用事件标志组检测多个按键输入(K3、K4、K5、K6)

2、当检测到任何一个按键按下,串口打印输出按键信息

3、当4路按键都已经按下,触发蜂鸣器报警

4.cubemx创建工程

(1)Key3-Key6都设置成中断输出,并把上下沿都设置成可导致中断。NVIC也设置一下。

 

(2)FREERTOS的配置

        上述的API接口xEventGroupSetBitsFromISR()必须要用到守护任务。

        从FREERTOS 原理图可以找到,这个函数,上面的Note中表示,必须要使能configUSE_TIMERS与INCLUDE_xTimerPendFunctionCall。如下两图所示。

设置USE_TIMERS

 设置

 

 5.步骤:

(1)创建事件标志

        根据FREERTOS的参考手册(上面也有API),创建的时候需要头文件#include "event_groups.h",自己创建一个事件标志句柄EventGroupHandle_t KeyEventGroup;如图所示。

#include "event_groups.h"
EventGroupHandle_t KeyEventGroup;

(2)在FREERTOS的init中创建事件标志组 

	//创建事件标志组KeyEventGroup = xEventGroupCreate();if(KeyEventGroup == NULL){printf("KeyEventGroup Create Error\r\n");}     

(3)事件标志组用在GPIO.c,声明为外部变量

extern EventGroupHandle_t KeyEventGroup;

(4)在gpio.c的值

#define KEY3_EVENT_BIT  (1<<0)
#define KEY4_EVENT_BIT  (1<<1)
#define KEY5_EVENT_BIT  (1<<2)
#define KEY6_EVENT_BIT  (1<<3) 

(5)在GPIO.c中的中断回调函数,按下就Set指定位。

//按键3if(Key3_Pin == GPIO_Pin){if(HAL_GPIO_ReadPin(Key3_GPIO_Port,Key3_Pin) == GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(Key3_GPIO_Port,Key3_Pin) == GPIO_PIN_RESET){xEventGroupSetBitsFromISR(KeyEventGroup,KEY3_EVENT_BIT,NULL);			}}}//按键4if(Key4_Pin == GPIO_Pin){if(HAL_GPIO_ReadPin(Key4_GPIO_Port,Key4_Pin) == GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(Key4_GPIO_Port,Key4_Pin) == GPIO_PIN_RESET){xEventGroupSetBitsFromISR(KeyEventGroup,KEY4_EVENT_BIT,NULL);			}}}//按键5if(Key5_Pin == GPIO_Pin){if(HAL_GPIO_ReadPin(Key5_GPIO_Port,Key5_Pin) == GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(Key5_GPIO_Port,Key5_Pin) == GPIO_PIN_RESET){xEventGroupSetBitsFromISR(KeyEventGroup,KEY5_EVENT_BIT,NULL);			}}}//按键6if(Key6_Pin == GPIO_Pin){if(HAL_GPIO_ReadPin(Key6_GPIO_Port,Key6_Pin) == GPIO_PIN_RESET){HAL_Delay(10);if(HAL_GPIO_ReadPin(Key6_GPIO_Port,Key6_Pin) == GPIO_PIN_RESET){xEventGroupSetBitsFromISR(KeyEventGroup,KEY6_EVENT_BIT,NULL);					}}}

(6)低优先级设置

EventBits_t KeyEventBits;KeyEventBits = xEventGroupWaitBits(KeyEventGroup,KEY3_EVENT_BIT|KEY4_EVENT_BIT|KEY5_EVENT_BIT|KEY6_EVENT_BIT,pdFALSE,pdFALSE,portMAX_DELAY);printf("Key is Down Key Event Bit is %x\r\n",KeyEventBits);osDelay(10);

 (6)高优先级设置

EventBits_t KeyEventBits;KeyEventBits = xEventGroupWaitBits(KeyEventGroup,KEY3_EVENT_BIT|KEY4_EVENT_BIT|KEY5_EVENT_BIT|KEY6_EVENT_BIT,pdTRUE,pdTRUE,portMAX_DELAY);	if(KeyEventBits == (KEY3_EVENT_BIT|KEY4_EVENT_BIT|KEY5_EVENT_BIT|KEY6_EVENT_BIT)){printf("Buzzer is Toggle\r\n");HAL_GPIO_TogglePin(Buzzer_GPIO_Port,Buzzer_Pin);}
osDelay(10);

结果:

应该是:

key3,key4,key5,key6按钮都可以触发输出,蜂鸣器触发似乎是要全部按钮按下才会消除。

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

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

相关文章

Webpack5 动态导入按需加载

文章目录 一、 什么是动态导入和按需加载&#xff1f;二、 具体用法示例二、 总结 一、 什么是动态导入和按需加载&#xff1f; 传统上&#xff0c;在Webpack中&#xff0c;我们使用import语句可以在代码中静态地导入模块。这意味着所有的模块都会在构建时被打包到bundle中。然…

【PostgreSQL】系列之 一 用户创建和授权(三)

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

如何在 Android 上恢复已删除的视频|快速找回丢失的记忆

想知道是否有任何成功的方法可以从 Android 手机中检索已删除的视频&#xff1f;好吧&#xff0c;本指南将向您展示分步说明&#xff0c;让您轻松从手机中找回丢失的视频文件&#xff01; 您是否不小心从 Android 智能手机中删除了珍贵的生日视频&#xff1f;难道是无处可寻吗…

前端监控概述

前端监控埋点概览 前端监控主要分为三类&#xff1a;数据监控、性能监控、异常监控 数据监控 记录上报产品在用户端的使用情况&#xff0c;以数据为导向&#xff0c;帮助团队做决策&#xff0c;数据监控有时也被称为行为监控&#xff0c;常见的包括&#xff1a; PV/UV&…

宝塔面板Mysql数据库无法启动(已解决)

1、错误排查 Mysql 无法正常启动直接使用官方提供的脚本检查出错 wget -O sql-repair.sh http://download.bt.cn/install/sql-repair.sh && sh sql-repair.shwget -O sql-repair.sh http://download.bt.cn/install/sql-repair.sh && sh sql-repair.sh 打印出…

LoadRunner

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 LoadRunner 安装LoadRunner 三大组件之间的关系LoadRunner 脚本录制WebTours 系统 脚本加强事务插入插入集合点插入检查点参数…

增量式PID算法及其MATLAB实现

增量式PID算法是一种常用的控制算法,用于控制系统中的反馈控制。它通过对系统的误差进行递推式的计算,实现对系统输出的调节,使得系统的输出逐渐趋向于设定值。 delta u(k)=u(k)-u(k-1)=Kp*(e(k)-e(k-1))+Ki*e(k)+Kd*(e(k)-2*e(k-1)+e(k-2)) PID算法由三个部分组成:比例(…

Cat.1如何成为物联网业务加速器?

随着Cat.1芯片及模组在功耗和成本上的不断优化&#xff0c;在窄带物联网领域&#xff0c;越来越多的终端客户把Cat.1当做与NB-IoT相比较的第二选择。越来越多的表计、烟感、市政等行业终端将Cat.1模组应用于非集中化部署的上报类终端业务中&#xff0c;Cat.1这只“网红猫”仍保…

在 spark-sql / spark-shell / hive / beeline 中粘贴 sql、程序脚本时的常见错误

一个很小的问题&#xff0c;简单记录一下。有时候我们会粘贴一段已经成功运行过的SQL或程序脚本&#xff0c;但是在spark-sql / spark-shell / hive / beeline 中执行时可能会报这样的错误&#xff1a; hive> CREATE EXTERNAL TABLE IF NOT EXISTS ORDERS(> Display all…

基于vue医院分时段预约挂号系统java病历管理系统snsj0

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。互联网逐步进入千家万户&#xff0c;改变传统的管理方式&#xff0c;医院病历管理系统以互联网为基础&#xff0c;利用java技术&#xff0c;和mysql数据库开发设计一套医院病历管理系统&#xff0c;提高工作效率的同时&…

点击表格行高亮

css中三元表达式 :class"[activeIndex index ? color : , item]"点击行高亮 <div click"actvied(index)" :class"[activeIndex index ? color : , item]"v-for"(item, index) in tableData" :key"index">{{ item…

[Linux]理解文件系统!动静态库详细制作使用!(缓冲区、inode、软硬链接、动静态库)

hello&#xff0c;大家好&#xff0c;这里是bang___bang_&#xff0c;今天来谈谈的文件系统知识&#xff0c;包含有缓冲区、inode、软硬链接、动静态库。本篇旨在分享记录知识&#xff0c;如有需要&#xff0c;希望能有所帮助。 目录 1️⃣缓冲区 &#x1f359;缓冲区的意义 …

Python(六十九)为什么要将元组设计成不可变序列

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

nginx服务

目录 基本介绍 nginx的主要功能 nginx的主要应用场景 nginx常用命令 nginx另外一种安装方式 nginx常用的信号符&#xff1a; nginx配置文件详解 全局配置 event模块 http模块 server模块 location模块&#xff1a; 模块的划分 基本介绍 nginx&#xff1a;高性能、…

06 Ubuntu22.04上的miniconda3安装、深度学习常用环境配置

下载脚本 我依然是在清华镜像当中寻找的脚本。这里找脚本真的十分方便&#xff0c;我十分推荐。 wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh 下载十分快速&#xff0c;10秒解决问题 运行miniconda3安装脚本 赋予执…

python数据容器

目录 数据容器 反向索引 list列表 语法 案例 列表的特点 列表的下表索引 list的常用操作 list列表的遍历 while循环遍历 for循环遍历 tuple元组 前言 元组定义 元组特点 获取元组元素 元组的相关操作 元组的遍历 while循环遍历 for循环遍历 字符串 前言…

SpringBoot复习:(19)Condition接口和@Conditional注解

Condition接口代码如下&#xff1a; public interface Condition {boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);}它是一个函数式接口&#xff0c;只有一个方法matches用来表示条件是否满足。matches方法中的ConditionContext类对象context可以…

OPENCV C++(五)滤波函数+sobel边缘检测+人脸磨皮mask

滤波函数 中值滤波 medianBlur(frame, detectmat, 5); 平均滤波 blur(frame, detectmat, Size(5, 5)); 高斯滤波&#xff08;最后一个是方差 越大越模糊&#xff09; GaussianBlur(frame, detectmat, Size(5, 5),0); sobel的边缘检测函数 Sobel(gray, dx, CV_16S, 1, 0, 3…

图片静态展示

图片静态展示程序&#xff0c;包含选择文件夹路径&#xff0c;旋转&#xff0c;放大缩小&#xff0c;拖动&#xff0c;幻灯片播放&#xff0c;上一张下一张等&#xff0c;程序使用QT实现。 程序下载地址&#xff1a; 图片静态展示&#xff0c;包含选择文件夹路径&#xff0c;…

LeetCode113. 路径总和 II

113. 路径总和 II 文章目录 [113. 路径总和 II](https://leetcode.cn/problems/path-sum-ii/)一、题目二、题解方法一&#xff1a;递归另一种递归版本方法二&#xff1a;迭代 一、题目 给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶…