0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

框架解耦神器 -- REventBus

Rice嵌入式開發(fā)技術分享 ? 來源:Rice 嵌入式開發(fā)技術分享 ? 作者:Rice 嵌入式開發(fā)技 ? 2023-06-02 08:39 ? 次閱讀

REventBus背景

在實際的項目開發(fā)中,經(jīng)常會遇到業(yè)務與業(yè)務,組件與組件,業(yè)務與組件之間的通信,舉個例子:當有煙霧傳感器檢測到煙霧超標時,需要打開排氣扇排氣,同時顯示煙霧濃度顯示到顯示器中,供管理人員檢視。處理這樣的邏輯有幾種策略。如下:

  1. 排氣扇任務和顯示器任務,不斷的查詢煙霧濃度,各自處理檢測煙霧濃度是否超標。
  2. 煙霧模塊提供注冊監(jiān)聽接口,排氣扇任務和顯示器任務分別注冊監(jiān)聽,當濃度超標時,告知監(jiān)聽任務。

以上兩種策略都存在很大的問題,問題分析:

  1. 第一種策略,每一個任務都需要不斷檢查判斷,這會導致資源的浪費,而且代碼也會有很多重復的。
  2. 第二種策略,雖然解決了第一種策略的的問題,但是如果場景中存在不止一個傳感器時,那么所需要注冊的監(jiān)聽接口將隨之增加。而且監(jiān)聽接口是跟具體的業(yè)務綁定的。

綜上所述:為了能夠解決上面的問題,REventBus組件應運而生。

REventBus工作流程圖解

Publisher使用publish發(fā)出ige一個事件,Subscriber在其回調(diào)函數(shù)中接收事件。dcbc327a-00dd-11ee-9c1d-dac502259ad0.png

REventBus依賴組件

為了提供更好的組件化,風火輪科技 和《Rice嵌入式開發(fā)技術分享》公眾號聯(lián)合推出R組件集,REventbus組件就是R組件集的其中一員,組件與組件之后存在依賴關系.REventBus組件同樣依賴一些組件,如下:

  1. RPlatform組件:平臺適配層,為了能讓R組件能夠在不同RTOSLinux中運行,針對不同平臺做的適配層。鏈接:https://gitee.com/RiceChen0/rplatform。
  2. RThread_pool組件:一個跨平臺,易移植,接口簡單的線程池組件。鏈接:https://gitee.com/RiceChen0/rthread_pool。

REventBus的使用

  • REventBus整體包含5部分:Subscribe,Publish,Event,EventCb,Broker。
  • Subscribe --訂閱者訂閱自己需要監(jiān)聽的事件接口。
  • Publish --發(fā)布者發(fā)布事件,它支持同步發(fā)送和異步發(fā)送。
  • Event --訂閱者監(jiān)聽的事件,只有存在訂閱事件,才會有與之對應的發(fā)布事件。
  • EventCb --事件產(chǎn)生的回調(diào)接口,訂閱者注冊,發(fā)布者發(fā)布對應事件之后產(chǎn)生回調(diào)。
  • Broker --事件代理,管理事件注冊,注銷,監(jiān)聽。
REventBus接口說明
接口 說明
reb_init REventBus初始化接口
reb_deinit REventBus去初始化接口
reb_subscribe REventBus訂閱事件接口
reb_unsbscribe REventBus取消訂閱事件接口
reb_publish REventBus同步發(fā)布事件接口
reb_async_publish REventBus異步發(fā)布事件接口
  • REventBus初始化接口
  1. 使用RThread_pool組件創(chuàng)建一個線程池
  2. 創(chuàng)建互斥量,解決共享資源問題。
  3. 初始化broker鏈表,用于事件代理。
pf_err_treb_init(void);
  • REventBus去初始化接口
  1. 線程池注銷,互斥量傷處,
pf_err_treb_deinit(void);
  • REventBus訂閱事件接口: pf_err_t reb_subscribe(const char *event, reb_handler_cb handler)
參數(shù) 「描述」
event 訂閱的事件,其是一個字符串類型
handler 事件處理函數(shù),由訂閱者提供,事件產(chǎn)生時回調(diào)此函數(shù)
「返回」 ——
PF_EOK 訂閱事件成功
OTher 訂閱事件失敗
  • REventBus訂閱事件接口: pf_err_t reb_unsbscribe(const char *event, reb_handler_cb handler)
