erpc EmbeddedRPC 入門筆記

2021-10-05 04:41:43 字數 4400 閱讀 9085

最近在忙乙個iot裝置的專案,想設計乙個通訊系統通過串列埠控制裝置(freertos)的執行。按照傳統的設計思路,先要定義一套串列埠通訊協議,在這套協議中傳輸層協議、應用層協議乙個都不能少。每一層協議都要自己實現。資料編碼/解碼,資料校驗,容錯,這些非常基礎的東西都要自己實現。

等這些協議都實現了,才是能開始設計真正的業務邏輯。

和同事商議後,一致認為要是照這麼幹,黃花菜都涼了。我們的生命不能浪費在這些無意義的勞動上!

我想到了rpc概念是適用於我們的應用場景的。實際我們就是在串列埠上實現乙個客戶端請求->服務端響應的模型。除了傳輸層是序列通訊,這與我們一般在tcp/ip網路上常見的client/server模型沒啥區別,就是1對1簡化版的client/server模型。比如也許google的基於protocol bufffers的grpc就能滿足要求。如果能利用現成的開發框架,可以大大減化開發流程,減少開發時間。

定義下了rpc這個開發方向後我和同事分頭去網上找相關資料,進行開發框架的選型調研。最終同事找到了恩智浦(nxp)的開源專案erpc(embeddedrpc)。看到這個專案說明,我感覺它就是為我們量身定做的。

erpc (embedded rpc) is an open source remote procedure call (rpc) system for multichip embedded systems and heterogeneous multicore socs.

erpc (embeddedreprocedure-call)是乙個面向多晶元嵌入式系統和異構多核soc的開源rpc框架。

哇哦,與grpc面向通用tcp網路不同,erpc就是面向嵌入式系統設計的。體積還很小(根據官方介紹可以小到5kb)。完美,下面的事情就是入門學習了。

erpc目前支援的傳輸層如下,除了我不認識的協議外,主要就是串列埠通訊和tcp/ip了,tcp/ip主要用於測試:

supported transports:

cmsis uart

nxp kinetis spi and dspi

posix and windows serial port

tcp/ip (mostly for testing)

nxp rpmsg-lite

也就是說我們可以在不依賴具體裝置的情況通過使用tcp/ip傳輸層模擬串列埠,就可以x86平台的電腦上實現rpc呼叫的兩端(client/server)的模擬通訊了。採用這方式無疑可以大大提高開發效率–不需要所有的測試都在具備硬體裝置上執行,pc模擬可以快捷方便的完成很多事件。

於是我們重新開始在ubuntu 16.04下開始了erpc搭建通訊框架的過程

安裝依賴庫

# install flex & bison

sudo

apt-get

install flex bison

# install boost

sudo

apt-get

install libboost-dev libboost-system-dev libboost-filesystem-dev

轉殖erpc 專案到本地(erpc資料夾)

git clone .git
erpcgen是idl編譯器,用於將.erpc字尾的介面定義(idl)檔案生成對應的client/server**。

進入erpc/erpcgen子專案編譯erpcgen並安裝到/usr/local/bin下:

cd erpc/erpcgen

make -j8

sudo

make

install

note:-j8為並行編譯選項,指定使用8個執行緒同時編譯,以加快編譯速度

erpc/erpc_c下是erpc的核心庫,需要編譯供後續專案使用

cd erpc/erpcgen

make -j8

# 預設安裝到 /usr/local/include/erpc /usr/local/lib

sudo

make

install

上面的一切都準備就緒了,介面定義就是我們最關注的業務邏輯了,如下定義乙個簡單的idl,這個介面中只有乙個函式:

erpcdemo.erpc

/*! 定義專案名稱,也是所有生成的原始碼檔名字首 */

program erpcdemo

/*! 定義返回狀態列舉型別 */

enum lockerrors_t

/*! 定義服務介面函式 */

inte***ce demo

idl語法參見erpc官方文件:

《idl reference(/wiki/idl-reference)》

根據介面定義檔案erpcdemo.erpc生成對應的client/server**

erpcgen erpcdemo.erpc
note:事前必須先執行erpcgen編譯安裝。

生成的檔案列表:

erpcdemo.h

erpcdemo_client.cpp

erpcdemo_server.cpp

erpcdemo_server.h

基於上述生成的**可以很簡單的寫出client端測試程式

/*

* test_erpcdemo_client.c

* * created on: apr 14, 2020

* author: guyadong

*/#include

#include

#include

#include

#include

"erpcdemo.h"

#include

"erpc_setup_tcp.h"

using

namespace std;

// 釋放binary占用的空間

static

void

free_binary_t_struct

(binary_t * data)

}int

main

(int argc,

char

*ar**)

;/* 關閉socket */

erpc_transport_tcp_deinit()

;}

基於上述生成的**可以很簡單的寫出server端測試程式,與client測試程式不同的是,server端要提供介面函式的具體實現

/*

* test_erpcdemo_server.cpp

* * created on: apr 15, 2020

* author: guyadong

*/#include

#include

#include

#include

#include

#include

#include

#include

"erpcdemo_server.h"

#include

"erpc_setup_tcp.h"

using

namespace std;

/** 返回當前時間字串 */

static std::string now_str()

/** servicer端實現介面方法 */

binary_t *

rd_demohello

(const binary_t * txinput);}

intmain

(int argc,

char

*ar**)

分別編譯 test_erpcdemo_server.cpp,test_erpcdemo_client.cpp,我們就有了在linux下執行的乙個最簡單的基於erpc的rpc演示系統。

如果你會用cygwin,就不必要在ubuntu下執行,可以在windows平台 cygwin terminal下執行上述所有過程。上面的截圖就是windows下的cygwin 終端執行的效果

在上面的過程中,涉及資料傳輸,序列化,反序列,校驗等等底層的細節都由erpc完成了。我們只是關注於定義業務介面本身,確實方便了好多啊。

html 設定header html的入門筆記1

提到html,就不得不提及它的發展史。html是在1990年左右誕生的,是由乙個叫tim berners lee的人發明的。在2004年,他被英國女皇授予大英帝國爵級司令勳章,在2017年,被頒發圖靈獎。他在當時寫了世界上第乙個瀏覽器,第乙個伺服器。並用自己的瀏覽器成功的訪問了自己的伺服器。他發明的...

python入門for迴圈 列表 深淺拷貝筆記

三 深淺拷貝 while 基礎語法 核心的目的就是用來重複執行 的邏輯 for迴圈 針對多個資料遍歷檢視 格式 for 臨時遍歷 in 資料 迴圈重複執行 迴圈次數是資料的個數,每迴圈一次會將資料中的第n個位置的資料取出來 for i in python print i range 函式 生成一組整...

HTML入門學習day03筆記

乙個簡單地表單 使用者名稱 密碼真實姓名 email 出生日期 性別男 女 愛好籃球 足球 閱讀 位址江蘇山西 湖南甘肅省蘇州 南京鎮江 淮安 市 區 縣介紹 實現效果為 層疊主要體現在 多個樣式表修飾同乙個元素 他可以繼承 具有優先順序 樣式表為 在html中,css的運用主要有三種方式 1.在元...