RT-Thread事件集

文章目录

  • 前言
  • 一、RT-Thread事件集的概念
  • 二、事件集函数的使用
    • 1.创建事件集函数
    • 2.事件集发送函数
    • 3.事件集接收函数
    • 4.事件集删除函数
  • 三、事件集使用例程
  • 总结


前言

本篇文章将给大家讲解RT-Thread中事件集的概念,了解什么是事件集及事件集的函数使用方法。

一、RT-Thread事件集的概念

事件集是一种用于线程间通信的同步对象,它通常用于实现线程之间的事件触发、通知和等待。在RT-Thread中,事件集是由struct rt_event结构体表示的,该结构体定义在rtthread.h头文件中。事件集可以包含多个事件标志位,每个标志位可以表示一个事件。事件集的操作包括设置事件、清除事件、等待事件以及获取事件等。

在这里插入图片描述
每个线程都有一个 rt_thread 结构体,它里面有如下 2 个成员:

struct rt_thread
{......
##if defined(RT_USING_EVENT)/* thread event */rt_uint32_t event_set;rt_uint8_t event_info;
##endif......
}

这两个成员的作用如下:

event_set:想等待哪些事件?
可以设置对应的位,比如设置为(1<<30) | (1<<0)表示等待事件 0、事件 30那么,它想等待事件 0、事件 30 都发生呢,还是只要事件 0、事件 30 任意一个发生即可?需要使用 event_info 进一步描述

event_info:有 3 种取值
RT_EVENT_FLAG_AND:逻辑与,比如事件 0、事件 30 都发生时,才满足它的期待RT_EVENT_FLAG_OR:逻辑或,比如事件 0、事件 30 发生了任何一个,都满足它的期待 RT_EVENT_FLAG_CLEAR:等到期待的事件后,是否清除事件

二、事件集函数的使用

1.创建事件集函数

rt_event_t rt_event_create(const char name, rt_uint8_t flag)

功能:创建一个事件集。

参数:
const char* name:事件集的名称,用于标识该事件集。
rt_uint8_t flag:事件集的初始标志位,用于指定初始的事件状态。

返回值:返回一个rt_event_t类型的事件集对象,如果创建失败则返回RT_NULL。

说明:该函数用于创建一个事件集对象,并返回该对象的句柄。可以使用该句柄对事件集进行操作,如设置事件、清除事件等。

rt_err_t rt_event_init(rt_event_t event, const char name, rt_uint8_t flag)

功能:初始化一个已经存在的事件集。

参数:
rt_event_t event:要初始化的事件集对象。
const char* name:事件集的名称,用于标识该事件集。
rt_uint8_t flag:事件集的初始标志位,用于指定初始的事件状态。

返回值:初始化成功返回RT_EOK,否则返回相应的错误码。
说明:该函数用于初始化一个已经存在的事件集对象,可以重新设置事件集的名称和初始状态。

2.事件集发送函数

rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set):

功能:设置事件集的事件标志位。
参数:

rt_event_t event:要操作的事件集对象。

rt_uint32_t set:要设置的事件标志位,可以设置多个事件。

返回值:设置成功返回RT_EOK,否则返回相应的错误码。
说明:该函数用于设置事件集的事件标志位,表示某些事件已经发生。

3.事件集接收函数

rt_err_t rt_event_recv(rt_event_t event, rt_uint32_t set, rt_uint8_t option, rt_int32_t timeout, rt_uint32_t recved)**:

功能:等待事件集的事件发生。
参数:

rt_event_t event:要等待的事件集对象。

rt_uint32_t set:指定要等待的事件标志位,可以等待多个事件。

rt_uint8_t option:等待选项,例如等待所有指定的事件发生还是只要有一个事件发生。

rt_int32_t timeout:超时时间,单位为毫秒,若为RT_WAITING_FOREVER则表示永久等待,若为RT_WAITING_NO则表示不等待。

rt_uint32_t* recved:指向一个变量的指针,用于存储实际接收到的事件标志位。

返回值:等待成功返回RT_EOK,否则返回相应的错误码。

说明:该函数用于等待事件集中指定的事件标志位发生,如果指定的事件发生,则将实际接收到的事件标志位存储在recved参数中。

4.事件集删除函数

rt_err_t rt_event_delete(rt_event_t event):

功能:删除一个事件集。
参数:

rt_event_t event:要删除的事件集对象。

返回值:删除成功返回RT_EOK,否则返回相应的错误码。

说明:该函数用于删除一个事件集对象,释放相关资源。

