当前位置: 首页 > news >正文

FreeRTOS入门(05):事件组

文章目录

  • 目的
  • 基础说明
  • 相关函数
  • 使用演示
  • 总结

目的

事件组是RTOS中相对常用的用于任务间交互的功能,这篇文章将对相关内容做个介绍。

本文代码测试环境见前面的文章:《FreeRTOS入门(01):基础说明与使用演示》

基础说明

事件组(EventGroup)和单片机硬件的事件或者中断有点像,每个事件组对象就是一个变量(寄存器)。如果 configUSE_16_BIT_TICKS 值为 0 这就是一个32位的变量,为 1 就是一个16位的变量。

事件组对象的高8位供FreeRTOS内部使用,剩余位供用户使用。每一个位(bit)表示一个事件发送,通常该位值为 0 ,表示未发生事件;值为 1 表示发生了事件。

事件组事件在设置的时候可以设置某一位,也可以同时设置某些位。等待事件的任务可以等待某一位有效,也可以等到某些位同时有效。事件被设置后会唤醒所有符合条件的任务(可以用作广播功能)。被唤醒的事件可以选择是否清除事件标志位。

相关函数

// 创建并返回事件组句柄
EventGroupHandle_t xEventGroupCreate( void )// 删除事件组
// 在被删除的事件组上阻塞的任务将被取消阻塞,并且报告事件组值为0
void vEventGroupDelete( EventGroupHandle_t xEventGroup )// 获取事件组中某个或某些位,如果不可用则阻塞
// uxBitsToWaitFor表示要等待的标志位(可以设置多个位)
// xClearOnExit为pdTRUE时会在事件发生后清除所等待的标志位,为pdFALSE则不清除
// xWaitForAllBits为pdTRUE时需要等所有等待的标志位都设置后才会返回,为pdFALSE时任意一位设置均会返回
EventBits_t xEventGroupWaitBits( const EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToWaitFor,const BaseType_t xClearOnExit,const BaseType_t xWaitForAllBits,TickType_t xTicksToWait )// 设置标志位
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
// 清除标志位
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )// 事件组的设置与清除在中断中使用的版本,在中断中设置与清除事件组不会立即进行,而是会延时到后面的FreeRTOS守护进程中执行,所以可能需要设置下面才可使用
// INCLUDE_xEventGroupSetBitFromISR, configUSE_TIMERS, INCLUDE_xTimerPendFunctionCall, configUSE_TRACE_FACILITY
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken )
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )// 获取当前事件组状态
EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup )
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )// 同步设置(写和等待合并的功能)
// uxBitsToSet为要写的位,uxBitsToWaitFor为要等待的位
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,const EventBits_t uxBitsToSet,const EventBits_t uxBitsToWaitFor,TickType_t xTicksToWait );

使用演示

下面是个基础使用的演示:

