车载SOA架构入门

0 阅读12分钟

SOA解决的是什么问题

传统车电子系统靠CAN、LIN总线连接,每个ECU各管一段,按固定周期把数据甩到总线上——车速ECU每20毫秒发一次车速,不管有没有人在听。这套机制简单可靠,车规级实时性要求下用了几十年,问题是所有通信路径在设计阶段就焊死了:哪个ECU用哪个信号,得提前写进代码编译进去,想加一个新功能、让两个不相关模块通信,往往要动一整圈硬编码配置。

SOA要解决的正是这种僵化。把每种能力包装成"服务",提供方声明"我在这儿,能干这个",需要方去发现、订阅、调用——跟互联网微服务架构的思路几乎一样,只是服务器换成了车上的计算单元,网络换成了车内以太网。软件模块之间不用在编译期焊死关系,可以运行时动态发现、动态组合。车企现在讲的"软件定义汽车"——功能OTA增量升级、按需订阅解锁——底层技术基础基本都是这套服务化架构。

谁是服务端,谁是客户端

提供能力的一方是服务提供者:车上某个计算单元跑一段代码,实现"车窗控制"或"车速上报"这类具体能力,通过服务发现机制向网络广播——主流协议SOME/IP自带一套服务发现机制(SOME/IP-SD)专门干这件事。

需要能力的一方是服务消费者。发现网络里有这个服务之后,可以订阅("车速变了通知我",发布/订阅模式),也可以直接调用方法("把车窗放下来",请求/响应模式,跟远程调用没什么区别)。

服务端和客户端不是贴给某个物理设备的固定标签,要看具体这次通信里扮演什么角色。座舱计算单元可能一边对外提供"当前播放媒体信息"服务给别的域用,一边订阅底盘发过来的车速数据——同一个节点同时是服务端也是客户端,很常见。

AUTOSAR是标准,不是系统

AUTOSAR(AUTomotive Open System ARchitecture)常被当成某种操作系统或某家厂商的产品,其实不是。它是2003年一批车企和Tier1供应商(宝马、博世、大陆、戴姆勒、福特、通用、丰田、大众等)联合发起的开发伙伴联盟,产出的是一套标准/规范:定义软件分几层、层间接口怎么定义、怎么配置、怎么生成代码。规范本身跑不起来,真正跑在ECU/DCU上的软件,是Vector、ETAS、Elektrobit这些供应商按规范各自实现出来的商用软件栈,业内叫BSW(基础软件)。跟HTTP、POSIX是同一类东西——协议/标准不是程序,是不同厂商各自实现、彼此兼容的一套约定。

AUTOSAR下面分两套并行规范,面向的硬件和场景完全不同。

**Classic Platform(CP,经典平台)**2005年首次发布,面向发动机控制、刹车控制这类深度嵌入式ECU——实时性、功能安全要求极高,内存和算力极其有限。软件分应用层、RTE(运行时环境)、BSW三层,通常用C写,跑在没有内存保护、没有动态内存分配的简单实时操作系统上(遵循OSEK/VDX这类更早的车规OS规范),配置在编译期就定死,不支持运行时动态加载。

**Adaptive Platform(AP,自适应平台)**2017年底加入AUTOSAR家族,面向算力更强的域控制器和中央计算平台——自动驾驶、座舱这类需要高性能计算、动态更新、服务化通信的场景。跑在POSIX兼容操作系统上(Linux、QNX),支持动态链接、进程隔离,应用间通过ara::com做服务化通信,这正是SOA真正落地的那一层。

两套规范不是谁取代谁,是共存互补:车上真正的实时安全控制(刹车、转向)仍是Classic Platform的地盘,Adaptive Platform负责更"像电脑"的域控制器/中央计算层,两者之间靠网关转换。

中间件:SOME/IP、DDS,具体怎么传数据

