FreeRTOS-事件标志组

FreeRTOS-事件标志组

  • 一、事件标志组简介
  • 二、事件标志组API函数
  • 三、事件标志组实验

一、事件标志组简介

  • 事件标志位:用一个位来表示事件是否发生,裸机中的中断标志位等等
  • 事件标志组:是一组事件标志位的集合,简单认为就是一个整数
  • 事件标志组特点:它每一个位表示一个事件(高8位不算)。每一位事件的含义由用户自己决定(1表示发生,0表示未发生)。任意任务中断都可以读写这些位。可以等待某一位成立或者等待多位同时成立
  • 事件标志组的32位标志位,其中的高8位用来存储事件标志组的控制信息,低24位用作存储事件标志,一个事件组最多可以存储24个事件标志,位23表示事件标志23等以此类推

二、事件标志组API函数

  • 下面是事件标志组相关的API函数
xEventGroupCreate();//动态方式创建事件标志组
xEventGroupCreateStatic();//静态方式创建事件标志组
xEventGroupClearBits();//清零事件标志位
xEventGroupClearBitsFromISR();//在中断中清零事件标志位
xEventGroupSetBits();//设置事件标志位
xEventGroupSetBitsFromISR();//在中断中设置事件标志位
xEventGroupWaitBits();//等待事件标志位
xEventGroupSync();//设置并等待事件标志位
  • 动态创建事件标志组
EventGroupHandle_t xEventGroupCreate(void)
//返回值判断是否创建成功
  • 清除事件标志位
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToClear)
//形参:待操作的事件标志组句柄 待清零的事件标志位
//返回值:清零事件标志位前事件组中事件标志位的值
  • 设置事件标志位
EventBits_t xEventGroupSetBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet)
//形参:待操作的事件标志组句柄 待设置的事件标志位
//返回值:事件组中事件标志位值
  • 等待事件标志位
  • 可以等待某一位,也可以等待多位,
EventBits_t xEventGroupWaitBits(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForALLBits,TickType_t xTicksToWait)
//形参:等待的事件标志组句柄 等待的事件标志位 
//成功等待到事件标志位后,清除事件组中对应的事件标志位 
//等待uxBitsToWaitFor中所有的事件标志位 等待阻塞时间
//返回值:判断等待是否成功
  • 设置其中某一个标志位后,并等待其他标志位也置1—同步
EventBits_t xEventGroupSync(EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait)
//形参:等待事件标志位所在事件组 达到同步点后,要设置的事件标志位 
//等待的事件标志 等待阻塞时间
//返回值:等待是否成功

三、事件标志组实验

  • 实验设计:设计三个任务,start_task:创建task1和task2,并创建事件标志组。task1:按键扫描,不同按键值将事件标志组相应事件置1。task2:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理