#include "debug.h"
#include "FreeRTOS.h"     // 引入头文件
#include "task.h"         // 引入头文件
#include "event_groups.h" // 引入头文件EventGroupHandle_t xEventGroup; // 事件组句柄void task1(void *pvParameters) {while(1) {xEventGroupSetBits(xEventGroup, 0b0011); // bit1 bit0 写1vTaskDelete(NULL);}
}void task2(void *pvParameters) {while(1) {vTaskDelay(500);xEventGroupSetBits(xEventGroup, 0b0100); // bit2 写1vTaskDelete(NULL);}
}void task3(void *pvParameters) {while(1) {// 当 bit0 为1时触发,响应后不清除标志位EventBits_t uxBits = xEventGroupWaitBits(xEventGroup, 0b0001, pdFALSE, pdFALSE, portMAX_DELAY);printf("t3-%d\r\n", uxBits); // 打印事件触发时的标志位vTaskDelay(300);}
}void task4(void *pvParameters) {while(1) {// 当 bit3 bit2 均为0时触发,响应后清除标志位EventBits_t uxBits = xEventGroupWaitBits(xEventGroup, 0b0110, pdTRUE, pdTRUE, portMAX_DELAY);printf("t4-%d\r\n", uxBits); // 打印事件触发时的标志位printf("t4-%d\r\n", xEventGroupGetBits(xEventGroup)); // 打印当前标志位xEventGroupClearBits(xEventGroup, 0x0001); // 清除标志位printf("t4-%d\r\n", xEventGroupGetBits(xEventGroup)); // 打印当前标志位}
}int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);SystemCoreClockUpdate();Delay_Init();USART_Printf_Init(115200);xEventGroup = xEventGroupCreate(); //xTaskCreate(task1, "task1", 256, NULL, 5, NULL);xTaskCreate(task2, "task2", 256, NULL, 5, NULL);xTaskCreate(task3, "task3", 256, NULL, 5, NULL);xTaskCreate(task4, "task4", 256, NULL, 5, NULL);vTaskStartScheduler(); // 任务调度,任务将在这里根据情况开始运行,程序将在这里无序循环while(1) {} // 程序不会运行到这里
}// 时间                   任务         xEventGroup
// tick 0000         0b0000
// tick 0000  task1  0b0011
// tick 0001  task3  0b0011 // 打印输出
// tick 0301  task3  0b0011 // 打印输出
// tick 0500  task2  0b0111
// tick 0501  task4  0b0111 // 打印输出
// tick 0501  task4  0b0001 // 打印输出
// tick 0501  task4  0b0000 // 打印输出

在这里插入图片描述

下面是个同步方式演示:

#include "debug.h"
#include "FreeRTOS.h"     // 引入头文件
#include "task.h"         // 引入头文件
#include "event_groups.h" // 引入头文件EventGroupHandle_t xEventGroup; // 事件组句柄void task1(void *pvParameters) {while(1) {printf("t1s1-%d\r\n", xEventGroupGetBits(xEventGroup)); // 打印事件触发时的标志位EventBits_t uxBits = xEventGroupSync(xEventGroup, 0b0001, 0b0011, portMAX_DELAY); // 设置0b0001,等待0b0011printf("t1s2-%d\r\n", uxBits); // 打印事件触发时的标志位vTaskDelete(NULL);}
}void task2(void *pvParameters) {while(1) {vTaskDelay(500);printf("t2s1-%d\r\n", xEventGroupGetBits(xEventGroup)); // 打印事件触发时的标志位EventBits_t uxBits = xEventGroupSync(xEventGroup, 0b0010, 0b0011, portMAX_DELAY); // 设置0b0010,等待0b0011printf("t2s2-%d\r\n", uxBits); // 打印事件触发时的标志位vTaskDelete(NULL);}
}int main(void) {NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);SystemCoreClockUpdate();Delay_Init();USART_Printf_Init(115200);xEventGroup = xEventGroupCreate(); //xTaskCreate(task1, "task1", 256, NULL, 5, NULL);xTaskCreate(task2, "task2", 256, NULL, 5, NULL);vTaskStartScheduler(); // 任务调度,任务将在这里根据情况开始运行,程序将在这里无序循环while(1) {} // 程序不会运行到这里
}

在这里插入图片描述

总结

就像本文基础说明中介绍的那样,事件组和单片机硬件的事件或者中断有点像,理解了这点的话事件组使用上其实并不复杂的。

相关文章:

FreeRTOS入门(05):事件组

文章目录目的基础说明相关函数使用演示总结目的 事件组是RTOS中相对常用的用于任务间交互的功能,这篇文章将对相关内容做个介绍。 本文代码测试环境见前面的文章:《FreeRTOS入门(01):基础说明与使用演示》 基础说明…...

【API网关】Kong安装和基本操作

