RTT事件集

事件集

事件集是线程间同步的机制之一,一个事件集可以包含多个事件,利用事件集可以完成一对多,多对多的线程间同步。

下面以坐公交为例说明事件,在公交站等公交时可能有以下几种情况:

①P1 坐公交去某地,只有一种公交可以到达目的地,等到此公交即可出发。

②P1 坐公交去某地,有 3 种公交都可以到达目的地,等到其中任意一辆即可出发。

③P1 约另一人 P2 一起去某地,则 P1 必须要等到 “同伴 P2 到达公交站” 与“公交到达公交站”两个条件都满足后,才能出发。

可以将P1去某地视为线程,将公交到达公交站,同伴P2到达公交站视为事件的发送。

①是特定事件唤醒线程;②任意单个事件唤醒线程;③是多个事件同时发生才唤醒线程。

事件集工作机制

事件集主要用于线程间的同步,与信号量不同,它的特点是可以实现一对多,多对多的同步。
即一个线程与多个事件的关系可设置为:任意一个事件唤醒线程,或几个事件都到达后次啊唤醒线程进行后续的处理;同样,事件可以是多个线程同步多个事件。

多事件的集合可以用一个32位无符号整型变量来表示,变量的每一位代表一个事件,线程通过“逻辑与”或“逻辑或”将一个或多个事件关联起来,形成事件组合。

RTT定义的事件集有以下特点:

  1. 事件只与线程相关,事件间相互独立:每个线程可拥有32个事件标志,采用一个32bit无符号整型数进行记录,每一个bit代表一个事件;
  2. 事件仅用于同步,不提供数据传输功能;
  3. 事件无排队性,即多次向线程发送同一事件(如果线程还未来得及读走),其效果等同于只发送一次。

在 RT-Thread 中,每个线程都拥有一个事件信息标记,它有三个属性,分别是 RT_EVENT_FLAG_AND(逻辑与),RT_EVENT_FLAG_OR(逻辑或)以及 RT_EVENT_FLAG_CLEAR(清除标记)。
当线程等待事件同步时,可以通过32个事件标志和这个事件信息标记来判断当前接收的事件是否满足同步条件。

在这里插入图片描述

struct rt_ipc_object
{struct rt_object parent;rt_list_t suspend_thread;	
};
struct rt_event
{struct rt_ipc_object parent;rt_uint32_t set;struct rt_spinlock spinlock;
};	

创建事件集

当创建一个事件集时,内核首先创建一个事件集控制块,然后对该事件集控制块进行基本的初始化,创建事件集使用下面的函数接口:

rt_event rt_event_create(const char* name, rt_uint8_t flag);

调用该函数接口时,系统会从对象管理器中分配事件集对象,并初始化这个对象,然后初始化父类IPC对象。

发送事件

发送事件函数可以发送事件集中的一个或多个事件,如下:

rt_err_t rt_event_send(rt_event_t event, rt_uint32_t set);

使用该函数接口时,通过参数set指定的事件标志来设定event事件集对象的事件标志值,然后遍历等待在event事件集对象上的等待线程链表,判断是否有线程的事件激活要求与当前event对象时间标志值匹配,如果有则唤醒该线程。

接收事件

内核使用32位的无符号整数来标识事件集,它的每一位代表一个事件,因此一个事件集对象可同时等待接收32个事件,内核可以通过指定选择参数 “逻辑与” 或“逻辑或”来选择如何激活线程,使用 “逻辑与” 参数表示只有当所有等待的事件都发生时才激活线程,而使用 “逻辑或” 参数则表示只要有一个等待的事件发生就激活线程。接收事件使用下面的函数接口:

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);

当用户调用这个接口时,系统首先根据set参数和接收选项option判断它要接收的事件是否发生,如果已经发生,则根据参数 option 上是否设置有 RT_EVENT_FLAG_CLEAR 来决定是否重置事件的相应标志位,然后返回**(其中recved参数返回接收到的事件)**

如果没有发生,则把等待的set和option参数填入线程本身的结构中,然后把线程挂起在此事件上,直到其等待的事件满足条件或等待时间超过指定的超时时间。如果超时时间设置为零,则表示当线程要接受的事件没有满足其要求时就不等待,而直接返回 - RT_ETIMEOUT。

事件集应用示例

