精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

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

嵌入式遠(yuǎn)程過程調(diào)用組件--eRPC

Rice嵌入式開發(fā)技術(shù)分享 ? 來源:Rice嵌入式開發(fā)技術(shù)分享 ? 作者:Rice嵌入式開發(fā)技術(shù) ? 2023-04-06 14:15 ? 次閱讀

概述

  1. RPC(Remote Procedure call)遠(yuǎn)程過程調(diào)用。其分為兩部分:遠(yuǎn)程過程和過程調(diào)用。遠(yuǎn)程過程是指每臺機(jī)器上提供的服務(wù),過程調(diào)用就是對遠(yuǎn)程過程調(diào)用以及數(shù)據(jù)傳輸。
  2. RPC用通俗的語言描述:客戶端在不知道調(diào)用細(xì)節(jié)的情況下,調(diào)用存在于遠(yuǎn)程設(shè)備上的某個對象,就像調(diào)用本地應(yīng)用程序中的對象一樣。RPC比較正式的描述:一種通過傳輸介質(zhì)從遠(yuǎn)程設(shè)備程序上請求服務(wù),而不需要了解底層傳輸介質(zhì)的協(xié)議。
  3. 按照我對RPC的理解,我將RPC分為三層:接口層,協(xié)議層,傳輸層。
  • 接口層:客戶端實現(xiàn)了服務(wù)端的接口代理,而服務(wù)端的接口為具體實現(xiàn)。
  • 協(xié)議層:客戶端根據(jù)規(guī)則實現(xiàn)接口參數(shù)的打包,序列化等動作。服務(wù)端根據(jù)規(guī)則將參數(shù)反序列化,并將其傳輸?shù)椒?wù)接口。
  • 傳輸層:傳輸介質(zhì):TCP/UDP,HTTP,藍(lán)牙,串口,USB等。
9f261bc2-cd3b-11ed-a826-dac502259ad0.pngRPC流程圖

RPC的特點:

  1. RPC是協(xié)議:它是一套協(xié)議規(guī)范,需要遵循這套規(guī)范來實現(xiàn)。目前典型的RPC實現(xiàn)包括:Dubbo,eRPC,GRPC等。目前技術(shù)的發(fā)展趨勢來看,實現(xiàn)了RPC協(xié)議的應(yīng)用工具往往都會附加其他重要功能。
  2. 傳輸層對其透明:RPC的客戶端調(diào)用就像調(diào)用本地應(yīng)用程序中的對象,所以傳輸層使用TPC/UDB、UART、USB等協(xié)議,它本省是不需要關(guān)心的。
  3. 協(xié)議格式對其透明:RPC客戶端調(diào)用遠(yuǎn)程對象需要傳遞一些參數(shù),并且返回一個調(diào)用結(jié)果,至于被調(diào)用的對象內(nèi)部是如何使用這些參數(shù),并計算出結(jié)果的。調(diào)用方是不需要關(guān)系的。也就傳輸?shù)膮f(xié)議格式的構(gòu)成,調(diào)用方是不需要關(guān)心的。
  4. 跨語言能力:調(diào)用方實際是不需要關(guān)心被調(diào)用方是什么設(shè)備,使用什么語言。它可以是一個云服務(wù)器,也可以是一個小的單片機(jī)。至于這些設(shè)備使用的語言無需關(guān)心,被調(diào)用方只需要能夠解析調(diào)用方的數(shù)據(jù)及能返回正確的結(jié)果即可。

RPC的優(yōu)缺點:

  • 優(yōu)點:實現(xiàn)模塊的分布式部署,可以實現(xiàn)更好的維護(hù)性,擴(kuò)展性以及協(xié)同式開發(fā)。

  • 缺點:①通信延遲;②地址空間隔離;③局部故障;④并發(fā)問題。

eRPC (Embedded RPC)

eRPC是什么

eRPC (Embedded RPC) is an open source Remote Procedure Call (RPC) system for multichip embedded systems and heterogeneous multicore SoCs.

