当前位置: 首页 > 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…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...