文章目录前言一、API网关选型和Kong的安装1. 什么是API网关2. API网关技术选型3. 安装postgresql和migrations4. 安装kong5. 安装konga二、基本的路由转发配置1. kong的8001、8000和1337端口号的关系2. 基本的路由转发配置3. kong集成consul实现服务发现和负载均衡4. kong配置j…...

git --- stash用法

1 git stash命令介绍 // 保存当前分支的修改,回到上个版本的状态 git stash // 保存当前分支的修改,回到上个版本的状态,msg是保存当前修改的说明 git stash save "msg" // 用来展示所有保存的列表 git stash list // 用来展示某一保存记录所修改的操作 gi…...

【星海出品】VScode安装配置

安装VScode最好在官方网站上下载。 例如 https://code.visualstudio.com/Download 不知道自己的windows版本的话,可以命令行WINR 运行 输入: systeminfo | find "OS" //获取OS的版本信息。 systeminfo | find "系统类型" //获取系统…...

docker 基础命令备忘录

1. 官方安装docker curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.shcurl -L "https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose chmod x…...

华为OD机试 - 创建二叉树(Java JS Python)

题目描述 请按下列描述构建一颗二叉树,并返回该树的根节点: 1、先创建值为-1的根结点,根节点在第0层; 2、然后根据operations依次添加节点: operations[i] = [height, index] 表示对第 height 层的第index 个节点node, 添加值为 i 的子节点: 若node 无「左子节点」,则…...

服务案例|基于IT事件管理,提升业务连续性

数字化经济时代,IT架构复杂性越来越高,业务连续性成为很多行业或企业最核心的任务。业务连续性管理是一个不断提升的过程,围绕事件“发现-响应-定位处理-降低发生”的事件处理思路,结合平台化运维,助力业务快速提升。 …...

你说下HashMap的工作原理?

我在网上看了很多文章 ,各种长篇大论 ,原理细节、实在看不下去了,所以着重讲一下,HashMap 面试会问到的点 说人话, 你们公司的集合 不会自研吧, 假如 你们叫 锤子科技 ,那老板也不会要求你去写一…...

k8s 配置ingress 并做一个demo

需求:k8s 配置好之后除了 nodeport 以外都是对集群内部的行为使用nodeport 并不是很友好,要自己处理很多的端口管理使用ingress 可以更好的整合配置服务进程:下载ingress-nginx 的yaml 文件https://github.com/kubernetes/ingress-nginx/blob…...

【手把手一起学习】(七) Altium Designer 20常用PCB设计规则

1 常用PCB设计规则 PCB规则设计是PCB设计中至关重要的环节,它约束了电气要求、布线方式、器件摆放位置等,为后续的手动布局、布线提供依据。完善的PCB规则设计,可以减少设计中的错误,提高PCB设计效率。 1.1 PCB设计规则管理器 …...

(01)Unity 中使用 HDRP

概述Unity在2019.2版本中推出HDRP(高清渲染管线),目的是为了提高图形质量,实现从照片写实到风格化的图像。先看一下官方对HDRP的概述:高清渲染管线 (HDRP) 是由 Unity 构建的高保真脚本化渲染管…...

使用cmake在win10编译yolov5+tensorRT+cuda+cudnn+protobuf代码进行混合编译

这里进行之前需要把protobuf在win10下编译,可以参考这篇文章从Linux下载下来的工程代码,这里建议直接使用vs系列打开不要用vscode打开,vscode对win下的cmake不友好,主要体现在报错机制无法直接定位,题主的环境是vs2022…...

《C++ Primer Plus》第17章:输入、输出和文件(7)

编程练习 编写一个程序计算输入流中第一个$之前的字符数目&#xff0c;并将$留在输入流中。 #include<iostream>int main() {int ct 0;while(std::cin.peek()!$){ct;std::cin.get();}std::cout << "num: " << ct << std::endl;return 0; }答…...

PGLBox 超大规模 GPU 端对端图学习训练框架正式发布

