技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_自动驾驶

2020年12月26日到27日,Rust开发大会在深圳举行。国汽智控软件研发总监肖猛应邀在大会发表题为《Rust作为汽车软件主语言的探索》的演讲。

肖猛认为,汽车软件需要更好的效率、更高的安全性,和其他软件有很多不同。

传统汽车软件有硬实时的要求,MCU 软件是主要的解决方案;和底层硬件进行交互,跟硬件关联性大;与汽车电子电气架构密切相关;有功能安全方面的要求;数据传输量少但信号复杂;一次发布、很少升级;软件开发流程复杂而严格,还要考虑开发、工厂刷写、4S店维护的全生命周期管理;Classic AutoSar 逐渐成为 ECU开发的规范,但成本非常高。

由于自动驾驶的兴起,汽车软件正在经历分水岭。现代汽车软件带来了新要求,如硬件平台的异构分布式要求;感知算法带来极高的算力要求;自动驾驶、娱乐系统带来海量数据传输需求;自动驾驶应用带来更高的功能复杂度;汽车实时在线的要求;更复杂的信息安全和功能安全要求。

尤其是在自动驾驶、智能座舱逐渐成为汽车标配,“软件定义汽车”已经成为行业共识的大环境下,汽车技术中软件所占的比重将会越来越大,软件的复杂度越来越高,越来越多的软件开发者将进入汽车软件领域。那么,选用更合适的开发语言,将会成倍地提高开发效率和软件质量。

目前汽车软件还是主要基于 C/C++。但是C++的复杂性使得人员培养难度大,人员技术水平参差不齐,即便使用了20年的程序员也不敢说精通。C++还面临 C++98 标准和 C++11以上标准的鸿沟。C++98标准过于古老,C++11标准吸收了最近20年语言研究的大部分成果,已经几乎是一个全新的语言,但为了兼容C++98,之前标准的弊端也一样被继承下来了,内存错误的噩梦如影随行。

技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_发布订阅_02

技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_发布订阅_03


技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_发布订阅_04

肖猛,国汽智控软件研发总监,20年从桌面到云端到嵌入式的软件架构经验,跨通讯、游戏、金融、智能网联汽车多个行业领域系统分析专家、全栈软件架构专家


Rust的安全性和执行效率使得它非常适合用于汽车软件的开发。作为系统级语言,近5年来已经逐步开始应用于实时数据库、嵌入式开发、操作系统开发、游戏开发等领域。微软、Facebook、华为等大厂都已经开始接受并推动 Rust的发展。Rust一方面具有C/C++级别的运行效率,相比 C/C++又有更好的安全性,编译器帮助解决了绝大部分内存安全问题。同时,最近二十年来,程序语言研究的最新成果,都在 Rust中有很好体现。在尤为注重质量和运行效率的汽车软件领域,Rust是 C/C++的最佳替代者。

一方面,Rust 可以用于替换 C/C++ 代码,实现效率与安全的并重;另一方面,因为它强大的表达能力,可以给复杂的汽车软件提供新的开发思路。比如,在其他行业广泛使用的 DSL (领域专用语言)技术,一般多基于 JVM 语言实现,而JVM 在垃圾回收过程中出现的系统冻结问题,在汽车软件中是绝对不允许的,因此 DSL 这种大大简化领域软件开发的方式,在汽车软件开发中闻所未闻。如果使用 Rust ,我们可以利用Rust 宏直接操作 AST (抽象语法树)的能力,这样可以定制化语法,实现内部 DSL(使用宿主语言的语法机制实现看起来定制的语法)。直接在语言级增加行业领域的概念。比如一个自动驾驶应用,其规划决策的规则就可以直接使用 DSL 来表达。这可以大大简化应用的开发,还没有执行效率的损耗。

同时 Rust一样可以用于MCU软件的开发。这个领域一直是C语言的绝对地盘。原因就是其它语言很难直接操作硬件,对于MCU这样需要硬实时的领域无能为力。使用 Rust,一样能达到硬实时要求并提供完美的内存安全机制,可以使用诸多的现代语言特性让代码有更好的结构和表达能力。

肖猛分享了他在实际项目中基于Rust语言进行的中间件软件开发探索。 

技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_自动驾驶_05

上图是将Rust用于自动驾驶ECU中间件软件的实例。完成自动驾驶功能的汽车控制器一般会分为 SoC和 MCU 两部分。MCU 部分使用 RTOS, 执行实时性要求最高的控制算法,达到功能安全需要的 ASIL 等级。SoC 部分运行 Linux, 利用Linux 系统完善的软件生态。Linux 上使用发布订阅服务,将系统中数据发送者和接收者解耦和。

此系统中,发布订阅服务完全使用 Rust 实现,实现机制完全基于 Actor 模型,使用了Rust社区知名的 Actor 库 Actix。中间件的底层 IPC 通讯使用 Apache Thrift 的 Rust 版本,提供了共享内存数据通道,让单系统内的多进程能得到更高效的数据传递。 

技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_发布订阅_06

在这个设计中,Rust 语言本身提供了内存安全机制,保证绝大部分内存问题在编译期间被解决,Actor 设计模式一方面能提供高效的并发模型,另一方面,其监督者机制能够让出问题的 Actor 随时被重启而不影响系统的功能,从软件架构层级提高了软件的稳定性。Thrift可以跨多种语言使用,让测试人员可以使用 Python在系统外使用发布订阅服务,对各软件节点进行数据的注入并检查处理的结果。    

技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_自动驾驶_07

这个设计中另一个亮点就是发布订阅服务在RTOS中的实现。他们开发了一个可以运行在 RTOS 中的轻量级 "Thrift运行时" 的 C 语言实现,以及对应的代码生成工具,可以根据 Thrift IDL 生成 C 代码。这样 RTOS 中的各个 Task 之间可以根据 Topic 实现数据的发布和订阅。    

技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_自动驾驶_08

同时实现了Linux 和 RTOS 之间的数据桥接。对同一个 Topic 的发布和订阅,可以跨越系统边界。也就是说,在 RTOS 中发布的数据,在 Linux 中也可以订阅到,反之亦然。这样可以简化各层软件之间的通讯模型。而且还带来一个附加的好处,就是可以在 RTOS 外通过对消息的发布订阅,来测试 RTOS 下软件的行为。

肖猛表示,这个项目只是一个轻量级的发布订阅服务的实现。Rust 和 Actor 模式为系统提供了高性能和高稳定性。开销也非常小。这只是将 Rust 语言用于汽车软件的初步尝试,取得了非常好的效果。他们正计划将 Rust 用于更多的场景。例如,在系统底层,使用 Rust开发 MCU软件乃至 RTOS;在应用层,使用 Rust定制自动驾驶应用的 DSL,简化应用开发。

随着Rust的进一步发展和推广,生态的进一步完善,会有越来越多的人了解到它的优势,愿意学习并应用它。在可见的未来,Rust一定会成为汽车软件开发的主流语言。

关于国汽智控

国汽智控(北京)科技有限公司基于顶层设计、优势人才、科技创新和重磅资源,研发智能网联汽车基础平台产品并实现产业化落地。公司注册成立于2020年7月,总部位于北京经济技术开发区,在北京、上海、硅谷均设有研发中心。核心产品包括智能汽车操作系统及计算基础平台、异构分布硬件平台、车路云协同基础软件等。


技术分享 | 国汽智控软件研发总监肖猛《Rust作为汽车软件主语言的探索》_发布订阅_09