0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

REventBus工作流程

jf_NsPBt3VS 来源:风火轮技术团队 2023-05-30 09:09 次阅读

REventBus背景

在实际的项目开发中,经常会遇到业务与业务,组件与组件,业务与组件之间的通信,举个例子:当有烟雾传感器检测到烟雾超标时,需要打开排气扇排气,同时显示烟雾浓度显示到显示器中,供管理人员检视。处理这样的逻辑有几种策略。如下:

排气扇任务和显示器任务,不断的查询烟雾浓度,各自处理检测烟雾浓度是否超标。

烟雾模块提供注册监听接口,排气扇任务和显示器任务分别注册监听,当浓度超标时,告知监听任务。

以上两种策略都存在很大的问题,问题分析:

第一种策略,每一个任务都需要不断检查判断,这会导致资源的浪费,而且代码也会有很多重复的。

第二种策略,虽然解决了第一种策略的的问题,但是如果场景中存在不止一个传感器时,那么所需要注册的监听接口将随之增加。而且监听接口是跟具体的业务绑定的。

综上所述:为了能够解决上面的问题,REventBus组件应运而生。开源链接:https://gitee.com/RiceChen0/revent_bus

REventBus工作流程图解

Publisher使用publish发出ige一个事件,Subscriber在其回调函数中接收事件。bd4e0a5c-fe81-11ed-90ce-dac502259ad0.png

REventBus依赖组件

为了提供更好的组件化,风火轮科技 和《Rice嵌入式开发技术分享》公众号联合推出R组件集,REventbus组件就是R组件集的其中一员,组件与组件之后存在依赖关系.REventBus组件同样依赖一些组件,如下:

RPlatform组件:平台适配层,为了能让R组件能够在不同RTOSLinux中运行,针对不同平台做的适配层。链接:https://gitee.com/RiceChen0/rplatform。

RThread_pool组件:一个跨平台,易移植,接口简单的线程池组件。链接:https://gitee.com/RiceChen0/rthread_pool。

REventBus的使用

REventBus整体包含5部分:Subscribe,Publish,Event,EventCb,Broker。

Subscribe --订阅者订阅自己需要监听的事件接口。

Publish --发布者发布事件,它支持同步发送和异步发送。

Event --订阅者监听的事件,只有存在订阅事件,才会有与之对应的发布事件。

EventCb --事件产生的回调接口,订阅者注册,发布者发布对应事件之后产生回调。

Broker --事件代理,管理事件注册,注销,监听。

REventBus接口说明

接口 说明
reb_init REventBus初始化接口
reb_deinit REventBus去初始化接口
reb_subscribe REventBus订阅事件接口
reb_unsbscribe REventBus取消订阅事件接口
reb_publish REventBus同步发布事件接口
reb_async_publish REventBus异步发布事件接口

REventBus初始化接口

使用RThread_pool组件创建一个线程池

创建互斥量,解决共享资源问题。

初始化broker链表,用于事件代理。

pf_err_treb_init(void);

REventBus去初始化接口

线程池注销,互斥量伤处,

pf_err_treb_deinit(void);

REventBus订阅事件接口: pf_err_t reb_subscribe(const char *event, reb_handler_cb handler)

参数 描述
event 订阅的事件,其是一个字符串类型
handler 事件处理函数,由订阅者提供,事件产生时回调此函数
返回 ——
PF_EOK 订阅事件成功
OTher 订阅事件失败

REventBus订阅事件接口: pf_err_t reb_unsbscribe(const char *event, reb_handler_cb handler)

参数 描述
event 订阅的事件,其是一个字符串类型
handler 事件处理函数,订阅事件时所订阅的回调函数
返回 ——
PF_EOK 取消订阅事件成功
OTher 取消订阅事件失败

REventBus同步发布事件接口:pf_err_t reb_publish(const char *event, void *payload, uint16_t lenght)

参数 描述
event 订阅者订阅的事件类型
payload 发布事件的消息类型
lenght 发布事件的消息长度
返回 ——
PF_EOK 发布事件成功
OTher 发布事件失败

REventBus异步发布事件接口:pf_err_t reb_async_publish(const char *event, reb_priority priority, void *payload, uint16_t lenght)

参数 描述
event 订阅者订阅的事件类型
priority 发布事件的优先级,REB_PRIORITY_HIGH和REB_PRIORITY_ORDINARY(目前未实现)
payload 发布事件的消息类型
lenght 发布事件的消息长度
返回 ——
PF_EOK 发布事件成功
OTher 发布事件失败

REventBus演示

订阅事件demo:

注意:同一个模块定义多次定义同一个事件,只有第一个事件订阅有效

#include
#include
#include

#include"revent_bus.h"