rt_err_t rt_event_detach(rt_event_t event):

功能:解绑一个事件集,不再使用它。
参数:

rt_event_t event:要解绑的事件集对象。

返回值:解绑成功返回RT_EOK,否则返回相应的错误码。

说明:该函数用于解绑一个事件集对象,但不会删除它,可以用于释放对事件集的引用而不影响其状态。

三、事件集使用例程

#include <stdio.h>
#include <rtthread.h>#define EVENT_A (1 << 0)
#define EVENT_B (1 << 1)int main(void) {// 创建一个事件集rt_event_t event = rt_event_create("my_event", RT_IPC_FLAG_PRIO);if (event == RT_NULL) {printf("Failed to create event\n");return -1;}// 设置事件Art_event_send(event, EVENT_A);printf("Event A has occurred\n");// 设置事件Brt_event_send(event, EVENT_B);printf("Event B has occurred\n");// 等待事件A和事件B同时发生rt_uint32_t recved = 0;rt_err_t result = rt_event_recv(event, EVENT_A | EVENT_B, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &recved);if (result == RT_EOK) {printf("Both event A and event B have occurred\n");} else {printf("Failed to wait for events\n");}// 等待事件A发生result = rt_event_recv(event, EVENT_A, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITING_FOREVER, &recved);if (result == RT_EOK) {printf("Event A has occurred\n");} else {printf("Failed to wait for event A\n");}// 删除事件集rt_event_delete(event);return 0;
}

总结

本篇文章主要就是讲解了事件集大家可以对比和FreeRTOS中的事件集,并且自己写代码进行实践。

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

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

相关文章

Lesson5--二叉树(超详细版)

【本节目标】 1. 树概念及结构 2. 二叉树概念及结构 3. 二叉树顺序结构及实现 4. 二叉树链式结构及实现 1.树概念及结构 1.1树的概念 树是一种 非线性&#xff08;线性结构就是顺序表链表&#xff09; 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个…

Linux 第三十章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

ms17-010(永恒之蓝)

1.漏洞介绍: 永恒之蓝&#xff08;ms17-010&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子通过改造“永恒之蓝”制作了wannacry勒索病…

国际护士节庆祝活动向媒体投稿有方法很轻松

作为一名医院职工,我肩负着医院对外信息宣传的重任。在国际护士节这个特殊的日子里,我们医院举办了一系列庆祝活动,以表彰护士们的辛勤付出和无私奉献。然而,在将这些活动信息投稿至媒体的过程中,我最初却遭遇了诸多挑战。 起初,我采用传统的邮箱投稿方式,将精心撰写的稿件发送…

RabbitMq出现Not management user问题解决

在RabbitMq登录的时候突然弹出如下图&#xff1a; 提示“当前用户不是管理员用户”进入mq控制命令台下&#xff1a; windows版本在mq安装路径下的sbin下进入cmd弹出框&#xff1b; Linux版本没有测试&#xff1b; 输入以下命令&#xff1a; rabbitmqctl list_users 查询当…

栈与队列OJ题【括号适配问题】【用队列实现栈】【用栈实现队列】【设计循环队列】

一.有效的括号 ​​​OJ链接 这一道题我们就可以用栈来解决&#xff1a; 不了解栈的可以看我的上一篇博客。 typedef char STDataType; //用数组来实现栈 typedef struct stack {STDataType* a;int capacity;int top; }ST; void STInit(ST* pst) {assert(pst);pst->a NU…

内网环境安装使用DBeaver使用第一天

之前一直使用navicat&#xff0c;现在出于某种原因不让使用了&#xff0c;于是上手了这个工具&#xff0c;说实话&#xff0c;真的&#xff0c;但是必须要用。 首先安装的时候&#xff0c;必须要选择MySQL驱动&#xff0c;如果外网直接选择以后就可以下载了&#xff0c;内网需…

字符串函数(一):strcpy(拷贝),strcat(追加),strcmp(比较),及strncpy,strncat,strncmp

字符串函数 一.strcpy&#xff08;字符串拷贝&#xff09;1.函数使用2.模拟实现 二.strcat&#xff08;字符串追加&#xff09;1.函数使用2.模拟实现 三.strcmp&#xff08;字符串比较&#xff09;1.函数使用2.模拟实现 四.strncpy1.函数使用2.模拟实现 五.strncat1.函数使用2.…

采油厂职工向媒体投稿的好方法找到了