「參數(shù)」 「描述」
event 訂閱的事件,其是一個字符串類型
handler 事件處理函數(shù),訂閱事件時所訂閱的回調(diào)函數(shù)
「返回」 ——
PF_EOK 取消訂閱事件成功
OTher 取消訂閱事件失敗
  • REventBus同步發(fā)布事件接口:pf_err_t reb_publish(const char *event, void *payload, uint16_t lenght)
「參數(shù)」 「描述」
event 訂閱者訂閱的事件類型
payload 發(fā)布事件的消息類型
lenght 發(fā)布事件的消息長度
「返回」 ——
PF_EOK 發(fā)布事件成功
OTher 發(fā)布事件失敗
  • REventBus異步發(fā)布事件接口:pf_err_t reb_async_publish(const char *event, reb_priority priority, void *payload, uint16_t lenght)
「參數(shù)」 「描述」
event 訂閱者訂閱的事件類型
priority 發(fā)布事件的優(yōu)先級,REB_PRIORITY_HIGH和REB_PRIORITY_ORDINARY(目前未實現(xiàn))
payload 發(fā)布事件的消息類型
lenght 發(fā)布事件的消息長度
「返回」 ——
PF_EOK 發(fā)布事件成功
OTher 發(fā)布事件失敗

REventBus演示

  1. 訂閱事件demo:
  • 注意:同一個模塊定義多次定義同一個事件,只有第一個事件訂閱有效
#include
#include
#include

#include"revent_bus.h"

voidreb_handler(constchar*event,void*payload,uint16_tlenght)
{
rt_kprintf("Recv:event:%s,payload:%.*srn",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();
}
  • 效果:dcd2d70a-00dd-11ee-9c1d-dac502259ad0.png
  1. 發(fā)布同步事件demo:
  • 注意:發(fā)布同步事件,它是按照順序發(fā)布的,只有第一個事件處理完,才會處理第二個事件。
#include
#include
#include

#include"revent_bus.h"

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

intmain(void)
{
rt_kprintf("----------------------rn");
rt_kprintf("-Webcometoyouyeetoo-rn");
rt_kprintf("----------------------rn");
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);
}
}
  • 效果:dcf9b7c6-00dd-11ee-9c1d-dac502259ad0.png
  1. 發(fā)布異步事件demo:
  • 注意:發(fā)布異步事件,發(fā)布的事件不一定立馬執(zhí)行,他會等待線程池的任務空閑時,才會執(zhí)行。也就是執(zhí)行時間不確定。
#include
#include
#include

#include"revent_bus.h"

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

intmain(void)
{
rt_kprintf("----------------------rn");
rt_kprintf("-Webcometoyouyeetoo-rn");
rt_kprintf("----------------------rn");
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);
}
}
  • 效果:dd263af8-00dd-11ee-9c1d-dac502259ad0.png

REventBus的優(yōu)缺點

  • 優(yōu)點:

  1. 簡化組件與組件,業(yè)務與業(yè)務,組件與業(yè)務之間的通信方式。
  2. 對通信雙方做到完全解耦。
  3. 使用RThread pool靈活切換工作線程,一定程度提供了事件處理效率
  4. 支持同步事件發(fā)布,和異步事件發(fā)布。
  5. 資源占用極小。
  • 缺點:

  1. 當業(yè)務多的時候,需要定義很多事件類型。
  2. 訂閱事件的時候,需要遍歷事件列表是否已經(jīng)存在事件;發(fā)布的時候,也需要遍歷事件列表是否已經(jīng)存在事件,性能不高。
dd4932e2-00dd-11ee-9c1d-dac502259ad0.png


審核編輯黃宇


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8360

    瀏覽量

    150535
  • 框架
    +關注

    關注

    0

    文章

    397

    瀏覽量

    17361
  • 解耦
    +關注

    關注

    0

    文章

    40

    瀏覽量

    11879