eRPC(嵌入式RPC)是一種用于多芯片嵌入式系統(tǒng)和異構(gòu)多核SoC的開源遠(yuǎn)程過程調(diào)用(RPC)系統(tǒng)。

Unlike other modern RPC systems, such as the excellent Apache Thrift, eRPC distinguishes itself by being designed for tightly coupled systems, using plain C for remote functions, and having a small code size (<5kB). It is not intended for high performance distributed systems over a network.

與其他現(xiàn)代RPC系統(tǒng)(如出色的Apache Thrift)不同,eRPC的與眾不同之處在于它是為緊密耦合的系統(tǒng)設(shè)計的,使用純C實現(xiàn)遠(yuǎn)程功能,并且代碼大小較小(<5kB)。它不適用于網(wǎng)絡(luò)上的高性能分布式系統(tǒng)。

eRPC源碼

eRPC源碼路徑

「https://github.com/EmbeddedRPC/erpc」

eRPC源碼目錄

我們關(guān)注兩個目錄erpc_c和erpcgen。其中:erpc_c是eRPC的C/C++實現(xiàn)。erpcgen是將IDL文件轉(zhuǎn)為C或Python源文件。

.
├──doxygen
├──erpc_c
│├──config
│├──infra
│├──port
│├──setup
│└──transports
├──erpcgen
├──erpc_python
├──erpcsniffer
├──examples
├──mk
├──README.md
├──test
└──utilities
目錄 說明
erpc_c/config eRPC的配置文件
erpc_c/infra eRPC的核心代碼
erpc_c/port eRPC的移植層,適配不同的開發(fā)環(huán)境
erpc_c/setup eRPC的C接口
erpc_c/transports eRPC的傳輸層,包含不同介質(zhì)的驅(qū)動

eRPC編譯

我們需要編譯兩個東西,其中:①需要將編譯erpc_c編譯成庫,②編譯erpcgen編譯成可執(zhí)行文件,用于.erpc的IDL語法生成service和client的代碼。

編譯eRPC庫

為了方便我們編譯,我們將eRPC編程庫,然后我們的應(yīng)用通過鏈接方式生成可執(zhí)行文件。步驟:

  1. 進(jìn)入erpc_c目錄。
  2. 執(zhí)行 make build=release,編譯生成release版本的eRPC庫。
  3. 執(zhí)行 make build=release install,安裝release版本的eRPC庫。其中:默認(rèn)安裝路徑是:/usr/local/lib,頭文件安裝路徑是:/usr/local/include。
編譯erpcgen

eRPC為了能過夠更加方便供開發(fā)者使用,提供了IDL的解析器erpcgen及生成規(guī)則,減少了我們編碼。erpcgen在eRPC中非常重要。步驟:

  1. 進(jìn)入erpcgen目錄。
  2. 執(zhí)行 make build=release,編譯生成可執(zhí)行程序。
  3. 執(zhí)行 make build=release install,安裝,其中:默認(rèn)安裝路徑是:/usr/local/bin。

eRPC例子

我們寫一個簡單的例子,傳輸層采用TCP,Client發(fā)一個字符串,Server端回復(fù)一個字符串。步驟:

  1. 新建一個目錄:youyeetoo,并新建一個eRPC的IDL文件:youyeetoo.erpc
programyouyeetoo//指定生成的文件名

interfaceyouyeetoo{//接口定義,包好一個或者多個函數(shù)
helloYouyeetoo(binarytxInput)->binary,//函數(shù):helloYouyeetoo,入?yún)㈩愋停篵inary,返回值類型:binary
}
  1. 將youyeetoo.erpc作為參數(shù),使用剛剛編譯的erpcgen可執(zhí)行文件,生成客戶端和服務(wù)端的代碼:
youyeetoo@youyeetoo:~/youyeetoo$erpcgen./youyeetoo.erpc
  1. 上述執(zhí)行完會在當(dāng)前目錄下生成4個文件:"youyeetoo_client.cpp","youyeetoo_server.cpp","youyeetoo_server.h","youyeetoo.h"。其中:

  • 根據(jù).erpc文件會生成一個接口:binary_t * helloYouyeetoo(const binary_t * txInput);。
  • 客戶端無需實現(xiàn)這個接口的定義,它的實現(xiàn)已經(jīng)自動生成放在youyeetoo_client.cpp。上層應(yīng)用直接使用即可。
  • 服務(wù)端需要沒有實現(xiàn)這個接口,所以需要在上層應(yīng)用實現(xiàn)函數(shù)體的內(nèi)容。
  • 創(chuàng)建一個客戶端的上層應(yīng)用文件:client_app.cpp。其中:

  • 創(chuàng)建一個TCP傳輸層通道。
  • 初始化eRPC客戶端對象。
  • 通過helloYouyeetoo函數(shù)進(jìn)行遠(yuǎn)程調(diào)用,發(fā)送一條消息:"hello youyeetoo!"。
  • 將遠(yuǎn)程調(diào)用的返回值打印出來。
  • 編譯命令:「g++ -Wall -I. -I/usr/local/include/erpc -L/usr/local/lib youyeetoo_client.cpp client_app.cpp -lerpc -lpthread -o client_app」
  • 生成client_app可執(zhí)行文件。
#include
#include
#include
#include
#include
#include"youyeetoo.h"

staticvoidfree_binary_t_struct(binary_t*data)
{
if(data->data){
erpc_free(data->data);
}
}

intmain(intargc,char*argv[])
{
erpc_transport_ttransport=erpc_transport_tcp_init("127.0.0.1",5555,false);
erpc_mbf_tmessage_buffer_factory=erpc_mbf_dynamic_init();
erpc_client_init(transport,message_buffer_factory);
char*msg="hello,youyeetoo!";
binary_tb={(uint8_t*)msg,(uint32_t)strlen(msg)};
printf("Request:%sn",msg);
binary_t*resp=helloYouyeetoo(&b);
if(resp!=NULL){
char*buf=(char*)malloc(resp->dataLength+1);
strncpy(buf,(constchar*)resp->data,resp->dataLength);
buf[resp->dataLength]='';
printf("Respond:%sn",buf);
free_binary_t_struct(resp);
free(buf);
}

erpc_transport_tcp_close();

return0;
}
  1. 創(chuàng)建一個服務(wù)端的上層應(yīng)用文件:server_app.cpp。其中:
  • 創(chuàng)建一個TCP傳輸層通道。
  • 初始化eRPC服務(wù)端對象。
  • 注冊服務(wù)到服務(wù)端對象中。
  • 運(yùn)行服務(wù)端線程。
  • 當(dāng)客戶端進(jìn)行遠(yuǎn)程調(diào)用時,將會進(jìn)入helloYouyeetoo函數(shù),并返回。
  • 編譯命令:「g++ -Wall -I. -I/usr/local/include/erpc -L/usr/local/lib youyeetoo_server.cpp server_app.cpp -lerpc -lpthread -o server_app」
  • 生成client_app可執(zhí)行文件。
#include
#include
#include
#include
#include
#include
#include"youyeetoo_server.h"

binary_t*helloYouyeetoo(constbinary_t*input)
{
size_tlen=0;
char*buf;

printf("recv:%srn",input->data);

buf=(char*)malloc(strlen("hi,good!"));
memset(buf,0,strlen("hi,good!"));
strncpy(buf,"hi,good!",strlen("hi,good!"));
printf("send:hi,good!n");
len=strlen("hi,good!");

returnnewbinary_t{(uint8_t*)buf,(uint32_t)len};
}

intmain(intargc,char*argv[])
{
erpc_transport_ttransport=erpc_transport_tcp_init("127.0.0.1",5555,true);
erpc_mbf_tmessage_buffer_factory=erpc_mbf_dynamic_init();
erpc_server_tserver=erpc_server_init(transport,message_buffer_factory);
erpc_add_service_to_server(server,create_youyeetoo_service());
while(1){
erpc_server_run(server);
}
erpc_transport_tcp_close();

return0;
}
  1. 執(zhí)行結(jié)果:
9f2f2eba-cd3b-11ed-a826-dac502259ad0.pngeRPC運(yùn)行結(jié)果

