2. 汽车电子电气架构基础

做OTA升级,首先得搞清楚车上的电子电气架构长什么样。说白了,架构决定了你能怎么升级、升级多快、会不会出问题。我这些年踩过的坑,十有八九都跟架构设计脱不了干系。

咱们从最老的开始,一路讲到最新的SOA。每种架构我都会结合项目里的真实情况来讲。

2.1 分布式架构:ECU各自为政

这是十年前最常见的方案。每个功能一个ECU,门控、车窗、雨刮、座椅……各管各的。通信靠CAN/LIN总线,偶尔用FlexRay。

核心特征:每个ECU固件独立,升级得一个一个来。

我记得2018年做一个项目,车上42个ECU。客户要求OTA升级,我一看架构图就头疼。每个ECU的MCU型号不同,Flash大小不同,升级协议也不同。有的用UDS,有的用私有协议,还有几个压根不支持Bootloader跳转。

分布式架构对OTA的影响,我总结了几点:

  • 升级效率低——每个ECU单独刷,42个节点全刷完,顺利的话也得40分钟。要是某个节点刷挂了,还得整车断电重来。
  • 版本管理混乱——每个ECU有自己的版本号,组合起来就是天文数字。我见过一个项目,光版本兼容性矩阵就写了2000多行。
  • 带宽瓶颈——CAN总线最高1Mbps,刷一个2MB的固件,理论传输就要16秒。实际加上协议开销,30秒都算快的。
  • 升级安全性差——很多老ECU没有安全启动,刷写过程中断电就变砖。我曾经遇到过,升级到一半CAN总线被高优先级报文占满,刷写超时,三个ECU同时变砖。

避坑指南:分布式架构做OTA,一定要先做ECU能力普查。我曾经跳过这一步,结果发现有个门控ECU的Flash只有64KB,固件压缩后还放不下。最后只能换硬件,项目延期两个月。

2.2 域集中架构:按功能域整合

后来大家发现ECU太多管不过来,就开始搞域集中。把相近功能的ECU合并到一个域控制器里。常见的域有:动力域、底盘域、车身域、信息娱乐域、自动驾驶域。

域控制器一般用高性能SoC,跑Linux或QNX。域内ECU通过CAN/LIN连到域控,域控之间走以太网。

域类型 包含功能 典型SoC OTA影响
动力域 发动机、变速箱、BMS Infineon TC3xx 升级需保证扭矩安全
底盘域 ESP、EPS、空气悬架 NXP S32G 升级期间不能影响制动
车身域 门控、车窗、灯光 Renesas RH850 可并行升级,影响小
信息娱乐域 仪表、中控、T-Box Qualcomm SA8155 升级频繁,A/B分区常见
自动驾驶域 感知、规划、控制 NVIDIA Orin 升级需功能安全等级

域集中架构对OTA的好处很明显:

  • 节点数减少——从42个ECU降到6-8个域控,升级时间大幅缩短。
  • 以太网骨干——100Mbps/1Gbps带宽,刷写速度不再是瓶颈。
  • 统一升级管理——域控作为升级代理,负责域内ECU的刷写协调。

但也不是没坑。我做过一个项目,车身域控同时管理12个ECU。升级时域控先升级自己,然后依次刷写子节点。结果域控升级后重启,子节点全部失联。查了半天,发现是域控的CAN路由表在升级后被清空了。

经验之谈:域控升级时,一定要保留子节点的路由信息和升级状态。我现在的做法是:域控升级前先把子节点状态快照存到备份分区,升级完成后自动恢复。

2.3 中央计算架构:一个大脑管所有

到了中央计算架构,车上就剩一个或两个中央计算机。所有传感器、执行器都通过区域网关(Zone Gateway)连到中央计算机。区域网关只做数据转发,不做决策。

这种架构对OTA来说,简直是福音。

  • 单点升级——主要升级中央计算机就行,区域网关的固件基本不变。
  • 算力充足——中央计算机用服务器级芯片,跑容器化应用,升级可以做到热更新。
  • 统一安全策略——所有升级包签名验证都在中央计算机完成,安全策略一致。

但中央架构也有新问题。我记得一个项目,中央计算机负责所有ADAS功能。升级过程中,客户要求不能中断辅助驾驶。这就麻烦了——升级期间,感知算法要持续运行,控制指令要实时输出。

我们最后用了热升级+影子模式的方案:

// 热升级伪代码
1. 启动新版本容器(影子模式)
2. 新旧版本同时接收传感器数据
3. 比较新旧版本输出差异
4. 差异在安全阈值内 → 切换流量到新版本
5. 差异超出阈值 → 回滚旧版本
6. 确认新版本稳定 → 停止旧版本容器

