RT-Thread事件集

news2024/11/27 12:40:47

文章目录

  • 前言
  • 一、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;
    }

    // 设置事件A
    rt_event_send(event, EVENT_A);
    printf("Event A has occurred\n");

    // 设置事件B
    rt_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.coloradmin.cn/o/1671116.html

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

相关文章

活字格登录界面设计

1、不使用内部的登录。 2、创建手机页面。 3、新增一列&#xff0c;行数为31行。 4、复制内含登录界面的组件到前几步创建的界面。 5、插入背景。 6、设置账号和密码文本框的单元格样式&#xff08;新建单元格式样&#xff09;&#xff0c;前后景设为无。 效果图&#xff1a;…

点云分割论文阅读01--FusionVision

FusionVision: A Comprehensive Approach of 3D Object Reconstruction and Segmentation from RGB-D Cameras Using YOLO and Fast Segment Anything FusionVision&#xff1a;使用 YOLO 和 Fast Segment Anything 从 RGB-D 相机重建和分割 3D 对象的综合方法 toread&#x…

python跟C++选哪个?

选择使用Python还是C取决于你的具体需求和项目背景。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 在通信工程行业…

2.数据类型与变量(java篇)

目录 数据类型与变量 数据类型 变量 整型变量 长整型变量 短整型变量 字节型变量 浮点型变量 双精度浮点型 单精度浮点型 字符型变量 布尔型变量&#xff08;boolean&#xff09; 类型转换 自动类型转换(隐式) 强制类型转换(显式) 类型提升 字符串类型 数据类…

【机器学习-06】Scikit-Learn机器学习工具包进阶指南:机器学习分类模型实战与数据可视化分析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

【数据结构】详解栈且实现

一.栈 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&#xff1a;…

10句超好玩的西语习语,柯桥西班牙语培训

Leche在西语中本意是“牛奶”&#xff0c;但是当我们说一件事或一个人是 "la leche "时&#xff0c;就意味着ta是惊人的、不可思议的或不寻常的&#xff01; Ese partido fue la leche.(≈Ese partido fue increble. ) 那场比赛太精彩了。 2. Estar hecho un lo 如…

华中科大:感谢大家,我的春招之旅结束了

今天在论坛上看到一个帖子&#xff0c;一位华中科大的同学&#xff0c;因为家中父亲突然病倒&#xff0c;发求助帖&#xff1a; 请问大家&#xff0c;春招走哪个方向能最快找到工作&#xff1f;还是说继续读研呢&#xff0c;但是家里急需钱…… 当时这个帖子直接热榜第一&…

深入理解与应用C++ Vector

1. C Vector 简介与基本使用 C 的 vector 是一个序列容器&#xff0c;用于表示可变大小的数组。它结合了数组的高效元素访问和动态大小调整的灵活性。与静态数组相比&#xff0c;vector 的大小可以根据需要自动调整&#xff0c;这是通过在底层使用动态数组来实现的。当新元素被…

48.乐理基础-音符的组合方式-休止符

休止符 音乐中总有一些停顿的地方&#xff0c;一次停顿多久是创作人固定好的&#xff0c;休止符就是用来表示每一次停顿多久 需要停顿的位置就用 0 来表示&#xff0c;数字 0 就是简谱中的休止符 音符有全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符等&…

微信小程序Vue+uniapp餐饮美食订餐骑手配送系统9g60o

本小程序uniapp菜品帮采用Java语言和Mysql数据库进行设计&#xff0c;技术采用微信小程序&#xff0c;可以不安装App软件就实现订餐。本系统实现管理员和用户、商家、配送员四个角色的功能。用户主要在微信端操作&#xff0c;内容有菜品信息&#xff0c;用户可以在线点餐和管理…

还在用Postman?试试BB-API,或许更适合你!

什么是BB-API 功能全面 BB-API是一个功能强大的HTTP模拟请求工具&#xff0c;支持模拟GET、POST、PUT、DELETE、HEAD、OPTIONS、PATCH等多种HTTP请求。这使得开发人员能够方便地进行接口测试&#xff0c;验证后端服务的正确性。 离线模式 与市面上许多在线API管理工具不同&…

鸿蒙系统编译方式

鸿蒙系统编译 编译原理编译方式概述hb编译ohos-buildhb安装编译使用build脚本hpmhpm介绍编译举例说明综合应用举例虚拟机中编译docker中使用hpm编译编译原理 编译构建指导:https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/subsystems/subsys-build-all.md,文档介绍…

js前端获取农历日期

对于公历来说&#xff0c;直接 new 一个 Date 就能获取到&#xff0c;而对于农历来讲可就很难了&#xff0c;因为农历需要有许多复杂计算&#xff0c;虽然一般用的甚少&#xff0c;但对于某些场景来说还是会需要的&#xff0c;那么怎样获取农历日期呢&#xff1f; 这里推荐一个…

2024初会押题来了!经济法和实务,内部资料,赶快做一做!

初级会计考试考前冲刺策略 1. 核心知识点掌握 考前冲刺首先需要对核心知识点进行梳理和重点复习。《初级会计实务》和《经济法基础》是考试的两个主要科目&#xff0c;考生需要确保对其中的高频考点有深刻的理解。 2. 高效记忆技巧 对于容易遗忘的知识点&#xff0c;可以采用…

C++进阶:AVL树详解及模拟实现(图示讲解旋转过程)

C进阶&#xff1a;AVL树详解及模拟实现&#xff08;图示讲解旋转过程&#xff09; 之前在搜索二叉树最后早就埋下伏笔&#xff0c;来介绍AVL树和红黑树&#xff0c;今天就先来第一个吧 文章目录 1.AVL树介绍1.1概念介绍1.2核心性质 2.项目文件规划3.整体框架&#xff08;节点和…

管仲发动的粮食战争令人惊醒

各种类型的战争&#xff0c;在中国春秋战国时代就已经包罗万象、炉火纯青了&#xff0c;第一仲父管仲无疑是其中最伟大的军事家之一。 时至今日&#xff0c;他留给人们的最大印象&#xff0c;应该是孔子那句话“微管仲&#xff0c;吾其被发左衽矣。” 也就是说&#xff0c;如果…

2024生日快乐祝福HTNL源码修复版

源码介绍 2024生日快乐祝福HTNL源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 2024生日快乐祝福HTNL源码

证明力引导算法forceatlas2为什么不是启发式算法

一、基本概念 吸引力 F a ( n i ) ∑ n j ∈ N c t d ( n i ) ω i , j d E ( n i , n j ) V i , j \displaystyle \bm{F}_a(n_i) \sum_{n_j \in \mathcal{N}_{ctd}(n_i)} \omega_{i,j} \; d_E(n_i,n_j) \bm{V}_{i,j} Fa​(ni​)nj​∈Nctd​(ni​)∑​ωi,j​dE​(ni​,nj​…

大型医疗挂号微服务“马上好医”医疗项目(4)设计一个医院方接口

如何构建一个医院方接口 一、如何进行数据库建模 数据库建模一般需要使用工具PowerDesign&#xff0c;但是其实在navicat中是有类似的功能的 二、分析医院接口会有什么字段 其实很多的同学在入行的时候会有一个问题&#xff0c;没有设计思维。 表字段的设计方案 状态字段…