總結(jié)

  1. eRPC確實是一個不錯的組件,它對底層傳輸層做了抽象,使其RPC組件不局限傳統(tǒng)的僅在TPC/UDP條件下運(yùn)行。
  2. eRPC的傳輸層缺少可行認(rèn)證,它的傳輸時明文的,對于數(shù)據(jù)來說是不安全的,應(yīng)該提供安全認(rèn)證的能力。
  3. eRPC提供IDL(接口定義語言),是我們使用起來更加方便,我們不在需要知道eRPC的具體實現(xiàn),便可以完成客戶端與服務(wù)端的調(diào)用。

歡迎關(guān)注微信公眾號『Rice嵌入式開發(fā)技術(shù)分享』


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

    關(guān)注

    5069

    文章

    19021

    瀏覽量

    303380
收藏 人收藏

    評論

    相關(guān)推薦

    如何手搓一個自定義的RPC 遠(yuǎn)程過程調(diào)用框架

    1、RPC(遠(yuǎn)程過程調(diào)用概述) 遠(yuǎn)程過程調(diào)用(RPC, Remote Procedure Call)是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計算機(jī)程序上請求服務(wù),而無需了解網(wǎng)絡(luò)細(xì)節(jié)的通信技術(shù)。在分布系統(tǒng)
    的頭像 發(fā)表于 07-22 12:17 ?834次閱讀
    如何手搓一個自定義的RPC <b class='flag-5'>遠(yuǎn)程過程調(diào)用</b>框架

    SQL server服務(wù),遠(yuǎn)程過程調(diào)用失敗的解決方法

    成功解決SQL server服務(wù),遠(yuǎn)程過程調(diào)用失敗
    發(fā)表于 12-27 10:11

    嵌入式組件的設(shè)計原則是什么?

    、Internet和分布計算環(huán)境中CBD技術(shù)已經(jīng)得到了成熟的應(yīng)用。但是,在其他一些領(lǐng)域,如嵌入式系統(tǒng)中,CBD的應(yīng)用還及其有限。由于不同嵌入式系統(tǒng)的需求和硬件平臺各異,要開發(fā)出適用于所有系統(tǒng)的通用
    發(fā)表于 03-06 08:09

    嵌入式系統(tǒng)組件的設(shè)計原則是什么

    嵌入式系統(tǒng)和組件技術(shù)嵌入式系統(tǒng)組件的設(shè)計原則面向嵌入式組件的系統(tǒng)開發(fā)
    發(fā)表于 04-23 06:08

    VS Code + gdbserver嵌入式arm遠(yuǎn)程調(diào)試的過程是怎樣的

    VS Code + gdbserver嵌入式arm遠(yuǎn)程調(diào)試的過程是怎樣的
    發(fā)表于 12-24 07:43

    如何將eRPC移植到rt-thread系統(tǒng)上

    什么是 eRPCeRPC (Embedded RPC) 是用于多芯片嵌入式系統(tǒng)和異構(gòu)多核 SoC 的開源遠(yuǎn)程過程調(diào)用 (RPC) 系統(tǒng)。eRPC
    發(fā)表于 08-22 14:46

    eRPC上怎么添加RT-Thread系統(tǒng)接口

    rt-thread 系統(tǒng)端的 rpc 遠(yuǎn)程調(diào)用過程!結(jié)束語這么簡單就實現(xiàn)了?當(dāng)然不是,移植過程遠(yuǎn)遠(yuǎn)不夠。本篇只完成了 port 下的接口。還缺一個 Transport ,我們下篇見。原作者:出出啊
    發(fā)表于 08-25 15:00

    基于嵌入式TCP/IP的遠(yuǎn)程GPRS控制終端的設(shè)計與實現(xiàn)

    介紹了基于8 位單片機(jī)的嵌入式TCP/ IP 的遠(yuǎn)程無線控制終端的設(shè)計與實現(xiàn). 描述了基于GPRS 網(wǎng)的數(shù)據(jù)傳輸過程嵌入式實時操作系統(tǒng)RTX51 以及
    發(fā)表于 08-24 18:56 ?33次下載

    嵌入式RPC的設(shè)計與實現(xiàn)

    在研究遠(yuǎn)程過程調(diào)用的原理和嵌入式系統(tǒng)特點的基礎(chǔ)上,提出一種遠(yuǎn)程過程調(diào)用的設(shè)計以及在VxWorks操作系統(tǒng)上服務(wù)器端和在Windows操作系統(tǒng)上客戶端的實現(xiàn)。經(jīng)在項目中的應(yīng)用,本設(shè)計
    發(fā)表于 03-21 15:30 ?23次下載

    嵌入式視頻監(jiān)控組件的設(shè)計與實現(xiàn)

    關(guān)鍵詞:嵌入式 , 視頻監(jiān)控 隨著數(shù)字視頻壓縮技術(shù)的日益成熟,嵌入式視頻監(jiān)控成為當(dāng)今監(jiān)控技術(shù)的主流,但由于系統(tǒng)功能不斷增加、編程環(huán)境不斷改變以及前期需求分析和設(shè)計不完善,導(dǎo)致系統(tǒng)升級和維護(hù)的難度不斷
    發(fā)表于 01-25 18:35 ?319次閱讀

    如何實現(xiàn)嵌入式系統(tǒng)遠(yuǎn)程調(diào)試

    嵌入式系統(tǒng)隨著目前科技的發(fā)展,正逐步融入人們的生活中。對于嵌入式系統(tǒng),我們應(yīng)該有所了解。就專業(yè)人員而言,他們對嵌入式系統(tǒng)早已駕輕就熟。為增進(jìn)大家對嵌入式系統(tǒng)的認(rèn)識,本文將對
    的頭像 發(fā)表于 11-22 11:55 ?5302次閱讀
    如何實現(xiàn)<b class='flag-5'>嵌入式</b>系統(tǒng)<b class='flag-5'>遠(yuǎn)程</b>調(diào)試

    嵌入式系統(tǒng)如何進(jìn)行遠(yuǎn)程調(diào)試

    嵌入式系統(tǒng)隨著目前科技的發(fā)展,正逐步融入人們的生活中。對于嵌入式系統(tǒng),我們應(yīng)該有所了解。就專業(yè)人員而言,他們對嵌入式系統(tǒng)早已駕輕就熟。為增進(jìn)大家對嵌入式系統(tǒng)的認(rèn)識,本文將對
    發(fā)表于 12-23 10:39 ?7次下載

    RPC如何在遠(yuǎn)程過程調(diào)用

    RPC(Remote Procedure Call Protocol)即遠(yuǎn)程過程調(diào)用,也就是調(diào)用的函數(shù)是在其它的控制板上運(yùn)行的,不需要理會底層的通訊協(xié)議。
    的頭像 發(fā)表于 02-07 09:52 ?872次閱讀
    RPC如何在<b class='flag-5'>遠(yuǎn)程</b><b class='flag-5'>過程</b>中<b class='flag-5'>調(diào)用</b>?

    嵌入式系統(tǒng)中函數(shù)如何調(diào)用

    嵌入式系統(tǒng)中,一個函數(shù)調(diào)用時,它的內(nèi)部機(jī)理是什么,執(zhí)行了哪些步驟?如圖1所示,先看 看 一個程序在運(yùn)行時,它的內(nèi)存分布狀況。
    的頭像 發(fā)表于 02-13 14:15 ?1044次閱讀
    <b class='flag-5'>嵌入式</b>系統(tǒng)中函數(shù)如何<b class='flag-5'>調(diào)用</b>

    什么是遠(yuǎn)程過程調(diào)用

    開發(fā)環(huán)境:Ubuntu VS Code 編譯器:g++ 編程語言:C++ 框架源碼下載:GitHub 認(rèn)識RPC RPC的全稱是遠(yuǎn)程過程調(diào)用(Remote Procedure Call
    的頭像 發(fā)表于 11-10 10:10 ?1017次閱讀
    什么是<b class='flag-5'>遠(yuǎn)程過程調(diào)用</b>