#define configSUPPORT_DYNAMIC_ALLOCATION					1//动态创建任务/信号量宏定义配置//start_task参数宏定义
#define	START_TASK_STACK_SIZE 								128//堆栈大小
#define	START_TASK_PRIO										1//任务优先级
TaskHandle_t	start_task_handle;							//任务句柄
//task1参数宏定义
#define	TASK1_STACK_SIZE 									128//堆栈大小
#define	TASK1_PRIO											2//任务优先级
TaskHandle_t	task1_handle;								//任务句柄
//task2参数宏定义
#define	TASK2_STACK_SIZE 									128//堆栈大小
#define	TASK2_PRIO											3//任务优先级
TaskHandle_t	task2_handle;								//任务句柄//task1任务函数:按键扫描,不同按键值将事件标志组相应事件置1
void task1( void * pvParameters )
{uint8_t KeyNum = 0;while(1){KeyNum = Key_GetNum();if(KeyNum == 1)//key1按下,Bit0置1{xEventGroupSetBits(eventgroup_handle,0x01);//将事件标志组的Bit0置1}else if(KeyNum == 2)//Key2按下,Bit1置1{xEventGroupSetBits(eventgroup_handle,0x02);//将事件标志组的Bit1置1}vTaskDelay(10);//自带延时函数}
}
//task2任务函数:同时等待事件标志组中的多个事件位,当这些事件位都置1的话就执行相应的处理
void task2( void * pvParameters )
{while(1){xEventGroupWaitBits(eventgroup_handle,0x01|0x02,pdTRUE,pdTRUE,portMAX_DELAY);//等待Bit0和Bit1标志位都为1}
}
EventGroupHandle_t eventgroup_handle;//事件标志组句柄
//Start_task任务函数:创建task1、task2和事件标志组
void Start_task( void * pvParameters )
{taskENTER_CRITICAL();//进入临界区//创建事件标志组eventgroup_handle = xEventGroupCreate();//创建任务1xTaskCreate(task1,//任务函数"task1",//任务名称TASK1_STACK_SIZE,//堆栈大小/字NULL,//入口参数没有TASK1_PRIO,//优先级&task1_handle//任务句柄);//创建任务2xTaskCreate(task2,//任务函数"task2",//任务名称TASK2_STACK_SIZE,//堆栈大小/字NULL,//入口参数没有TASK2_PRIO,//优先级&task2_handle//句柄);vTaskDelete(start_task_handle);//删除自身任务Start_task,start_task_handle或NULL都可以taskEXIT_CRITICAL();//退出临界区
}void freertos_demo()
{xTaskCreate(Start_task,//任务函数"Start_task",//任务名称START_TASK_STACK_SIZE,//堆栈大小/字NULL,//入口参数没有START_TASK_PRIO,//优先级&start_task_handle//句柄);//创建Start任务vTaskStartScheduler();//开启任务调度器,开启执行Start任务,创建task123
}

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

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

相关文章

Java_Se 容器2(Set 接口)

Set接口继承自Collection接口,Set接口中没有新增方法,它和Collection接口保持完全一致。我们在前面学习List接口的使用方式,在Set中仍然适用。因此,学习Set的使用将没有任何难度。Set接口特点Set特点:无序、不可重复。…

国庆作业

day1 1.开发环境 Linux系统GCCFDBmakefilesqlite3 2.功能描述 项目功能: 服务器:处理客户端的请求,并将数据存入数据库中,客户端请求的数据从数据库进行获取,服务器转发给客户端。 用户客户端:实现账号的注册、登…

C++:string (用法篇)

文章目录 前言一、string 是什么?二、C语法补充1. auto2. 范围for 三、string类对象的常见构造1. Construct string object2. String destructor3. operator 四、string迭代器相关1. begin与end1)begin2)end3)使用 2. rbegin 与 r…

计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

数据处理方式,线程与进程,多任务,Spark与MR的区别

目录 数据处理的方式有哪些 单机数据处理 集群数据处理 分布式计算框架 MapReduce ApplicationMaster Spark分布式计算类别 进程与线程的区别 进程是计算时分配资源的最小单位 线程是执行计算任务的最小任务 多进程的执行效率没有多线程的执行效率高 多任务 Spark和M…

厂商资源分享网站

新华三(H3C)是一家中国知名的网络设备供应商,提供网络设备、网络解决方案和云计算服务。公司成立于2003年,是华为公司和惠普公司合资的企业,总部位于中国深圳。 华为(Huawei)是一家全球知名的电…

一个技巧实现在SharePoint中使用Copilot

前几天写了在onedrive中使用copilot对单个文件进行提问汇总分析与对多个文件进行比较汇总提问等: Copilot重磅更新!OneDrive全新功能炸裂 很多小伙伴表示特别受用。 于是他们在纷纷尝试了一段时间后,开始把目光转向SharePoint和teams文件&a…

前端的全栈混合之路Meteor篇:分布式数据协议DDP深度剖析

