加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
    • 應(yīng)用場(chǎng)景
    • 特點(diǎn)
    • 適用環(huán)境
    • 下載與構(gòu)建
    • 使用教程
    • 外部庫(kù)依賴
    • 配置
    • 許可
    • 代碼開(kāi)源倉(cāng)連接
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

推薦一款嵌入式Linux開(kāi)源框架與封裝-cpp-tbox

2024/03/04
2897
閱讀需 11 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

這里推薦一款嵌入式的cpp框架與封裝代碼,小而輕量級(jí),很不錯(cuò)的開(kāi)源代碼。交叉編譯也很方便,模塊化編譯,可根據(jù)需要選擇編譯模塊。

全稱: C++ Treasure Box,C++百寶箱,是一個(gè)基于 Reactor 模式的服務(wù)型?開(kāi)發(fā)框架?與?組件庫(kù),旨在讓C++開(kāi)發(fā)變得輕松。

應(yīng)用場(chǎng)景

??智能硬件,如:機(jī)器人(掃地機(jī)、商用服務(wù)機(jī)器人)、IPC、無(wú)人機(jī)、車(chē)載等;

??邊緣計(jì)算組件,如:智能家居網(wǎng)關(guān)、IOT邊緣網(wǎng)關(guān)等;

??后臺(tái)服務(wù)型軟件,如:SOCKS5、中間件

參考項(xiàng)目:

??cpp-socks5[5];

特點(diǎn)

1. 基于Reactor模型

參考 Node.js 的 Reactor 模式。

主線程以 Reactor 模式處理非阻塞 IO 事件,并配合 ThreadPool 執(zhí)行大運(yùn)算與阻塞性操作。

該模式避免了多線程模式競(jìng)態(tài)加鎖的煩惱,程序穩(wěn)定可靠。

2. 內(nèi)含main框架,開(kāi)箱即用

使用內(nèi)置的 main 框架處理了所有與業(yè)務(wù)無(wú)關(guān)的工作。您不需要關(guān)心日志怎么輸出、參數(shù)怎么解析、程序怎么退出、main函數(shù)怎么寫(xiě)這些瑣碎的事情。main框架都為您處理好了。

您只需要派生tbox::main::Module類(lèi),填寫(xiě)業(yè)務(wù)代碼,然后注冊(cè)到框架即可。

3. 具有類(lèi)Shell的命令終端

可以與運(yùn)行中的服務(wù)通過(guò)telnet進(jìn)行交互,令其打印內(nèi)部數(shù)據(jù),或是執(zhí)行特定的動(dòng)作。這極大地降低了調(diào)試難度。

shell交互示例

4. 完備的日志系統(tǒng)

1) 有三種日志輸出渠道:stdout + filelog + syslog

??stdout,將日志通過(guò)?std::cout?輸出到終端;

??syslog,將日志通過(guò)?syslog()?輸出到系統(tǒng)日志;

??filelog,將日志寫(xiě)入到指定目錄下,以格式:前綴.年月日_時(shí)分秒.進(jìn)程號(hào).log?的文件中。文件大小超過(guò)1M則另創(chuàng)建新的日志文件。由于寫(xiě)文件效率低,該輸出渠道采用前后端模式。

三種渠道可以啟動(dòng)參數(shù)中選定一個(gè)或同時(shí)多種,也可在運(yùn)行時(shí)通過(guò)終端更改。

2) 根據(jù)日志等級(jí)渲染不同顏色,一目了然,內(nèi)容詳盡

日志內(nèi)容包含了:等級(jí)、時(shí)間(精確到微秒)、線程號(hào)、模塊名、函數(shù)名、正文、文件名、行號(hào)。

方便快速定位問(wèn)題。

日志打印展示

3) 靈活的日志輸出過(guò)濾器,且能運(yùn)行時(shí)修改

可在程序運(yùn)行時(shí)針對(duì)不同的模塊單獨(dú)設(shè)置日志等級(jí),如下:

設(shè)置日志等級(jí)

5. 靈活的參數(shù)系統(tǒng),以不變應(yīng)萬(wàn)變

參數(shù)以JSON的格式提供,可以傳入任何格式的運(yùn)行參數(shù),包括:整數(shù)、小數(shù)、字串、數(shù)組、組合參數(shù),滿足幾乎所有參數(shù)傳入需求:

參數(shù)help

在執(zhí)行時(shí)可以使用?-c your_cfg_file.json?導(dǎo)入JSON格式的配置文件。同時(shí)還可以使用配合?-s 'xx.yy.zz=vvv'?臨時(shí)指定參數(shù)。

而JSON格式的配置文件還支持include指令,在加載時(shí)去包含其它的配置文件。

6. 跨線程委派任務(wù),無(wú)需加鎖

子線程委托主線程執(zhí)行:

runInLoop示例

主線程委托子線程執(zhí)行:

ThreadPool示例

7. 支持優(yōu)雅的退出流程

在接收到信號(hào):SIGINT, SIGTERM, SIGQUIT, SIGPWR 時(shí),會(huì)有序地執(zhí)行退出流程,釋放資源。做到干凈地退出。

友好地退出

8. 有全面的異常捕獲機(jī)制

當(dāng)程序出現(xiàn)各種程序異常,如:段錯(cuò)誤、斷言、總線錯(cuò)誤、異常未捕獲等,架框會(huì)捕獲并在日志系統(tǒng)中打印完整的調(diào)用棧。面對(duì)程序崩潰,不再一臉茫然。效果如下:

異常棧打印

9. 有豐富的開(kāi)發(fā)組件

