推荐一款嵌入式Linux开源框架与封装-cpp-tbox

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 推荐一款嵌入式Linux开源框架与封装-cpp-tbox

这里推荐一款嵌入式的cpp框架与封装代码,小而轻量级,很不错的开源代码。

欢迎关注订阅,获取更多开源工具:fensnote


全称: C++ Treasure Box,C++百宝箱,是一个基于 Reactor 模式的服务型 开发框架 与 组件库,旨在让C++开发变得轻松。


应用场景


  • 智能硬件,如:机器人(扫地机、商用服务机器人)、IPC、无人机、车载等;
  • 边缘计算组件,如:智能家居网关、IOT边缘网关等;
  • 后台服务型软件,如:SOCKS5、中间件


参考项目:


特点


1. 基于Reactor模型


参考 Node.js 的 Reactor 模式。

主线程以 Reactor 模式处理非阻塞 IO 事件,并配合 ThreadPool 执行大运算与阻塞性操作。

该模式避免了多线程模式竞态加锁的烦恼,程序稳定可靠。


2. 内含main框架,开箱即用


使用内置的 main 框架处理了所有与业务无关的工作。您不需要关心日志怎么输出、参数怎么解析、程序怎么退出、main函数怎么写这些琐碎的事情。main框架都为您处理好了。


您只需要派生tbox::main::Module类,填写业务代码,然后注册到框架即可。


3. 具有类Shell的命令终端


可以与运行中的服务通过telnet进行交互,令其打印内部数据,或是执行特定的动作。这极大地降低了调试难度。


4. 完备的日志系统


1) 有三种日志输出渠道:stdout + filelog + syslog


  • stdout,将日志通过 std::cout 输出到终端;
  • syslog,将日志通过 syslog() 输出到系统日志;
  • filelog,将日志写入到指定目录下,以格式:前缀.年月日_时分秒.进程号.log 的文件中。文件大小超过1M则另创建新的日志文件。由于写文件效率低,该输出渠道采用前后端模式。


三种渠道可以启动参数中选定一个或同时多种,也可在运行时通过终端更改。


2) 根据日志等级渲染不同颜色,一目了然,内容详尽


日志内容包含了:等级、时间(精确到微秒)、线程号、模块名、函数名、正文、文件名、行号。

方便快速定位问题。


3) 灵活的日志输出过滤器,且能运行时修改


可在程序运行时针对不同的模块单独设置日志等级,如下:


5. 灵活的参数系统,以不变应万变


参数以JSON的格式提供,可以传入任何格式的运行参数,包括:整数、小数、字串、数组、组合参数,满足几乎所有参数传入需求:

在执行时可以使用 -c your_cfg_file.json 导入JSON格式的配置文件。同时还可以使用配合 -s 'xx.yy.zz=vvv' 临时指定参数。


而JSON格式的配置文件还支持include指令,在加载时去包含其它的配置文件。


6. 跨线程委派任务,无需加锁


子线程委托主线程执行:


主线程委托子线程执行:


7. 支持优雅的退出流程


在接收到信号:SIGINT, SIGTERM, SIGQUIT, SIGPWR 时,会有序地执行退出流程,释放资源。做到干净地退出。


8. 有全面的异常捕获机制


当程序出现各种程序异常,如:段错误、断言、总线错误、异常未捕获等,架框会捕获并在日志系统中打印完整的调用栈。面对程序崩溃,不再一脸茫然。效果如下:


9. 有丰富的开发组件