Adaptive Platform的ara::com是通信管理API,应用代码不直接调网络接口,而是通过它发布/订阅服务或调远程方法,底层可以接不同传输协议——SOME/IP最常见,也有用DDS的(机器人、ADAS背景的团队更熟DDS)。TSN是以太网层面的确定性时延保障,不是应用层协议,更像是给SOME/IP、DDS托底的网络QoS机制。

ECU和DCU,谁在参与服务化通信

这块最容易讲混。大部分传统ECU本身不参与SOA,还停留在信号广播的老路子上;真正跑服务化通信的是DCU(域控制器)这一层。

以车身域为例:车窗电机、车门锁、座椅调节这些执行器/传感器各挂一个简单ECU,老老实实走CAN/LIN发原始信号。车身域DCU把这堆分散的信号广播数据抓过来,在自己这层聚合抽象,包装成"车窗控制服务""车门状态服务"这类更高层次的服务,再通过SOME/IP走车载以太网对外暴露。特斯拉Model 3是常被引用的例子——三个域控制器(左车身域、右车身域、前车身域)实现了原来五十多个独立ECU才能拼出来的功能,本质是把大量分散的简单节点收编到少数几个强算力DCU底下。

ECU大多是哑的执行/感知节点,不懂服务化通信,只负责把原始数据喂给上面的DCU;DCU才是真正的SOA参与者,一边向下兼容ECU的信号协议做翻译,一边向上/向外用服务化方式跟其他域交互。

"动力域、底盘域、车身域各一个DCU"是几年前那一代域控制器架构的典型划法,不是固定答案。2025到2026年,不少主机厂把这三个偏"控制车本身"的域合并成了"整车域"——原因是三者数据交互太频繁(动力输出要联动底盘扭矩分配、车身稳定控制),分开放三个DCU反而增加跨域延迟和复杂度。合并后行业里更常提的是"三域":整车域、智驾域(感知决策规控)、座舱域(人机交互),比原来五域模型精简不少。更激进的主机厂已经在往"中央计算+区域控制器"再收一步,区域控制器不再对应功能域,纯按物理位置分,退化成I/O网关,下一节具体展开。

架构演进的大方向

公认的演进路径:分布式(每个功能一个独立ECU)→域集中(按功能域归拢到少数DCU,早期典型划法是动力域、底盘域、车身域、座舱域、智驾域五个域)→区域集中(不按功能分,按物理位置分,前区后区左区右区各设一个区域控制器,减少线束长度和数量)→中央计算(收拢到一两台性能强大的中央计算单元,区域控制器退化成纯粹的I/O网关)。SOA是支撑这个演进的关键一环——域和域之间、区域控制器和中央计算单元之间,越来越依赖服务化方式交互,而不是提前焊死的信号表。

"域集中"这一步正在分裂成两条路。一条是先把动力、底盘、车身合并成"整车域",跟智驾域、座舱域并列形成三域架构,不少主机厂已经量产落地。另一条更激进,直接跳到"中央计算+区域控制器",用一台中央超算把整车控制、智驾、座舱功能全部整合进去,区域控制器只按物理位置分,负责线束汇聚和I/O转发。2025-2026年两条路都在推进,没有完全定型,"三域"更像是五域模型走向中央计算之前的过渡形态。

整体架构图

mermaid diagram

这张图想说清楚两件事。一是Binder和SOME/IP的边界:Binder只发生在座舱域这一颗芯片内部,CarService和VHAL是同一个Linux内核上的两个进程,过不了物理芯片边界;VHAL跟整车域、智驾域打交道靠SOME/IP走车载以太网,是两套完全不同的通信,不能画成一条线。二是"整车域/智驾域/座舱域"这个当前主流的三域划分,以及每个域下面挂着什么。它不是某一款具体车型的真实拓扑——真实车上域怎么分、总线怎么走、每个域挂多少ECU,不同主机厂、不同车型差异很大,图里的执行器只列了三个当例子。

跟Android Automotive有什么关系

