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.hqwc.cn/news/696201.html

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

相关文章

uni-app跨端兼容

1.样式兼容 小程序端不支持*选择器&#xff0c;可以使用&#xff08;view,text&#xff09; 页面视口差异(tabar页、普通页) H5端默认开始scoped 例如骨架屏样式出现问题&#xff0c;需要将之前的样式拷贝到骨架屏中 提示&#xff1a;H5端是单页面应用&#xff0c;scoped隔离…

【AI大模型】自动生成红队攻击提示--GPTFUZZER

本篇参考论文为&#xff1a; Yu J, Lin X, Xing X. Gptfuzzer: Red teaming large language models with auto-generated jailbreak prompts[J]. arXiv preprint arXiv:2309.10253, 2023. https://arxiv.org/pdf/2309.10253 一 背景 虽然LLM在今天的各个领域得到了广泛的运用…

LeetCode343:整数拆分

题目描述 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 代码 动态规划 class Solution { public:int integerBreak(int n) {/*dp[i]&#xff1a;表示对…

用 Supabase CLI 进行本地开发环境搭建

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;Supabase CLI&#xff08;1.1&#xff09;安装 Scoop&#xff08;1.2&#xff09;用 Scoop 安装 Supabase CLI &#xff08;二&#xff09;本地项目环境&#xff08;2.1&#xff09;初始化项目&#xff08;2…

【笔记】EF_PNN获取及运营商名称显示(待完善)

问题背景 当设备无法成功解析EONS(PNN)的值(即SIM卡EF文件内容),则会用次优先级的NITZ去refresh了SPN。(问题代码如下,是通过Phone对象拿到plmn为空) 运营商名称一般显示优先级:Eons > NITZ > XML OPL id 0 对应的是PNN第一条 功能逻辑 (定制)当卡中的spn为空…

【XSRP软件无线电】基于软件无线电平台的QPSK频带通信系统设计

目录&#xff1a; 目录&#xff1a; 一、绪论 1.1 设计背景 1.2 设计目的 二、系统总体方案 2.1 专题调研题目 2.2 调研背景 2.3 设计任务解读 2.4 设计原理 2.4.1 原理框图 2.4.2 功能验证 三、软件设计 3.1 程序解读 3.2 程序设计 3.3 仿真结果&#xff1a; 四、程序代码分析…

【spark RDD】spark 之 Kryo高性能序列化框架

文章目录 一. RDD序列化的原因二. Kryo序列化框架三. spark 配置 kryo 序列化1. 设定kryo序列化2. 注册序列化类&#xff08;非必须&#xff0c;但是强烈建议做&#xff09;3. 配置 spark.kryoserializer.buffer 一. RDD序列化的原因 Spark初始化工作是在Driver端进行的&#…

JAVA智慧工地管理系统源码,智慧工地扬如何实现对工地扬尘的实时监测

智慧工地扬尘监测系统概述 智慧工地扬尘监测系统是一种利用现代信息技术&#xff0c;如光电传感技术和无线传输技术&#xff0c;对工地扬尘污染进行实时监测和管理的高效工具。该系统的目的是为了保护环境&#xff0c;减少因建筑施工产生的扬尘对周边地区的影响&#xff0c;同…

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

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

C语言(指针)3

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

【pandas】库中的apply(lambda function ,arix)

pandas.apply() 遍历DataFrame的元素&#xff08;一行或者一列数据&#xff09; 行遍历&#xff1a;axis 1 列遍历&#xff1a;axis 0 基础信息 pandas的apply()方法是用来调用一个lambda函数&#xff0c;让函数对数据对象具有批处理的特性。 pandas支持apply()调用…

Docker:docker在项目中常用的一些命令

简介   Docker 是一个开源的容器化平台&#xff0c;它允许开发者将应用程序及其依赖项打包到一个可移植的容器中&#xff0c;并发布到任何安装了 Docker 引擎的机器上。这些容器是轻量级的&#xff0c;包含了应用程序运行所需的所有东西&#xff0c;如代码、系统库、系统工具…