stm32cubemx hal学习记录:FreeRTOS事件

news2024/11/30 0:43:42

一、事件

事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对多,多对多的同步。即一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理,也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。

每一个事件组只需要很少的 RAM 空间来保存事件组的状态。事件组存储在一个 EventBits_t 类型的变量中,该变量在事件组结构体中定义 。在 STM32 中 , 我们一般 configUSE_16_BIT_TICKS 定义为 0,那么 uxEventBits 是 32 位的,有 24 个位用来实现事 件标志组。每一位代表一个事件,任务通过“逻辑与”或“逻辑或”与一个或多个事件建立关联,形成一个事件组。 事件的“逻辑或”也被称作是独立型同步,指的是任务感兴趣的所有事件任一件发生即可被唤醒;事件“逻辑与”则被称为是关联型同步,指的是任务感兴趣的若干事件都发生时才被唤醒,并且事件发生的时间可以不同步。

多任务环境下,任务、中断之间往往需要同步操作,一个事件发生会告知等待中的任务,即形成一个任务与任务、中断与任务间的同步。 事件可以提供一对多、多对多的同步操作。一对多同步模型:一个任务等待多个事件的触发,这种情况是比较常见的;多对多同步模型:多个任务等待多个事件的触发。任务可以通过设置事件位来实现事件的触发和等待操作。FreeRTOS 的事件仅用于同步,不提供数据传输功能。

在 FreeRTOS 事件中,每个事件获取的时候,用户可以选择感兴趣的事件,并且选择读取事件信息标记,它有三个属性,分别是逻辑与,逻辑或以及是否清除标记。当任务等待事件同步时,可以通过任务感兴趣的事件位和事件信息标记来判断当前接收的事件是否满足要求,如果满足则说明任务等待到对应的事件,系统将唤醒等待的任务;否则,任务会根据用户指定的阻塞超时时间继续等待下去。

二、配置过程

1、配置RCC、USART1、时钟84M

2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。

3、初始化LED的两个引脚、两个按键引脚

4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可,但是如果要使用事件,则必须选择V2版本。

5、添加一个事件

 6、创建两个线程。

三、API

1、创建一个事件组:osEventFlagsNew

Send_stackHandle = osThreadNew(Send_thread_entry, NULL, &Send_stack_attributes);
Receive_stackHandle = osThreadNew(Recevie_thread_entry, NULL,&Receive_stack_attributes);

2、删除事件组:osEventFlagsDelete

3、置位事件组中指定的位:osEventFlagsSet

4、获取事件组中的一个或者多个事件发生标志:osEventFlagsWait

5、清除事件组中指定的位:osEventFlagsClear

四、代码

1、发送事件

    if(	HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_8)==0)
	{
		printf("key1 down!\n");
		
		//触发一个事件1
		osEventFlagsSet(myEvent01Handle,KEY1_EVENT);
	}
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)==0)
	{
		printf("key2 down!\n");
			
		//触发一个事件2
	    osEventFlagsSet(myEvent01Handle,KEY2_EVENT);
	}

2、接收事件

    uint32_t event=osEventFlagsWait(myEvent01Handle,
			KEY1_EVENT|KEY2_EVENT,osFlagsWaitAll,osWaitForever);
		
	if((event&(KEY1_EVENT|KEY2_EVENT))==(KEY1_EVENT|KEY2_EVENT))
	{
		printf("key1 and key2 down\n");
	}

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

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

相关文章

C语言源代码系列-管理系统之机房机位预定系统

往期文章分享点击跳转>《导航贴》- Unity手册,系统实战学习点击跳转>《导航贴》- Android手册,重温移动开发 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过…

华为电量分段图表实现过程