收藏 人收藏

    評論

    相關推薦

    詳解Board和SoC的設計思路

    本文簡單介紹OpenHarmony輕量系統(tǒng)移植,Board和SoC的設計思路。適合自己動手移植OpenHarmony輕量系統(tǒng)的朋友們。
    的頭像 發(fā)表于 03-03 09:50 ?5318次閱讀
    詳解Board和SoC<b class='flag-5'>解</b><b class='flag-5'>耦</b>的設計思路

    永磁同步電機偏差和電流前饋控制比較

    偏差控制:電機參數(shù)估計值采用估計值加上電流反饋補償d軸電流:電機參數(shù)準確值采用準確值加上電流反饋補償d軸電流:電機參數(shù)采用估計值加上偏差控制:電機參數(shù)采用準確值加上偏差
    發(fā)表于 06-28 06:08

    常用的設計方法

    在采用傳統(tǒng)無動態(tài)控制時,uqu_quq?和udu_dud?的指令值存在耦合項。上一個學習筆記中設計的設計方法是將其忽略,因此在最后設計的效果并不太好。目前,常用的設計方法,有前
    發(fā)表于 08-27 07:29

    永磁同步電機偏差與電流前饋控制對比分析,哪個影響大?

    永磁同步電機偏差與電流前饋控制對比分析,哪個影響大?
    發(fā)表于 10-12 10:17

    電壓前饋是如何實現(xiàn)的

    電壓前饋是什么?電壓前饋是如何實現(xiàn)的?
    發(fā)表于 10-15 06:55

    多變量控制實驗

    多變量控制4.0 實驗設備PC計算機1臺(要求P4-1.8G以上)、MATLAB6.X軟件1套。4.1 實驗目的①學習多變量控制方法。②通過用MATLAB編程、上機調(diào)試,掌握多
    發(fā)表于 05-15 00:51 ?0次下載

    熱連軋機活套系統(tǒng)的控制及仿真

    針對傳統(tǒng)熱連軋帶鋼活套張力與高度控制系統(tǒng),本文給出了基于對角矩陣和解不變性原理的控制方法。通過耦合系統(tǒng)的動態(tài)結構圖,求取活套耦合系
    發(fā)表于 08-04 15:27 ?11次下載

    基于補償器的控制方法的研究

    本文通過對冷熱水混合系統(tǒng)的溫度和液位的雙變量耦合問題進行分析,提出了一種滿足要求和控制目標需要的基于補償器的Smith預估控制方法。試驗結果表明,
    發(fā)表于 02-11 14:38 ?10次下載

    先進PID多變量控制

    先進PID多變量控制 通過PID控制,可實現(xiàn)對多變量系統(tǒng)的控制
    發(fā)表于 05-04 16:01 ?40次下載

    多變量自適應控制及應用

    多變量自適應控制及應用,有需要的朋友下來看看。
    發(fā)表于 04-12 10:21 ?0次下載

    初值設定對快速法潮流計算的影響研究

    初值設定對快速法潮流計算的影響研究
    發(fā)表于 01-23 14:13 ?0次下載

    基于H∞混合靈敏度控制器實現(xiàn)BTT導彈自動駕駛儀的設計

    導彈在大攻角飛行過程中,通道間存在嚴重的氣動耦合。工程設計上,通常把較小的耦合項作為隨機干擾來處理,但當耦合影響較大時,容易使控制系統(tǒng)喪失穩(wěn)定性,因此必須考慮通道間的耦合效應,并對其。近年來
    發(fā)表于 05-17 10:35 ?1083次閱讀

    電容如何放置

    警告: 請注意電容的位置,尤其是IC芯片的電源與地引腳是斜對角的。 潛在問題: 不合理的位置會導致不充分的。 預防措施: -對于像直插這樣的IC,其電源端子與地是端子成對角放置
    的頭像 發(fā)表于 09-30 09:18 ?4015次閱讀
    電容<b class='flag-5'>解</b><b class='flag-5'>耦</b>如何放置

    永磁同步電機控制之反饋及復矢量

    永磁同步電機反饋及復矢量(無刷直流電機等交流電機同樣適用) 一、永磁同步電機數(shù)學模型 1.永磁同步電機dq坐標系數(shù)學模型 2.永磁同步電機復矢量數(shù)學模型 二、
    發(fā)表于 03-09 10:09 ?0次下載
    永磁同步電機控制之反饋<b class='flag-5'>解</b><b class='flag-5'>耦</b>及復矢量<b class='flag-5'>解</b><b class='flag-5'>耦</b>

    框架神器REventBus

    在實際的項目開發(fā)中,經(jīng)常會遇到業(yè)務與業(yè)務,組件與組件,業(yè)務與組件之間的通信,舉個例子:當有煙霧傳感器檢測到煙霧超標時,需要打開排氣扇排氣,同時顯示煙霧濃度顯示到顯示器中,供管理人員檢視。
    的頭像 發(fā)表于 06-06 16:44 ?544次閱讀
    <b class='flag-5'>框架</b><b class='flag-5'>解</b><b class='flag-5'>耦</b><b class='flag-5'>神器</b>—<b class='flag-5'>REventBus</b>