这是事件集的应用例程,例子中初始化了一个事件集,两个线程。
一个线程等待自己关心的事件发生,另外一个线程发送事件。

#include <rtthread.h>#define THREAD_PRIORITY 9
#define THREAD_TIMESLICE 5#define EVENT_FLAG3 (1 << 3)
#define EVENT_FLAG5 (1 << 5)/* 事件控制块 */
static struct rt_event event;ALIGN(RT_ALIGN_SIZE)
static char thread1_stack[1024];
static struct rt_thread thread1;static void thread1_recv_event(void *param)
{rt_uint32_t e;if(rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5), RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, RT_WAITTING_FOREVER, &e) == RT_EOK){rt_kprintf("0x%x\n",e);}t_kprintf("thread1: delay 1s to prepare the second event\n");rt_thread_mdelay(1000);/* 第二次接收事件,事件 3 和事件 5 均发生时才可以触发线程 1,接收完后清除事件标志 */if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER, &e) == RT_EOK){rt_kprintf("thread1: AND recv event 0x%x\n", e);}rt_kprintf("thread1 leave.\n");
}

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

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

相关文章

基于SpringBoot的高校推荐系统

项目介绍 当前&#xff0c;随着高等教育的不断普及&#xff0c;越来越多的学生选择考研究生来提高自身的学术水平和竞争力。然而&#xff0c;考研生在选择报考院校和专业时面临着众多的选择和信息不对称的问题。为了解决这些问题&#xff0c;一些网站和APP已经推出了相关的院校…

OpenAI泄密者加入马斯克xAI,技术版图扩张;OpenAI推出可识别DALL·E 3图像的AI检测工具

&#x1f989; AI新闻 &#x1f680; OpenAI泄密者加入马斯克xAI&#xff0c;技术版图扩张 摘要&#xff1a;最近&#xff0c;曾在OpenAI任职并被指控泄露机密的Pavel Izmailov迅速加入了马斯克旗下的xAI团队&#xff0c;成为研究员。在加入之前&#xff0c;Izmailov因涉嫌泄…

CAN报文总线仲裁机制

对于标准帧而言&#xff0c;有11位的标识符&#xff0c;也就是报文的ID。报文的ID值越小&#xff0c;优先级越高。如果有两个以上的ECU同时发送CAN报文&#xff0c;ID值小的报文可以发送成功。总线仲裁机制是一种非破坏性仲裁&#xff0c;是一种既不会造成已发送数据的延迟&…

天龙怀旧游戏python脚本

设置图&#xff1a; 游戏窗口最大化。​​​​​​​ 海贼洞这里定位你要回点的定位。 运行bat就行&#xff0c;脚本出错了还是会重新运行脚本&#xff0c;运行自动启动&#xff0c;end暂停脚本&#xff0c;home重新启动脚本 1. 我常用的是内挂回点脚本&#xff0c;下面都是…