以前一直是改的MPAndroidChart,但最近看到华为手机的电池图表发现一旦设计不符合常规图表逻辑实现起来就很困难, 考虑过path相减(areaPath.op(-,- Path.Op.DIFFERENCE))、图像混合(paint.setXfermode)、裁剪区域(clipR…

学生HTML个人网页作业作品下载 动漫主题网页设计制作 大学生个人网站作业模板 dreamweaver简单个人网页制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

vue3面试题

文章目录一、vue3有了解过吗?能说说跟vue2的区别吗?1.vue3介绍2.vue3的新特性:2.1速度更快2.2体积更小2.3更易维护2.4更好的Typescript支持2.5编译器重写2.6更接近原生2.7更易使用3.vue3新增特性framentsTeleportcreateRenderercomposition A…

JVM区域划分

概述 JVM在运行代码时,他使用多块内存空间,不同的内存空间用来放不同的数据,然后配合代码流程,让系统运行起来。 存放类加载信息 举个最简单的例子,比如现在知道了JVM会加载类到内存里来供后续运行,所以…

java后端web前端10套项目开发案例源码,毕设,期末作业

项目包括 基础的html,css,js,jquery期末作业项目,毕设 1.古风诗意主题的背单词项目 2.模仿考虫软件实现的考拉背单词网页 3.模仿不背单词软件实现的背单词项目 html,css,js,jquery,瀑布流,懒加载的前端毕设 仿京东网站实现的前端平台 java基础作业 1.纯后端学生管…

初识Nodejs -- nodejs简介

视频链接:黑马程序员Node.js全套入门教程 文章目录1. 初识Nodejs1.1 思考为什么JavaScript可以在浏览器中被执行为什么JavaScript可以操作DOM和BOM?浏览器中的JavaScript运行环境1.2 Nodejs简介1.2.1 Nodejs中的JavaScript运行环境1.2.2 Node.js可以做什…

元数据管理-解决方案调研三:元数据管理解决方案——开源解决方案

开源解决方案 3.1、Apache Atlas Atlas 是一组可扩展和可扩展的核心基础治理服务——使企业能够有效和高效地满足其在 Hadoop 中的合规性要求,并允许与整个企业数据生态系统集成。 Apache Atlas 为组织提供开放的元数据管理和治理功能,以构建其数据资产…

没有公网IP,怎么远程访问ERP/NAS?

当前,国内疫情形势不容乐观,企业的经营发展再一次面临巨大挑战。虽然“远程办公”早已不是新鲜词,但依然有大量企业没有做好随时切换到远程办公的准备。如遇疫情风险,企业运营很容易陷入瘫痪。 企业一般在内网部署服务器、视频监…

2分钟看懂OA与ERP

ERP (Enterprise Resource Planning)即企业资源计划,最早是一种供应链的管理思想。它汇合了商贸代理行业的各项特点,旨在协调企业各管理部门围绕市场导向,更加灵活或柔性地开展业务活动,实时地响应市场需求。 从功能来看&#xf…

AVL树左旋转算法思路与图解

AVL树左旋转算法思路与图解 对于数列{4, 3, 6, 5, 7, 8}, 当我们插入8的时候, rightHeight() - leftHeight() > 1成立(也就是当前AVL树中的根节点的BF(平衡因子)> 1了), 此时这个AVL树已经不再是平衡的了, 也就是已经不是一个AVL树了, 所以我们要经过处理之后让其重新平…

【C】输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数

C语言没有字符串形式&#xff0c;所以可以用 char[] 数组来代替&#xff0c;但需要指定分配空间&#xff0c;所以可以采用单字符读取的形式&#xff1a; #include<stdio.h> int main(){char ch;int space0,number0,character0,other0;chgetchar(); …

WSO2安装使用的全过程详解

WSO2安装使用的全过程详解1. Install1.1 Docker Install 1.2 Uninstall2. User Guide3. Big Data -- Postgres4. Awakening1. Install 1.1 Docker Install 显示镜像 docker images/docker image ls拉去镜像/版本 docker pull wso2/wso2am 1.2 Uninstall 查看正在运行的容器 d…

流体动力润滑(轴承油膜承载机理)

目录 1.流体动力润滑 2.流体动力润滑的应用&#xff1a;楔形效应承载机理 3.承载量的计算 4.轴承动压油膜 1.流体动力润滑 定义&#xff1a;两个相对运动物体的摩擦表面&#xff0c;用于借助相对速度而产生的黏性流体膜将两摩擦面完全隔离开&#xff0c;由流体膜产生的压力…

那些下载不了的视频,Python只用1行代码就能直接下载

前言 现在有很多网站都并不支持直接下载的&#xff0c;例如我们常去的B站里面的视频&#xff0c;在页面是没有下载按钮的&#xff0c;还有的视频需要我们下载客户端才能下载…虽然这并不能拦住多少人&#xff0c;有些聪明的小伙伴就会去下载一些第三方软件去下载&#xff0c;比…

apache-atlas-hbase-bridge-源码分析

元数据类型 Hbase元数据类型, 包括命令空间、表、列族、列 public enum HBaseDataTypes {// ClassesHBASE_NAMESPACE,HBASE_TABLE,HBASE_COLUMN_FAMILY,HBASE_COLUMN;public String getName() {return name().toLowerCase();} }Hbase元数据采集实现 1&#xff09;批量采集HBa…

MyBatis基于XML的使用——缓存

1、介绍 MyBatis 内置了一个强大的事务性查询缓存机制&#xff0c;它可以非常方便地 配置和定制。 为了使它更加强大而且易于配置&#xff0c;我们对 MyBatis 3 中的缓存实现进行了许多改进。 默认情况下&#xff0c;只启用了本地的会话缓存&#xff0c;它仅仅对一个会话中的数…

【Java】异常处理

异常本质上是程序上的错误&#xff0c;包括程序逻辑错误和系统错误。比如使用空的引用、数组下标越界、内存溢出错误等. 错误在我们编写程序的过程中会经常发生&#xff0c;包括编译期间和运行期间的错误&#xff0c;在编译期间出现的错误有编译器帮助我们一起修正&#xff0c;…

使用java代码向mysql数据库插入100万条数据

使用java代码向mysql数据库插入100万条数据 使用springboot集成Mysql数据库&#xff0c;并使用java代码循环向msql数据库插入100万条数据&#xff0c;并测试插入时间 目录结构使用java代码向mysql数据库插入100万条数据一、使用工具二、项目结构图创建springboot项目启动类创建…

高并发-防止雪崩与穿透

一、DB查询前加锁 /** * 本地堆内缓存&#xff0c;优先级最高 */ ON_HEAP(1), /** * 本地堆外缓存&#xff0c;不影响GC&#xff0c;可以管理比堆内缓存更多的数据 * 数据get/set涉及序列化&#xff0c;性能次于本地堆内缓存 */ OFF_HE…