作者 | PGLBox项目组 导读 PGLBox是百度研发的基于GPU的大规模图模型训练框架&#xff0c;支持数百亿节点和边的图模型全GPU训练&#xff0c;已在百度广泛部署。相比业界主流的分布式 CPU 解决方案&#xff0c;PGLBox 具有超高性能、超大规模、算法丰富、灵活易用、落地广泛等优…...

sql-labs-Less1

靶场搭建好了&#xff0c;访问题目路径 http://127.0.0.1/sqli-labs-master/Less-1/ 我最开始在做sql-labs靶场的时候很迷茫&#xff0c;不知道最后到底要得到些什么&#xff0c;而现在我很清楚&#xff0c;sql注入可以获取数据库中的信息&#xff0c;而获取信息就是我们的目标…...

又一个国内类ChatGPT模型?【秘塔科技上线自研LLM大模型「对话写作猫」】

又一个国内类ChatGPT模型&#xff1f;【秘塔科技上线自研LLM大模型「对话写作猫」】 说个题外话&#xff0c;今天一大早就收到了Biying的邮件。前段时间不是申请了New Biying的内测吗&#xff1f;下午可以尝试一下玩一会儿。如果体验感还不错或者还有很多bug&#xff0c;那我到…...

卷麻了,00后测试用例写的比我还好,简直无地自容......

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 如何编写测试用例&#xff1f; 作为一个测试新人&#xff0c;刚开始接触测试&#xff0c;对于怎么写测试用例很是头疼&#xff0c;无法…...

动态网页的核心——JSP

文章目录1&#xff0c;JSP 概述2&#xff0c;JSP 小案例2.1 搭建环境2.2 导入 JSP 依赖2.3 创建 jsp 页面2.4 编写代码2.5 测试3&#xff0c;JSP 原理4&#xff0c;JSP 总结4.1 JSP的 缺点4.2技术的发展历程4.3JSP的必要性最后说一句1&#xff0c;JSP 概述 JSP&#xff08;全称…...

RK3588平台开发系列讲解(系统篇)init.d介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、Linux启动简介二、sysvinit配置三、inid.d介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇介绍init.d相关知识。 一、Linux启动简介 Linux用户空间启动时,第一个会启动init进程,用来引导启动其…...

taobao.user.buyer.get( 查询买家信息API )

&#xffe5;开放平台基础API必须用户授权 查询买家信息API&#xff0c;只能买家类应用调用。 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 响应参数 点击获取key和secret 请求示例 TaobaoClient client new…...

python学生信息管理系统

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;python学生信息 免费获取完整源码源文件配置教程说明等 在IDLE中运行《学生信息管理系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;有两种方…...

【微信小程序】-- WXML 模板语法 - 条件渲染 -- wx:if hidden (十一)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

2023上半年软考,广州/东莞/深圳/江苏报班是明智的选择

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…...

C++修炼之练气期一层——命名空间

目录 1.引例 2.命名空间的定义 3.命名空间的使用 4.命名空间使用注意事项 1.引例 #include <stdio.h> #include <stdlib.h>int rand 10;int main() {printf("%d\n", rand);return 0; } 当我们用C语言写下这样的代码&#xff0c;看着并没有什么语法…...

matplotlib综合学习

1.arange函数arange函数需要三个参数&#xff0c;分别为起始点、终止点、采样间隔。采样间隔默认值为1看例子&#xff1a; import numpy as np #import matplotlib.pyplot as plt xnp.arange(-5,5,1) print(x)2.绘制sin(x)曲线import numpy as np import matplotlib.pyplot as …...

IIS .Net Core 413错误和Request body too large解决办法

错误描述图片比较大时&#xff0c;在前端上传就报413错误。根本到不了后端。在网上看到这个文章比较有用。https://blog.csdn.net/wstever/article/details/1288707421、修改网站Web.config配置文件加入下面这段配置<?xmlversion"1.0" encoding"utf-8"…...

Spring Boot数据访问—(springboot 多数据源)—官方原版