这个方案对内存和算力要求很高。中央计算机得同时跑两套算法,内存至少翻倍。我们当时用的NVIDIA Thor,256GB内存,勉强够用。

注意:中央架构下,区域网关的固件虽然不常升级,但一旦需要升级,就得整车所有网关一起刷。因为区域网关之间没有独立升级通道,必须通过中央计算机串行刷写。我建议区域网关的固件设计成向前兼容至少3个版本。

2.4 SOA架构:服务化才是终极形态

SOA(Service-Oriented Architecture)把车上的功能拆成一个个服务。每个服务独立部署、独立升级、独立运行。服务之间通过SOME/IP或DDS通信。

SOA对OTA的影响是革命性的:

  • 细粒度升级——只升级有问题的服务,不用动整个系统。比如只升级泊车感知服务,不影响行车感知服务。
  • 灰度发布——先升级10%的车,观察没问题再全量推送。SOA的服务发现机制天然支持灰度。
  • 热替换——服务可以做到不停机升级。新版本服务启动后,旧版本服务优雅退出,连接无缝迁移。
  • 版本兼容——每个服务有自己的接口版本号,服务注册中心负责版本匹配。不兼容的接口自动路由到旧版本服务。

我去年主导的一个SOA项目,升级体验是这样的:

# 升级一个微服务
1. 云端推送新版本服务镜像
2. 中央计算机下载并校验签名
3. 启动新版本服务(监听新端口)
4. 服务注册中心更新路由表
5. 新请求路由到新版本服务
6. 旧版本服务等待现有请求完成
7. 旧版本服务优雅退出
8. 升级完成,零停机

整个过程用户无感知。导航服务升级时,用户正在用的导航会话不受影响。等用户下次重新规划路线,才会用到新版本。

SOA升级的核心优势:服务级升级粒度 + 灰度发布 + 热替换 + 零停机。这是传统架构完全做不到的。

但SOA也不是银弹。我踩过的坑包括:

  • 服务间依赖复杂——A服务升级后,B服务调用A的接口返回格式变了,导致B服务崩溃。后来我们强制要求所有接口变更必须向后兼容。
  • 状态同步问题——热替换时,旧服务的运行状态怎么迁移到新服务?我们用了Redis做状态缓存,但延迟敏感的服务还是有问题。
  • 调试困难——几十个服务同时运行,出问题很难定位。我们上了分布式链路追踪(OpenTelemetry),才勉强能排查。

我的建议:SOA架构下,每个服务都要有健康检查接口和就绪检查接口。Kubernetes的liveness probe和readiness probe可以直接用。另外,服务启动时不要立即接受请求,等初始化完成后再注册到服务中心。

2.5 四种架构对比总结

我画了一张对比图,把四种架构对OTA的影响放在一起看:

四种架构对OTA的影响对比 分布式架构 ECU数量:40+ 升级方式:逐个刷写 升级时间:40-60分钟 安全风险:高 版本管理:混乱 带宽:CAN 1Mbps 域集中架构 域控数量:6-8个 升级方式:域控代理 升级时间:15-25分钟 安全风险:中 版本管理:可控 带宽:以太网100M 中央计算架构 中央计算机:1-2个 升级方式:单点升级 升级时间:5-10分钟 安全风险:低 版本管理:统一 带宽:以太网1G SOA架构 服务数量:50+ 升级方式:服务级热升级 升级时间:秒级 安全风险:极低 版本管理:自动化 带宽:以太网1G+ 架构演进方向:分布式 → 域集中 → 中央计算 → SOA OTA升级体验随架构演进逐步提升:从40分钟到秒级,从高风险到零停机 关键升级指标对比 升级成功率:85% 升级成功率:93% 升级成功率:98% 升级成功率:99.9% 注:升级成功率数据来自我参与过的项目统计,仅供参考 分布式架构升级成功率低的主要原因是ECU变砖和版本兼容性问题 SOA架构通过服务级灰度发布和自动回滚,将升级风险降到最低

从这张图能看出来,架构越先进,OTA升级体验越好。但要注意,架构升级不是一蹴而就的。我见过很多项目想一步到位上SOA,结果基础架构没准备好,服务拆得太细,反而把系统搞复杂了。

我个人建议:如果现在还是分布式架构,先往域集中走。域集中稳定了,再考虑中央计算。SOA可以提前规划,但不要强求一步到位。毕竟,车上的东西,稳定比先进更重要。