当前位置:首页 > 嵌入式 > 嵌入式大杂烩
[导读]在来腾讯之前,我是没有真正用C开发过一个完整的项目的,然后,赶鸭子上架,鹅厂的人特别喜欢用C,而且用的特别好。我这次推荐一个开源的C项目,希望喜欢C,或者想往C方向发展的同学可以看看。面向过程一定是偏向底层的,面向对象一定是偏向应用的,别杠!下面介绍下这个C开源项目项目名称: W...

在来腾讯之前,我是没有真正用C 开发过一个完整的项目的,然后,赶鸭子上架,鹅厂的人特别喜欢用C ,而且用的特别好。我这次推荐一个开源的C 项目,希望喜欢C ,或者想往C 方向发展的同学可以看看。


面向过程一定是偏向底层的,面向对象一定是偏向应用的,别杠!



下面介绍下这个C 开源项目


项目名称: Workflow


项目地址:https://github.com/sogou/workflow






这个项目适合用于什么场景


这个项目是搜狗的服务器引擎,几乎搜狗所有的后端C 服务和其他几十家公司都在使用这个引擎,每日处理超百亿请求。


不仅如此,该项目绝对也非常适合在嵌入式应用上实现网络的框架设计,框架设计是一个项目成功与否非常重要的环节,而网络在AIOT、智能家居、智能硬件上尤其重要。


比如我们在项目中需要使用http,Workflow在设计上可以通过Cmake配置支持windows 或者 Linux 或 MacOS 等多个平台上的多个项目编译,而且,在不同平台上保持相同的接口。


如果你新增一个嵌入式设备,比如ESP32,在服务器和客户端,你只需要维护一套代码,就可以完成自己的应用需求。


真正做到把云端的技术移植到嵌入式设备上运行。




适用于嵌入式几大特点




1. ⽀持多平台、多体系结构


多平台是⼀个⾮常重要的特性,多平台的代码说明在配置和耦合上考虑了很多设计上的细节。⽬前Workflow除了Linux、Windows、MacOS、Android以外,还可以愉快地在树莓派、国产⻰芯处理器等不同体系结构上运⾏。


2. 编译快


Workflow除OpenSSL以外不依赖其他库,⽽且在接⼝层是没有模版的,因此编译速度⾮常快,不到⼀分钟即可编出⼀个可⽤的lib。


3. 体积⼩、⽀持编译裁剪


Workflow的Kafka协议默认是不编译的,除此之外,还可以裁剪掉其他不常⽤的模块。


⽐如:


make REDIS=n MYSQL=n UPSTREAM=n

并且可以通过strip命令去掉符号链接,即可让库⽂件缩⼩到400k左右。


4. 运⾏时内存⼩、调度快


作为⼀个异步调度的库,Workflow调度性能⼀直是⾮常好的。另外运⾏时内存占⽤也⾮常的⼩。



在默认配置下,tutorial 下的 helloworld server 服务占用内存大小测试


运行服务



查找进程号



查看内存占用,物理内存占用在3824kb




5. ⾃定义协议⾮常⽅便


另外,社区活跃以及项目负责人积极回复问题我觉得也是一个亮点,如果在框架搭建和移植上出现问题,在社区上提问都会得到快速响应。







细说编译与自定义协议


开源应该是我推荐最主要的原因,还有一个原因是,这个项目非常适合在一些大型的嵌入式项目中使用。


我之前创业,在通讯协议上花了很长的时间,如果当时发现这个项目,我觉得套用这个框架,可能会轻松很多。这个项目使用Cmakefile来配置,之前发的Cmakefile文档我觉得也是对大家有用的。


嵌入式杂谈之makefile补充

Cmake确实应该用到的时候再学



我当时创业的项目就是存在很多客户端,然后嵌入式客户端会和服务器进行交互数据。因为这个原因,我们就自己定义协议,并在我们自己的协议上做了很多规避措施,当然,这些措施都没有经过时间的捶打。


但Workflow的这个⾃定义协议的例⼦,直接在教程⾥就给出了,感兴趣的朋友可以下载完后


通过以下命令,即可编译出⼀个⾃定义协议的server和client:


make
cd tutorial
make
./tutorial-10-user_defined_protocol/server

另⼀个窗⼝执⾏client,即可通信:


./tutorial-10-user_defined_protocol/client

执行过程:




移植到嵌入式设备的开源支持




据悉⽬前已经有许多⽤户⽤到了嵌⼊式上了。我到github上翻阅发现,遇到问题的时候,官方还特别耐心的解释,真的很不错,这才是做技术该有的样子嘛~






项目的例程



官方给的实例比较多,新手的同学建议都看看,从这些东西入手会让自己更快进入状态。





一个简单的Client 和 Server 端的代码


服务端:


#include 
#include "workflow/WFHttpServer.h"

int main() {
    WFHttpServer server([](WFHttpTask *task) {
        task->get_resp()->append_output_body("Hello World!");
    })
;
    if (server.start(8888) == 0) { // start server on port 8888
        getchar(); // press "Enter" to end.
        server.stop();
    }
    return 0;
}

客户端:


int main(int argc, char *argv[]) {
    
    WFMySQLTask *task = WFTaskFactory::create_mysql_task(url, RETRY_MAX, mysql_callback);
    task->get_req()->set_query("SHOW TABLES;");
    
    task->start();
}


任务流框架设计


在作者的设计理念中,一切业务逻辑皆是任务,多个任务会组成任务流,任务流可组成图,这个图可能是串联图,可能是并联图,也有可能是串并联图,类似于这种:



也有可能是这种复杂的DAG图:



当然图的层次结构可由用户自定义,个人认为框架最牛逼的一点就是支持动态创建任务流。


这个项目大概就介绍到这里


再说下这个项目的资料汇总


参考资料:


https://zhuanlan.zhihu.com/p/358869362

https://zhuanlan.zhihu.com/p/165638263


项目地址如下:


https://github.com/sogou/workflow 也可以点击
阅读原文直达。



在访问GitHub遇到困难时,可使用他们的Gitee官方仓库:


https://gitee.com/sogou/workflow


感觉这个项目值得学习的话就给人家个star,不要白嫖哈,对项目团队来说也是一种认可和鼓励。


往期推荐:

往期推荐



串口发送有几种写法?

基于硬件 SPI 的数据抽象实例(附代码)

基于模拟 I2C 的数据抽象实例(附代码)

改变嵌软开发思维方式之:基于单总线的数据抽象实例

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