Spring Boot 包含许多用于处理数据源的启动器&#xff0c;本文回答与执行此操作相关的问题。一、配置自定义数据源要配置自己的DataSource&#xff0c;请在配置中定义该类型的Bean。Spring Boot在任何需要的地方重用DataSource&#xff0c;包括数据库初始化。如果需要外部化某些…...

高燃!GitHub上标星75k+超牛的Java面试突击版

前言不论是校招还是社招都避免不了各种面试。笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的&#xff0c;我这个有章可循‘说的意思只是说应对技术面试是可以提前准备。运筹帷幄之后&#xff0c;决胜千里之外!不打毫无准备的仗,我觉得大…...

grid宫格布局新手快捷上手-f

前言 grid 网上有很多&#xff0c;但都是大而全的&#xff0c;感觉新人上手很吃力&#xff0c;本文仅以最快捷的方式进行介绍&#xff0c;如何使用grid宫格布局 本文是新人上手&#xff0c;若想了解更多grid布局&#xff0c;请阅读其他文章 使用 声明布局 display: grid;声…...

面试必刷101 Java题解 -- part 3

part1 – https://blog.csdn.net/qq_41080854/article/details/129204480 part2 – https://blog.csdn.net/qq_41080854/article/details/129224785 面试必刷101 Java题解 -- part 3动规五部曲71、斐波那契数列72、跳台阶73、最小花费爬楼梯74、最长公共子序列(二)75、最长公共…...

网站点击弹出下载框 怎么做/软文写手接单平台

2019独角兽企业重金招聘Python工程师标准>>> es:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/distributed-cluster.html 下一篇&#xff1a;http://my.oschina.net/qiangzigege/blog/264127 内容&#xff1a; Elasticsearch的目标是可用…...

泗洪有做网站/酒店营销推广方案

php实现mysql同步的实现方法拿到需求之后&#xff0c;发现这两个网站的MYSQL数据库都不能远程访问(安全第一吧)。于是想起了 平时使用的CSV文件批量录入数据。于是尝试使用CSV导入导出。导入到处框架如下&#xff1a;1首先将数据导出成CSV的格式。建立一文件&#xff0c;放置在…...

wordpress 用户密码/最近国际新闻大事20条

如果一张图片的比例是 4比1 &#xff0c;在不设置固定宽高的时候&#xff0c;如何实现&#xff1f;页面结构class"swiper-img"src"http://mp-piao-admincp.qunarzz.com/mp_piao_admin_mp_piao_admin/admin/20199/3ff47fa622d07edad492c2859a5ad32f.jpg_750x200_…...

山西免费网站制作/济南市最新消息

今天练习MS SQL Server逆透视的功能。首先准备一些可以逆透视的数据&#xff1a;IF OBJECT_ID(tempdb.dbo.#Part_summary) IS NOT NULL DROP TABLE #Part_summaryCREATE TABLE #Part_summary ([Item] NVARCHAR(40),[B]DECIMAL(18,2),[Q]DECIMAL(18,2),[S]DECIMAL(18,2),[T]DECI…...

南昌电商网站设计/提高工作效率心得体会

您可以使用StringDecoder从HttpRequest中的“List of Int”转换为“String”.因为无论你发送json,纯文本还是png,Dart总是以数据的形式发送数据“服务器列表”到服务器.另一种方法是使用在Heroku Steam上测试的Streams(http://www.dartlang.org/articles/feet-wet-streams/)v0.…...

购物网站开发的背景与意义/seo研究中心qq群

hdfs中使用的是hadoop用户&#xff0c;但是有些脚本任务是在root中执行的&#xff0c;这个时候可以使用sudo -u hadoop切换用户执行hadoop命令&#xff0c;但是会提示如下&#xff1a; [rootxxx qingfeng]# sudo -u hadoop hadoop fs -rmr /user/hive/warehouse/xxxxx.db sudo…...