庫(kù)名 中文名 說(shuō)明
base 基礎(chǔ)庫(kù) 含日志打印、常用工具等
util 工具庫(kù) 在業(yè)務(wù)代碼中可能會(huì)用到的庫(kù)
event 事件庫(kù) 實(shí)現(xiàn)了IO,Timer,Signal三種事件驅(qū)動(dòng),是整個(gè)框架的心臟
eventx 事件擴(kuò)展庫(kù) 含 ThreadPool 線程池,WorkThread工作線程,TimerPool 定時(shí)器池等模塊
log 日志輸出庫(kù) 實(shí)現(xiàn)了終端、syslog、文件形式的日志輸出
network 網(wǎng)絡(luò)庫(kù) 實(shí)現(xiàn)了串口、終端、UDPTCP 通信模塊
terminal 終端 類(lèi)似shell的命令終端,可實(shí)現(xiàn)運(yùn)行時(shí)與程序進(jìn)行命令交互
main 主框架 實(shí)現(xiàn)了完備的程序啟動(dòng)流程與框架,讓開(kāi)發(fā)者只需關(guān)心業(yè)務(wù)代碼
run 執(zhí)行器 是個(gè)可執(zhí)行程序,可加載多個(gè)由參數(shù)-l xxx指定的動(dòng)態(tài)庫(kù),并運(yùn)行其中的Module
mqtt MQTT客戶端庫(kù)
coroutine 協(xié)程庫(kù) 眾所周知,異步框架不方便處理順序性業(yè)務(wù),協(xié)程彌補(bǔ)之
http HTTP庫(kù) 在network的基礎(chǔ)上實(shí)現(xiàn)了HTTP的Server與Client模塊
alarm 鬧鐘模塊 實(shí)現(xiàn)了4種常用的鬧鐘:CRON鬧鐘、單次鬧鐘、星期循環(huán)鬧鐘、工作日鬧鐘
flow 流程模塊 含多層級(jí)狀態(tài)機(jī)與行為樹(shù),解決異步模式下動(dòng)行流程問(wèn)題

適用環(huán)境

??Linux 系統(tǒng);

? C++11 以上。

下載與構(gòu)建

準(zhǔn)備

sudo?apt?update
sudo?apt?install?build-essential
sudo?apt?install?libgtest-dev?libgmock-dev
sudo?apt?install?libmosquitto-dev
sudo?apt?install?libdbus-1-dev

git?clone?https://gitee.com/cpp-master/cpp-tbox.git
cd?cpp-tbox

方法一:GNU Make

make?3rd-party?modules?RELEASE=1

完成之后,頭文件與庫(kù)文件都在 .staging 目錄下。
當(dāng)然也可以通過(guò)指定?STAGING_DIR?對(duì)頭文件與庫(kù)文件的生成路徑進(jìn)行指定。
如:

make?3rd-party?modules?RELEASE=1?STAGING_DIR=$HOME/.tbox

完成之后,頭文件與庫(kù)文件都在 $HOME/.tbox 路徑下。

方法二:CMake

cmake?-B?build
cmake?--build?build
cmake?--install?build

通過(guò)指定CMAKE_INSTALL_PREFIX?自定義安裝目錄(默認(rèn)安裝在/usr/local):

cmake?-B?build?-DCMAKE_INSTALL_PREFIX=$HOME/.tbox

使用教程

關(guān)于如何使用 cpp-tbox 開(kāi)發(fā)自己的程序,詳見(jiàn)教程:?cpp-tbox-tutorials[6]

使用find_package的例子:

cmake_minimum_required(VERSION?3.10)
project(tbox-find_package)
find_package(tbox?COMPONENTS?base?util?alarm?event?eventx)
add_executable(demo?main.cpp)
target_link_libraries(demo?PRIVATE?tbox::tbox_base?tbox::tbox_util?tbox::tbox_alarm?tbox::tbox_event?tbox::tbox_eventx)

外部庫(kù)依賴

庫(kù)名 依賴模塊 必需 說(shuō)明 安裝方法
libgtest-dev 所有 單元測(cè)試用 sudo apt install libgtest-dev
libgmock-dev 所有 單元測(cè)試用 sudo apt install libgmock-dev
libmosquitto-dev mqtt no MQTT sudo apt install libmosquitto-dev
libdbus-1-dev dbus no DBus sudo apt install libdbus-1-dev

配置

你可以決定哪些模塊需要構(gòu)建,哪些不需要。
打開(kāi) config.mk 文件,將不需要模塊對(duì)應(yīng)?app_y += xxx?屏蔽即可,但要注意模塊間的依賴性。

許可

MIT[7],可免費(fèi)商用。

代碼開(kāi)源倉(cāng)連接

代碼碼云:https://gitee.com/cpp-master/cpp-tbox?_from=gitee_search

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
S29AL016J70TFI020 1 Cypress Semiconductor Flash, 1MX16, 70ns, PDSO48, TSOP-48
$10.3 查看
ABCU-5710RZ 1 Broadcom Limited Transceiver, 1250Mbps(Tx), 1250Mbps(Rx), RJ-45 Connector, Board/panel Mount, ROHS COMPLIANT, PLASTIC PACKAGE-20
$89.89 查看
FOD4208SD 1 Fairchild Semiconductor Corporation Triac Output Optocoupler, 1-Element, 5000V Isolation, LEAD FREE, SURFACE MOUNT PACKAGE-6
$4.14 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

專(zhuān)注嵌入式Linux應(yīng)用開(kāi)發(fā),C/C++技術(shù)交流;Qt編程技術(shù)交流。