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

2024-03-04 13:28

本文主要是介绍推荐一款嵌入式Linux开源框架与封装-cpp-tbox,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这里推荐一款嵌入式的cpp框架与封装代码,小而轻量级,很不错的开源代码。
欢迎关注订阅,获取更多开源工具:fensnote

在这里插入图片描述

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

应用场景

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

参考项目:

  • cpp-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
mqttMQTT客户端库
coroutine协程库众所周知,异步框架不方便处理顺序性业务,协程弥补之
httpHTTP库在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-devgit 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-devmqttnoMQTTsudo apt install libmosquitto-dev
libdbus-1-devdbusnoDBussudo apt install libdbus-1-dev

配置

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

许可

MIT,可免费商用。

反馈途径

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

鼓励我们

如果这个项目让您的工作更轻松、下班更早了,请您给我更多的鼓励。
你可以做这些:

  • 给它点亮三连: Star, Watch, Fork;
  • 向身边的同事与伙伴推荐,在技术论坛向您的读者推荐;
  • 加入上面的QQ群、加我微信进入微信群;
  • 积极反馈问题,提出建议;
  • 参与项目的开发,贡献您的力量;
  • 让我知道它被运用到了哪些的项目上;

代码开源路径

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

这篇关于推荐一款嵌入式Linux开源框架与封装-cpp-tbox的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773307

相关文章

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法

《ElasticSearch+Kibana通过Docker部署到Linux服务器中操作方法》本文介绍了Elasticsearch的基本概念,包括文档和字段、索引和映射,还详细描述了如何通过Docker... 目录1、ElasticSearch概念2、ElasticSearch、Kibana和IK分词器部署

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

MySql9.1.0安装详细教程(最新推荐)

《MySql9.1.0安装详细教程(最新推荐)》MySQL是一个流行的关系型数据库管理系统,支持多线程和多种数据库连接途径,能够处理上千万条记录的大型数据库,本文介绍MySql9.1.0安装详细教程,... 目录mysql介绍:一、下载 Mysql 安装文件二、Mysql 安装教程三、环境配置1.右击此电脑

Linux环境变量&&进程地址空间详解

《Linux环境变量&&进程地址空间详解》本文介绍了Linux环境变量、命令行参数、进程地址空间以及Linux内核进程调度队列的相关知识,环境变量是系统运行环境的参数,命令行参数用于传递给程序的参数,... 目录一、初步认识环境变量1.1常见的环境变量1.2环境变量的基本概念二、命令行参数2.1通过命令编程