作为一名采油厂的职工,我深知在媒体上定期投稿的重要性。这不仅是我们展示工作成果、传播企业文化的重要途径,更是上级考核我们工作表现的一项指标。然而,在投稿的过程中,我经历了不少心酸与困扰。 起初,我采用传统的邮箱投稿方式。每天,我都会花费大量时间在网络上搜索合适的媒…

Linux----正则表达式练习题题解

1、 显示/etc/rc.d/rc.sysinit文件中以不区分大小的h开头的行&#xff1b; [rootopenEuler ~]# grep -E "^(H|h)" /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt 注&#xff1a;当然也可以使用grep -i来实现&#xff0c;这里我换了一个文件&#xff08;/etc/passw…

基于SPWM控制策略的二极管钳位型的五电平逆变器simulink仿真

本人搭建了二极管钳位型五电平逆变器simulink仿真模型&#xff0c;SPWM采用层叠&#xff0c;输出线电压9电平&#xff0c;相电 压5电平&#xff0c;滤波后对称三相电压、电流&#xff0c;THD<5%&#xff0c;效果十分优越&#xff0c;适合新手学习使用。 模型获取链接&…

使用apache和htaccess对目录访问设置密码保护配置教程

对目录设置密码保护配置说明 我们有时候访问某些网站的时候&#xff0c;要求输入用户名和密码才能访问。这是为了保护隐私&#xff0c;只让经过许可的人访问。 在本教程中主要介绍两种方法&#xff0c;一种是通过apache httpd.conf配置文件对管理后台目录设置密码保护&#xff…

252 基于MATLAB的自适应差分阈值法检测心电信号的QRS波

基于MATLAB的自适应差分阈值法检测心电信号的QRS波&#xff0c;QRS波群反映左、右心室除极电位和时间的变化&#xff0c;第一个向下的波为Q波&#xff0c;向上的波为R波&#xff0c;接着向下的波是S波。通过GUI进行数据处理&#xff0c;展示心率和QRS。程序已调通&#xff0c;可…

Mysql数据类型设计思考

一、Mysql数据类型设计规范 1.1 选择更小的数据类型 一般情况下&#xff0c;在满足存储要求的基础上&#xff0c;尽量选择小的存储类型。例如&#xff1a;存储0~200&#xff0c;tinyint和bigint都可以存储&#xff0c;那么选择tinyint。原因&#xff1a;越小的数据类型运算速…

迄今为止最全- 前端性能优化

简介 当我们说前端性能优化的时候&#xff0c;指的可能是不同场景的性能优化。前端涉及性能优化的场景主要有&#xff1a; 项目构建性能优化 页面性能优化 加载时性能优化 运行时性能优化 构建性能主要指构建速度&#xff0c;优化方法和打包工具直接相关&#xff0c;主要…

高效管理文件技巧:一键利用文件大小,轻松移动到指定文件夹

在日常生活和工作中&#xff0c;我们经常需要管理大量的文件&#xff0c;包括文档、图片、视频等各种类型。然而&#xff0c;手动分类和移动这些文件往往是一项繁琐且耗时的任务。为了提高文件管理的效率&#xff0c;我们可以采用一些高效的管理技巧&#xff0c;比如利用文件大…

GBase 8s 数据库集群切换及恢复

GBase 8s 数据库切换分为自动切换、由CM控制的按FOC规则的切换、手工切换。 自动切换 全自动切换用于HAC集群中&#xff0c;由于集群只有两个节点&#xff0c;数据库相互之前进行状态检查&#xff0c;发现异常时&#xff0c;能按DRAUTO的配置方式进行自动切换。 在HAC集群中&…

3.整数运算

系列文章目录 信息的表示和处理 : Information Storage&#xff08;信息存储&#xff09;Integer Representation&#xff08;整数表示&#xff09;Integer Arithmetic&#xff08;整数运算&#xff09;Floating Point&#xff08;浮点数&#xff09; 文章目录 系列文章目录前…

基于Echarts的大数据可视化模板:服务器运营监控

目录 引言背景介绍研究现状与相关工作服务器运营监控技术综述服务器运营监控概述监控指标与数据采集可视化界面设计与实现数据存储与查询优化Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性…

Android:资源的管理,Glide图片加载框架的使用

目录 一&#xff0c;Android资源分类 1.使用res目录下的资源 res目录下资源的使用&#xff1a; 2.使用assets目录下的资源 assets目录下的资源的使用&#xff1a; 二&#xff0c;glide图片加载框架 1.glide简介 2.下载和设置 3.基本用法 4.占位符&#xff08;Placehold…