座舱这颗跑AAOS的芯片,本质上是整车SOA网络里的一个节点,多数时候扮演服务消费者角色——车速、油量、车门状态这些跨域数据,不是自己接传感器拿到的,而是靠VHAL(Vehicle HAL)作为SOME/IP客户端,去订阅整车域(以及智驾域)发布的服务。VHAL把整车SOA网络里流转的服务化数据翻译成VehiclePropertyIds这套Android能理解的属性接口,往上交给CarPropertyManager、CarService,最终到应用手里。

VHAL往外连整车域/智驾域走的是SOME/IP over车载以太网,跟Binder没关系——Binder是Linux内核的进程间通信机制,依赖同一内核里的共享内存映射,过不了芯片边界,座舱芯片没法直接"打Binder"给别的域的芯片。Binder唯一出场的地方是座舱芯片内部:CarService和VHAL是跑在同一颗AAOS芯片、同一个Linux内核上的两个独立进程,它们之间才是Binder;VHAL往外的那一段是完全不同的另一套通信栈,前面的架构图也是照这个边界画的。

Android这边设计成"只有CarService能直连VHAL,其他进程都走Car API代理",是因为VHAL本质上是整车SOA网络在Android域唯一的网关——不该有好几个入口各自连进SOA网络,容易出现状态不一致。跟分布式系统里"网关只能有一个"是同一个道理,只是这里的尺度从一个进程内部放大到了整台车的服务网络。

座舱域芯片内部跑的是什么系统

前面图里"座舱域(跑AAOS)"画得有点简单了。真机上那颗座舱芯片,很少是干干净净只跑一个Android。

网上流传的"QNX主机上装一个Android虚拟机",说的现象是对的,但"主机装虚拟机"这个说法容易让人以为QNX是宿主操作系统,Android是跑在QNX里面的一个App式的东西,这就不对了。实际结构是芯片上先起一层Type-1裸金属Hypervisor,直接管硬件,不挂在任何操作系统下面;Hypervisor之上并排放着几个互相隔离的Guest虚拟机,QNX和Android各占一个,彼此地位是平等的兄弟关系,不是谁装在谁里面。量产车上最常见的做法,是高通8155/8195/8295配QNX Hypervisor——这套Hypervisor本身也是拿QNX Neutrino微内核做出来的,所以QNX那个Guest天然拿到更高的特权级,顺手管了数字仪表这种要过ASIL认证的活,外加一部分硬件I/O的直通;Android被扔进另一个隔离得更死的Guest里,专门扛娱乐、导航、第三方App这些不需要过安全认证、但离不开庞大生态的东西。"QNX主机"这个感觉不是空穴来风,是因为QNX Hypervisor这条路线上QNX确实站得更靠近硬件,换一套别的Hypervisor方案,这个"谁是主"的印象可能就不成立了。

为什么要折腾出这么一套东西:仪表上车速、挡位显示错了是安全事故,必须上通过ASIL认证的实时系统;娱乐导航死机顶多重启一下,用不上那么高的认证,但离不开Android的App生态和迭代速度。放在同一颗芯片上、靠Hypervisor强隔离开,比过去分别塞两颗芯片省成本、省空间、省功耗——业内说的"一芯多屏多系统",大概就是靠这个,一颗座舱芯片同时给仪表屏、中控屏、副驾屏甚至HUD各自撑出一份独立的画面和系统实例。

不过QNX Hypervisor只是众多方案里最常见的一种,不是唯一答案。OpenSynergy的COQOS走的是同一条路子;Linux基金会那套ACRN,底子是KVM,跑的组合可能是Android加Linux,完全不带QNX;更便宜或者只做纯仪表的座舱芯片,干脆连Android都不跑,QNX一个系统撑到底。所以"QNX+Android"这个组合眼下确实是市场主流,但不是技术上非此不可的搭配。

前面那张架构图里的"座舱域(跑AAOS)",严格讲画的只是Android这一个Guest里的东西——CarService、VHAL都在里面。QNX那部分和底下的Hypervisor层,图上压根没出现。真实的座舱芯片,比图上画的要多一层。