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

news2024/11/18 9:20:49

。事件标志组定义

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指定位。

//按键3
	if(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);			
			}
		}
	}
	//按键4
	if(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);			
			}
		}
	}
	//按键5
	if(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);			
			}
		}
	}
	
	//按键6
	if(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.coloradmin.cn/o/831353.html

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

相关文章

opencv36-形态学操作-膨胀 cv2.dilate()

膨胀操作是形态学中另外一种基本的操作。膨胀操作和腐蚀操作的作用是相反的&#xff0c;膨胀操作能对图像的边界进行扩张。膨胀操作将与当前对象&#xff08;前景&#xff09;接触到的背景点合并到当前对象内&#xff0c;从而实现将图像的边界点向外扩张。如果图像内两个对象的…

接口测试原理和基本步骤

目录 1、接口测试原理 2、接口测试的实现 3、接口测试用例 4、接口测试工具 5、HTTP协议 6、JMeter 7、抓包 8、接口测试可以发现什么样的Bug&#xff1f; 1、接口测试原理 接口测试&#xff0c;实际上是针对于接口做测试的。 那么接口是什么&#xff1f; 软件开发&…

人力管理系统servlet+jsp人事考勤员工部门java jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 人力管理系统servletjsp 系统有1权限&#xff1a;管理…

Linux - gcc/g++工具使用

gcc/g是用于编译C/C程序的编译器 1.编译过程 1. 预处理&#xff08;头文件展开&#xff0c;条件编译&#xff0c;进行宏替换&#xff0c;去注释等) 2. 编译&#xff08;C语言汇编语言) 3. 汇编&#xff08;汇编->可重定位目标二进制文件&#xff0c;不可以被执行的&#xff…

图解系列 非对称加密应用场景

非对称加密使用一对密钥&#xff0c;分别是公钥&#xff08;public key&#xff09;和私钥&#xff08;private key&#xff09;。 使用场景 加密场景 加密场景 公钥加密、私钥解密&#xff1a; 公钥加密&#xff1a;在这种场景下&#xff0c;使用接收方的公钥对数据进行加密…

Spring源码解析(六):bean定义后置处理器ConfigurationClassPostProcessor

Spring源码系列文章 Spring源码解析(一)&#xff1a;环境搭建 Spring源码解析(二)&#xff1a;bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三)&#xff1a;bean容器的刷新 Spring源码解析(四)&#xff1a;单例bean的创建流程 Spring源码解析(五)&…

数据结构 | 搜索和排序——排序

目录 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 排序是指将集合中的元素按照某种顺序排序的过程。 一、冒泡排序 冒泡排序多次遍历列表。它比较相邻的元素&#xff0c;将不合顺序的交换。每一轮遍历都将下一个最大值放到正确的位…

校园跑腿小程序运营攻略

作为一名校园跑腿小程序的运营者&#xff0c;你可能会面临诸如用户获取、平台推广、服务质量保证等挑战。在本篇推文中&#xff0c;我将为你提供一些关键的运营策略&#xff0c;帮助你成功运营校园跑腿小程序。 1. 用户获取和留存 用户是校园跑腿小程序成功的关键。以下是一些…

非凸科技受邀参加中科大线上量化分享

7月30日&#xff0c;非凸科技受邀参加由中国科学技术大学管理学院学生会、超级量化共同组织的“打开量化私募的黑箱”线上活动&#xff0c;分享量化前沿以及求职经验&#xff0c;助力同学们拿到心仪的offer。 活动上&#xff0c;非凸科技量化策略负责人陆一洲从多个角度分享了如…

基于Windows手动编译openssl和直接安装openssl

零、环境 win10-64位 VS2019 一、手动编译 1、安装perl https://platform.activestate.com/ActiveState-Projects/ActiveState-Perl-5.36.0 两种方法都没能成功。。第一种下载后会得到一个 state-remote-installer.exe&#xff0c;然后安装时会在命令行中执行&#xff0c;…

PtahDAO:全球首个DAO治理资产信托计划的金融平台

金融科技是当今世界最具创新力和影响力的领域之一&#xff0c;区块链技术作为金融科技的核心驱动力&#xff0c;正在颠覆传统的金融模式&#xff0c;为全球用户提供更加普惠、便捷、安全的金融服务。在这个变革的浪潮中&#xff0c;PtahDAO&#xff08;普塔道&#xff09;作为全…

UMS攸信入选2023年先进制造业倍增计划企业名单,为企业发展增添新助力!

根据《厦门市人民政府关于印发先进制造业倍增计划实施方案&#xff08;2022-2026年&#xff09;的通知》&#xff08;厦府规〔2022〕3号&#xff09;&#xff0c;经市政府专题会研究&#xff0c;确定2023年先进制造业倍增计划企业名单。 关于2023年先进制造业倍增计划企业名单和…

【知网检索】2023年金融,贸易和商业管理国际学术会议(FTBM2023)

随着经济全球化&#xff0c;贸易自由化的进程加快&#xff0c;我国经济对外开放程度不断加深&#xff0c;正在加快融入世界经济一体化当中。当今世界各国竞争过程中&#xff0c;金融、贸易以及商业形态已成为其关键与焦点竞争内容。 2023年金融、贸易和商业管理国际学术会议(F…

百度飞桨助力高校培养AI大模型人才,2023年飞桨产学合作项目申报启动

7月7日&#xff0c;教育部产学合作协同育人项目公布项目指南通过的企业名单&#xff0c;百度被列入2023年&#xff08;5月&#xff09;批次名单&#xff1b;其中百度飞桨与文心大模型项目40个&#xff0c;包含教学内容和课程体系改革、实践条件和实践基地建设、师资培训项目三大…

途游游戏 x 极狐GitLab “通关” DevOps :单元测试从无到优,覆盖率 0→80%

目录 4 个工具孤岛 → 极狐GitLab 全家桶&#xff0c; 被动的「人找进度」 → 高效的「进度找人」 把 Code Review 做扎实 代码质量「向左移」&#xff0c;修复成本「往下降」 从无到「优」 自动执行单元测试&#xff0c;覆盖率 0→80% 你喜欢玩游戏吗&#xff1f; 最近…

概念辨析 | SAR运动补偿和自聚焦技术:深入探索雷达图像

注1:本文系“概念辨析”系列之一,致力于简洁清晰地解释、对比复杂而专业的概念。本次辨析的概念是:合成孔径雷达(SAR)的运动补偿和自聚焦技术。 SAR运动补偿和自聚焦技术:深入探索雷达图像 Synthetic Aperture Radar (SAR) 1 背景介绍 合成孔径雷达(Synthetic Aperture R…

打印机地址换了怎么连接

原先的打印机地址&#xff1a;172.16.17.10 添加新打印机地址&#xff1a;winR打开&#xff0c;在运行里输入更改后的地址&#xff08;\\ip&#xff09;\\172.16.17.40确定&#xff0c;右键链接。就可以在你要用到的地方看到这个设备了

ESD防静电监控系统在SMT产线中的应用案例

作为电子厂的关键制造环节之一&#xff0c;SMT&#xff08;表面贴装技术&#xff09;产线的效率和质量对企业的竞争力至关重要。为了提高生产线的管理效率和保障生产环境的质量&#xff0c;许多电子厂开始采用MES生产管理系统和ESD防静电监控系统的综合解决方案。 在SMT产线中安…

高电压功放的优点有哪些呢(高压放大器)

高电压功放是电子设备中的一种特殊类型的功率放大器&#xff0c;具有独特的优点&#xff0c;被广泛应用于各种领域。高电压功放可以将低电压信号放大到较高的电压水平&#xff0c;实现对大功率负载的驱动。下面我们来看看一下高电压功率放大器的优点。 1.宽电压范围 高电压功放…

8月3日上课内容 LNMP精讲

LNMP&#xff1a;目前成熟的企业网站的应用模式之一&#xff0c;指的是一套协作工作的系统和相关文件 能够提供静态页面服务&#xff0c;也可以提供动态web服务。 这是一个缩写 L linux系统&#xff0c;操作系统。 N nginx网站服务&#xff0c;前端&#xff0c;提供前端的静…