Android内核之Binder通信写操作:binder_thread_write用法实例(七十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

vue3+elementPlus:el-input输入框设置数字小数点

<el-input-numberplaceholder"请输入"v-model.number"scope.row.threeValue"class"mx-4":step"0.001" //精度controls-position"right" //幅度/></template> 上一篇文章&#xff0c; vue3echarts&#xff1a;e…

如何更好地使用Kafka? - 事先预防篇

要确保Kafka在使用过程中的稳定性&#xff0c;需要从kafka在业务中的使用周期进行依次保障。主要可以分为&#xff1a;事先预防&#xff08;通过规范的使用、开发&#xff0c;预防问题产生&#xff09;、运行时监控&#xff08;保障集群稳定&#xff0c;出问题能及时发现&#…

windows10打印机共享完美解决方案

提到文件共享大家并不陌生,相关的还有打印机共享,这个多见于单位、复印部,在一个区域网里多台电脑共用一台打印机,打印资料非常方便,就包括在家里,我们现在一般都会有多台电脑或设备,通过家庭网络联接,如果共享一台打印机的话也是件便捷的事。 但是随着操作系统的更新…

【IP:Internet Protocol,子网(Subnets),IPv6:动机,层次编址:路由聚集(rout aggregation)】

文章目录 IP&#xff1a;Internet Protocol互联网的的网络层IP分片和重组&#xff08;Fragmentation & Reassembly&#xff09;IP编址&#xff1a;引论子网&#xff08;Subnets&#xff09;特殊IP地址IP 编址: CIDR子网掩码&#xff08;Subnet mask&#xff09;转发表和转发…

Linux学习笔记:信号

信号 在Linux中什么是信号信号的产生方式硬件产生的信号软件产生的信号异常产生的信号 进程对信号的处理信号的保存信号方法更改函数signal信号处理的更改恢复默认信号忽略 信号的管理信号集 sigset_t对信号集的操作 信号的捕捉过程 在Linux中什么是信号 在 Linux 系统中&…

如何备考PMP才能一次通过?

PMP备考一个月就能通过&#xff0c;培训机构中就应该这么学&#xff01; PMP考试的难度其实并没有大家想象中的那么大&#xff0c;现在培训机构的通过率基本也在90%以上&#xff0c;而这90%以上也基本都是头一次参加考试很少有参加重考的学员。我就是在威班PMP培训了一个多月一…

JVS物联网平台5.7功能新增说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

深度学习Day-16:实现天气预测

&#x1f368; 本文为&#xff1a;[&#x1f517;365天深度学习训练营] 中的学习记录博客 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制] 要求&#xff1a;根据提供的数据集对RainTomorrow进行预测 一、 基础配置 语言环境&#xff1a;Python3.7编译器选择…

yolov8任务之目标检测

对象检测 对象检测是一项涉及识别图像或视频流中对象的位置和类别的任务。对象检测器的输出是一组包围图像中对象的边界框&#xff0c;以及每个框的类标签和置信度分数。当您需要识别场景中感兴趣的对象&#xff0c;但不需要确切知道对象在哪里或其确切形状时&#xff0c;对象检…

短视频矩阵系统源码saas开发--可视化剪辑、矩阵托管、多功能合一开发

短视频矩阵系统源码saas开发&#xff08;可视化剪辑、矩阵托管、智能私信聚合、线索转化、数据看板、seo关键词、子账号等多个板块开发&#xff09; 短视频矩阵系统是一种集成了多种功能的系统&#xff0c;旨在帮助用户在短视频平台上进行高效的内容创作、管理和发布。根据您提…

3. 分布式链路追踪的链路日志设计

前言 分布式链路追踪的客户端实现中&#xff0c;我们会通过各种手段和规则得到一个又一个的Span&#xff0c;得到这些Span后&#xff0c;需要在分布式链路追踪的服务端这边汇总这些Span并拼接出一条请求链路&#xff0c;那么这里就存在一个问题&#xff0c;客户端得到的Span如…

Qt跨平台开发demo(适用萌新)

最近需要参与一款Qt跨平台的软件开发&#xff0c;在此之前&#xff0c;特把基础信息做学习和梳理&#xff0c;仅供参考。 所使用的技术和版本情况如下&#xff1a; 虚拟机&#xff1a;VMware 16.2.5操作系统&#xff1a;ubuntu-20.04.6-desktop-amd64&#xff1a;Mysql数据库…

机器人系统仿真

0、何为仿真 通过计算机对实体机器人系统进行模拟的技术。 1、为何仿真 低成本&#xff1a; 机器人实体一般价格昂贵&#xff0c;为降低机器人学习、调试的成本&#xff1b;高效&#xff1a; 搭建的环境更为多样且灵活&#xff0c;可以提高测试效率以及测试覆盖率&#xff1b…

MS86235运算放大器可Pin to Pin兼容OPA2835

MS8635/MS86235是一款低功耗的单/双通道低噪声、轨到轨输出、高速运算放大器&#xff0c;可由2.7V至5V范围内的单电源或者1.35V至2.5V范围内的双电源供电运行。可Pin to Pin兼容OPA2835。每通道仅消耗630μA的电流&#xff0c;单位增益带宽为66MHz&#xff0c;在节能模式下&…

从几个方面判断代理IP的质量?

代理IP的质量对于网络活动至关重要&#xff0c;它直接影响到用户的隐私保护、访问速度、稳定性以及整体的网络体验。以下是从几个关键方面来判断代理IP质量的详细分析&#xff1a; 第一点稳定性&#xff1a;稳定性是评估代理IP质量的首要因素。一个优质的代理IP应该具备高稳定…