最近在忙乙個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.哇哦,與grpc面向通用tcp網路不同,erpc就是面向嵌入式系統設計的。體積還很小(根據官方介紹可以小到5kb)。完美,下面的事情就是入門學習了。erpc (embeddedreprocedure-call)是乙個面向多晶元嵌入式系統和異構多核soc的開源rpc框架。
erpc目前支援的傳輸層如下,除了我不認識的協議外,主要就是串列埠通訊和tcp/ip了,tcp/ip主要用於測試:
supported transports:也就是說我們可以在不依賴具體裝置的情況通過使用tcp/ip傳輸層模擬串列埠,就可以x86平台的電腦上實現rpc呼叫的兩端(client/server)的模擬通訊了。採用這方式無疑可以大大提高開發效率–不需要所有的測試都在具備硬體裝置上執行,pc模擬可以快捷方便的完成很多事件。cmsis uart
nxp kinetis spi and dspi
posix and windows serial port
tcp/ip (mostly for testing)
nxp rpmsg-lite
於是我們重新開始在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.在元...