本文属于进阶篇,并不是太适合新人阅读,但纯粹的学习还是可以的,因为后续会实现很多个ddp的版本用于web端、nodejs端、安卓端和ios端,提前预习和复习下。ddp协议是一个C/S架构的协议,但是客户端也同时可以是服务端。 什…

红日靶场1学习笔记

一、准备工作 1、靶场搭建 靶场地址 靶场描述 靶场拓扑图 其他相关靶场搭建详情见靶场地址相关说明 2、靶场相关主机信息 后续打靶场的过程中,如果不是短时间内完成,可能ip会有变化 主机ip密码角色win7192.168.122.131hongrisec2019!边界服务器win…

Linux学习笔记(七):磁盘的挂载与扩展

Linux学习笔记(七):磁盘的挂载与扩展 在虚拟机环境中,当我们的存储空间不足时,添加一块新的硬盘显得尤为重要。 1. 新增磁盘 首先,你需要确保有一块物理磁盘或虚拟磁盘。在虚拟机管理器中,你可以…

PostgreSQL学习笔记二:PostgreSQL的系统架构

PostgreSQL 是一种功能强大的开源关系型数据库管理系统,其架构具有以下特点: 一、客户端/服务器架构 客户端 客户端可以是各种应用程序,如 Web 应用、桌面应用等,它们通过网络连接与 PostgreSQL 服务器进行通信。客户端使用标准的…

HTML图形

HTML图形 1. HTML5 Canvas2.HTML5 内联 SVG3.HTML 5 Canvas vs. SVG 1. HTML5 Canvas HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域,您可以控制其每一像素。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。 1、创建…

【pytorch】pytorch入门5:最大池化层(Pooling layers )

文章目录 前言一、定义概念 缩写二、参数三、最大池化操作四、使用步骤总结参考文献 前言 使用 B站小土堆课程 一、定义概念 缩写 池化(Pooling)是深度学习中常用的一种操作,用于降低卷积神经网络(CNN)或循环神经网…

微知-如何临时设置Linux系统时间?(date -s “2024-10-08 22:55:00“, time, hwclock, timedatectl)

背景 在tar解压包的时候经常出现时间不对,可以临时用date命令修改一下,也可以其他,本文主要介绍临时修改的方法 date命令修改 sudo date -s "2024-10-08 22:55:00"其他查看和修改的命令 本文只记录查看方式,修改的暂…

详解正确创建好SpringBoot项目后但是找不到Maven的问题

目录 问题 解决步骤: 找到File->Project Structure... 设置SDK 设置SDKs 问题 刚刚在使用IDEA专业版创建好SpringBoot项目后,发现上方导航栏的运行按钮是灰色的,而且左侧导航栏的pom.xml的图标颜色也不是正常的,与此同时我…

SpringBoot Jar 包加密防止反编译

今天看到了一个说明jar包加密的实现方式,特意试了下效果,并下载了插件源码及实现源码查看了下子,感兴趣的可以在最后得到gitee地址。 SpringBoot 程序 Jar 包加密的方式,通过代码加密可以实现无法反编译。应用场景就是当需要把公司…

Linux防火墙-案例(二)snatdnat

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令,我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…

脑机接口技术的未来与现状:Neuralink、机械手臂与视觉假体的突破

近年来,脑机接口(BCI)技术发展迅速,不仅限于科幻小说和电影,已经逐步进入现实应用。特别是马斯克的Neuralink公司推出的“盲视(Blindsight)”设备,最近获得了FDA的突破性设备认定&am…

Spring Boot:打造下一代医院管理系统

3系统分析 3.1可行性分析 通过对本医院管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本医院管理系统采用JAVA作为开发语言,Spring Boot框…

动态规划算法题目练习——62.不同路径

1.题目解析 题目来源:62.不同路径——力扣 测试用例 2.算法原理 1.状态表示 这时由于避免越界初始化所以将左上角置为虚拟位置,创建一个二维dp表用来存储到当前为止的所有路径 2.状态转移方程 以dp[i,j]为例,起点到该位置的路径是起点到其上…