voidreb_handler(constchar*event,void*payload,uint16_tlenght)
{
rt_kprintf("Recv:event:%s,payload:%.*s
",event,lenght,payload);
}

intmain(void)
{
reb_init();

reb_subscribe("event1",reb_handler);
reb_subscribe("event1",reb_handler);
reb_subscribe("event2",reb_handler);

reb_info_dump();
}

效果:

bd59f63c-fe81-11ed-90ce-dac502259ad0.png

发布同步事件demo:

注意:发布同步事件,它是按照顺序发布的,只有第一个事件处理完,才会处理第二个事件。

#include
#include
#include

#include"revent_bus.h"

voidreb_handler(constchar*event,void*payload,uint16_tlenght)
{
rt_kprintf("Recv:event:%s,payload:%.*s
",event,lenght,payload);
}

intmain(void)
{
rt_kprintf("----------------------
");
rt_kprintf("-Webcometoyouyeetoo-
");
rt_kprintf("----------------------
");
reb_init();

reb_subscribe("event1",reb_handler);
reb_subscribe("event1",reb_handler);
reb_subscribe("event2",reb_handler);

reb_info_dump();

while(1)
{
reb_publish("event1","youyeetoo:eventbus",rt_strlen("youyeetoo:eventbus"));
reb_publish("event2","Publishsyncmsg",rt_strlen("Publishsyncmsg"));
rt_thread_delay(1000);
}
}

效果:

bd6d725c-fe81-11ed-90ce-dac502259ad0.png

发布异步事件demo:

注意:发布异步事件,发布的事件不一定立马执行,他会等待线程池的任务空闲时,才会执行。也就是执行时间不确定。

#include
#include
#include

#include"revent_bus.h"

voidreb_handler(constchar*event,void*payload,uint16_tlenght)
{
rt_kprintf("Recv:event:%s,payload:%.*s
",event,lenght,payload);
}

intmain(void)
{
rt_kprintf("----------------------
");
rt_kprintf("-Webcometoyouyeetoo-
");
rt_kprintf("----------------------
");
reb_init();

reb_subscribe("event1",reb_handler);
reb_subscribe("event1",reb_handler);
reb_subscribe("event2",reb_handler);

reb_info_dump();

while(1)
{
reb_publish("event1","youyeetoo:eventbus",rt_strlen("youyeetoo:eventbus"));
reb_publish("event2","Publishsyncmsg",rt_strlen("Publishsyncmsg"));
rt_thread_delay(100);
reb_async_publish("event1",REB_PRIORITY_ORDINARY,"GoodGood",rt_strlen("GoodGood"));
reb_async_publish("event2",REB_PRIORITY_ORDINARY,"Publishasyncmsg",rt_strlen("Publishasyncmsg"));
rt_thread_delay(100);
}
}

效果:

bd97944c-fe81-11ed-90ce-dac502259ad0.png

REventBus的优缺点

优点:

简化组件与组件,业务与业务,组件与业务之间的通信方式。

对通信双方做到完全解耦。

使用RThread pool灵活切换工作线程,一定程度提供了事件处理效率

支持同步事件发布,和异步事件发布。

资源占用极小。

缺点:

当业务多的时候,需要定义很多事件类型。

订阅事件的时候,需要遍历事件列表是否已经存在事件;发布的时候,也需要遍历事件列表是否已经存在事件,性能不高。

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 显示器
    +关注

    关注

    21

    文章

    4944

    浏览量

    139816
  • 接口
    +关注

    关注

    33

    文章

    8496

    浏览量

    150831
  • 开源
    +关注

    关注

    3

    文章

    3245

    浏览量

    42396

原文标题:框架解耦神器 -- REventBus

文章出处:【微信号:风火轮技术团队,微信公众号:风火轮技术团队】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    设计和模拟厘米尺度超透镜的工作流程

    本文介绍了设计和模拟厘米尺度超透镜的工作流程
    的头像 发表于 12-16 11:02 1013次阅读
    设计和模拟厘米尺度超透镜的<b class='flag-5'>工作流程</b>

    电气CAD文件中高效的工作流程

    电气CAD文件中高效的工作流程性能卓越的 PCschemetic ELautomation软件具有作电气设计时所需要的所有功能。其独一无二的工作流程可节省您大量的时间,它代替了所有的订货信息——从
    发表于 12-04 11:24

    帮忙分析下这个设计的工作流程

    你好我是单片机学习的菜鸟能不能帮我分析一下一下设计的工作流程各个器件的工作原理
    发表于 12-07 11:06

    AndroidWifi工作流程

    AndroidWifi工作流程
    发表于 11-02 10:52

    AndroidWifi工作流程

    AndroidWifi工作流程
    发表于 09-25 11:17

    AndroidWifi工作流程

    AndroidWifi工作流程
    发表于 11-08 09:07

    Simulink是什么?Simulink的工作流程是怎样进行的?

    Simulink是什么?Simulink有哪些功能?如何去使用Simulink?Simulink的工作流程是怎样进行的?
    发表于 07-09 06:16

    AS068工作流程是怎样的?

    AS068工作流程是怎样的?
    发表于 12-07 08:02

    串口发送数据的配置与工作流程是怎样的?

    串口发送数据的配置与工作流程是怎样的?
    发表于 12-10 06:26

    财务管理工作流程

    财务管理工作流程
    发表于 03-30 20:42 8318次阅读

    测试工程师工作流程有哪些

    测试工程师的工作流程,与公司的整体工作流程,项目的测试要求等因素相关。本文主要讨论测试工程师的一般工作流程
    的头像 发表于 10-03 16:56 7675次阅读

    雷电的4K工作流程

    在4K的雷电工作流程
    的头像 发表于 05-31 11:20 2401次阅读

    工作流程图怎么用?有哪些绘制工作流程图的软件

    工作流程图是清晰地展示工作中各个环节的流程图图示,主要用于工作活动和效率的管理。工作流程图这种图示方法具有直观描述性、简洁性、可操作性和指导
    的头像 发表于 07-28 14:22 3509次阅读

    机器视觉系统的组成及工作流程

    机器视觉系统的组成及工作流程介绍。
    发表于 04-19 15:24 16次下载

    27个非常经典的设备工作流程图解

    今天给大家分享27个非常经典的设备工作流程图解。
    的头像 发表于 06-02 17:16 1689次阅读
    27个非常经典的设备<b class='flag-5'>工作流程</b>图解