前言
2023年Zephyr开发者大会(ZDS)于6月27日至30日在捷克布拉格隆重举行。与以往两次不同,本次ZDS由Zephyr项目规划和管理,并作为首届嵌入式开源峰会(EOSS)的一部分进行。在这个令人期待已久的盛会中,全球Zephyr开发者们共同探讨了Zephyr实时操作系统(RTOS)的最新技术与发展趋势。作为一款开源、灵活和可扩展的嵌入式实时操作系统,Zephyr项目在2014年由英特尔发起,2016年作为Linux基金会项目正式面向公众启动,得到了全球范围内的广泛关注和采用。
ZDS 2023共70余个技术报告,涵盖了使用指导与展示、新功能与技术、架构修改与操作系统、多核异构与虚拟化、模拟器、测试、工业流程与代码管理、安全性、应用案例、工具与调试等丰富多样的内容。湖大嵌入式实验室的小伙伴们将对本次大会的所有技术报告进行逐一收集、整理与分享,尽最大努力为Zephyr开发者提供ZDS 2023技术报告的开发经验、实践成果以及解决方案的参考。
今天分享第47篇技术报告,由罗健淳整理,题目为:
“在Zephyr中使用Thrift RPC框架”
作者简介

Christopher Friedt是一个富有创造力的团队负责人。在他超过18年的职业生涯中,他已经发布了7款被全球数以百万计的消费者使用的移动电话,发布了数以万计的工业无线设备,并带领4家领先的加拿大科技公司完成了重要的软件重构过程。他是许多开源软件项目的重要贡献者,包括Linux内核和Zephyr实时操作系统。他喜欢在会议上发表关于从虚拟机到软件定义无线电的主题演讲。Chris目前的兴趣在于实时操作系统和推动无线物联网可能性的边界。Chris在Zephyr社区的角色包括LTSv2发布管理者,POSIX&FPGA维护者,并在其他多个领域担任合作者。Chris被列入Zephyr 2020年度十大社区贡献者。
文章简介
Apache Thrift远程过程调用(RPC)框架是Zephyr生态系统的近期新增项,从Zephyr v3.3版本开始得到支持。Thrift最初在2007年由Facebook开发,它是一个IDL规范,RPC框架和代码生成器。Thrift支持所有主要的操作系统,28种编程语言,7种协议和6种底层传输。Thrift支持丰富的类型和数据结构,并抽象传输和协议细节,让开发人员可以专注于应用逻辑。本次演讲将强调:使用.thrift文件示例展示的语言特性;Thrift如何降低开发量(例如,通过代码生成);何时考虑使用Thrift;将Thrift纳入持续集成。最后,将通过一个简短的互动演示来展示使用Thrift在Zephyr RTOS上开发的便捷程度。
在Zephyr中使用Thrift RPC框架
什么是Thrift?
Thrift是一个远程过程调用(RPC)框架,由Facebook(现为Meta)于2006年至2007年创建,并于2007年发布到Apache软件基金会。Thrift不仅支持基本类型,如bool,i32,和double,还支持丰富的类型,如enum,list,map,和struct。它还支持多种协议,如二进制协议,压缩二进制协议,以及例如JSON等格式。Thrift适用于所有主流操作系统,支持27种编程语言。

Thrift解决了私有和随意编排二进制协议的问题,避免了重复构建类似于TCP的协议。同时,它提供了一个解决方案来实现可靠的异步通信。Sun RPC可以被看作是RPC系统的先驱。尽管Sun RPC为许多项目提供了服务,但是其版本兼容性问题使得每个消息都需要一个版本,这导致了许多问题。因此Protobufs、Thrift和gRPC通过移除消息版本来提高跨版本的兼容性,并在SunRPC“衰落”之后开始流行。

Thrift在Zephyr中的应用
Thrift在Zephyr中的移植由Young Mei在2022年的Google Summer of Code项目中完成。该项目支持了二进制协议,压缩二进制协议,Zlib传输(通过uzlib,muzic),以及通过MbedTLS的TLS套接字。它支持所有的Zephyr架构,并实现了所有的Thrift功能。同时,它还提供了多操作系统,多语言的示例。这个项目已经在Zephyr v3.3.0版本中发布。Thrift的优点是它与传输无关,也可以把东西缝合在一起。
移植的挑战
实现过程中面临的挑战包括Zephyr对C++的部分支持,需要对Zephyr SDK进行修改以支持gthr-posix.h,需要实现pthread_create()的动态堆栈支持,需要支持socketpair()(用于测试)等。
Thrift的状态更新与额外工作
fbthrift是Facebook对Apache Thrift的改进,带来了许多C++的增强功能,如全异步、服务器性能提升、使用Google测试框架、使用C++20的std::coroutine、降低延迟、减小代码体积等。

Thrift RPC框架在Zephyr中的使用为异步通信解决方案提供了新的可能性,虽然在集成过程中面临一些挑战,但是通过不断的改进和优化,已经取得了显著的成果。未来,作者将继续在这个方向上深入探索,期待有更多的突破和进步。