库名 中文名 说明
base 基础库 含日志打印、常用工具等
util 工具库 在业务代码中可能会用到的库
event 事件库 实现了IO,Timer,Signal三种事件驱动,是整个框架的心脏
eventx 事件扩展库 含 ThreadPool 线程池,WorkThread工作线程,TimerPool 定时器池等模块
log 日志输出库 实现了终端、syslog、文件形式的日志输出
network 网络库 实现了串口、终端、UDP、TCP 通信模块
terminal 终端 类似shell的命令终端,可实现运行时与程序进行命令交互
main 主框架 实现了完备的程序启动流程与框架,让开发者只需关心业务代码
run 执行器 是个可执行程序,可加载多个由参数-l xxx指定的动态库,并运行其中的Module
mqtt MQTT客户端库
coroutine 协程库 众所周知,异步框架不方便处理顺序性业务,协程弥补之
http HTTP库 在network的基础上实现了HTTP的Server与Client模块
alarm 闹钟模块 实现了4种常用的闹钟:CRON闹钟、单次闹钟、星期循环闹钟、工作日闹钟
flow 流程模块 含多层级状态机与行为树,解决异步模式下动行流程问题


适用环境


  • Linux 系统;
  • C++11 以上。


下载与构建


准备

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


完成之后,头文件与库文件都在 .staging 目录下。


当然也可以通过指定 STAGING_DIR 对头文件与库文件的生成路径进行指定。

如:

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


完成之后,头文件与库文件都在 $HOME/.tbox 路径下。


方法二:CMake


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


通过指定CMAKE_INSTALL_PREFIX 自定义安装目录(默认安装在/usr/local):

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


使用教程


关于如何使用 cpp-tbox 开发自己的程序,详见教程:

cpp-tbox-tutorials


使用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)


外部库依赖


库名 依赖模块 必需 说明 安装方法
libgtest-dev 所有 单元测试用 sudo apt install libgtest-dev
libgmock-dev 所有 单元测试用 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


配置


你可以决定哪些模块需要构建,哪些不需要。

打开 config.mk 文件,将不需要模块对应 app_y += xxx 屏蔽即可,但要注意模块间的依赖性。


许可


MIT,可免费商用。


反馈途径


  • Issue: 任何问题都欢迎在issue里交流
  • 微信: hevake_lee (备注: cpp-tbox)
  • QQ群: 738084942 (cpp-tbox 技术交流)


代码开源路径


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

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
5月前
|
网络协议 算法 Linux
【嵌入式软件工程师面经】Linux网络编程Socket
【嵌入式软件工程师面经】Linux网络编程Socket
149 1
|
2月前
|
Linux Python
linux 封装 python
linux 封装 python
15 0
|
2月前
|
Linux Python
Linux 下封装 Python
Linux 下封装 Python
16 0
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
传感器 人工智能 网络协议
:嵌入式 Linux 及其用途
【8月更文挑战第24天】
153 0
|
4月前
|
Ubuntu 算法 Linux
嵌入式Linux的学习误区
**嵌入式Linux学习误区摘要** 1. **过度聚焦桌面Linux** - 许多学习者误将大量时间用于精通桌面Linux系统(如RedHat、Fedora、Ubuntu),认为这是嵌入式Linux开发的基石。 - 实际上,桌面Linux仅作为开发工具和环境,目标不应是成为Linux服务器专家,而应专注于嵌入式开发工具和流程。 2. **盲目阅读Linux内核源码** - 初学者在不了解Linux基本知识时试图直接研读内核源码,这往往导致困惑和挫败感。 - 在具备一定嵌入式Linux开发经验后再有针对性地阅读源码,才能有效提升技能。
41 4
|
5月前
|
消息中间件 安全 Java
【嵌入式软件工程师面经】Linux多进程与多线程
【嵌入式软件工程师面经】Linux多进程与多线程
62 1
|
5月前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
45 1
|
12月前
|
消息中间件 缓存 Unix
[面试必备]嵌入式Linux内核开发必须了解的三十道题
[面试必备]嵌入式Linux内核开发必须了解的三十道题
|
Linux
嵌入式Linux QT开发之如何实现获取磁盘空间大小的应用逻辑
嵌入式Linux QT开发之如何实现获取磁盘空间大小的应用逻辑
236 0