4. S32G软件架构与诊断网关部署

S32G 作为面向车载网关与域控制器的多核异构 SoC,其软件架构不是“把几个操作系统装上去”那么简单,而是要把 AUTOSAR CP、AUTOSAR AP、Linux BSP、实时核 与 DoIP 诊断网关应用 按实时性、功能安全、算力与通信路径进行分区规划。理解这一节的关键,是先建立“核—OS—通信—应用”四层映射关系,再决定诊断网关的各个功能模块落在哪个分区。

一、S32G 的核与执行域划分

S32G 典型包含多个 Cortex-A53 应用核簇和 Cortex-M7 实时核簇,并配有 LLCE、PFE、HSE 等硬件加速与安全子系统。工程上通常把执行域划分为三类:

  • 应用域(A 核):运行 Linux BSP 或 AUTOSAR AP,承担诊断网关主逻辑、DoIP 连接管理、诊断路由、日志与 OTA 等非硬实时任务。
  • 实时域(M 核):运行 AUTOSAR CP,承担 CAN/CAN FD、LIN、FlexRay 报文收发、周期信号处理、网络管理及对时延敏感的转发任务。
  • 安全域(HSE):负责密钥管理、安全启动、SecOC 加解密与诊断安全访问的底层支撑。

DoIP 诊断网关横跨应用域与实时域:DoIP 的 TCP/UDP 连接、车辆识别、路由激活属于应用域;而诊断请求到 CAN 报文的转换、周期发送、超时监控则往往下沉到实时域。分区规划的核心,就是确定这条“以太网—诊断—CAN”链路上每一跳由谁执行、以什么周期执行、如何跨核通信。

二、AUTOSAR CP 与 AP 的职责边界

在 S32G 上,CP 与 AP 不是二选一,而是协同。CP 侧通常部署在 M 核,包含 CanIf、CanTp、PduR、Com、Dcm、Dem、Nm 等基础软件模块,负责确定性报文收发与诊断协议栈的底层处理。AP 侧部署在 A 核,提供面向服务的通信(SOME/IP)、执行管理(EM)、状态管理(SM)以及诊断管理(DM)。

对于 DoIP 网关,建议的边界是:DoIP 协议栈、诊断路由表、连接状态机放在 AP/Linux 侧;UDS 会话与安全访问的底层超时、CAN 多帧收发、周期诊断报文放在 CP 侧。两者之间通过共享内存或核间通信(IPC)交换诊断 PDU。这样既保证诊断路由的灵活性,又保证 CAN 侧时序确定性。

分区原则:凡是“毫秒级确定性、与总线周期强绑定”的功能放 M 核 CP;凡是“连接管理、协议解析、状态机、日志”放 A 核 AP/Linux。跨核接口只传 PDU 与事件,不传大块业务逻辑。

三、Linux BSP 与实时核的协同

Linux BSP 提供启动链、设备树、网络驱动、PFE/LLCE 驱动以及文件系统。DoIP 网关在 Linux 侧通常以用户态进程或内核模块形式存在。若采用用户态实现,需关注 socket 收发的实时性;若诊断转发时延要求严格,可将关键路径下沉到 M 核,Linux 只做管理面。

跨核通信常见三种方式:共享内存 + 中断、RPMSG、以及基于以太网的内部通道。以共享内存为例,可划分 TX/RX 两个环形缓冲区,每个槽位固定 64 字节,头部包含通道号、长度、时间戳。M 核在 CAN 中断中写入接收 PDU,A 核轮询或中断触发读取;反向则用于诊断请求下发。这种设计使诊断转发路径可预测,便于测量端到端时延。

四、诊断网关应用分区规划示例

下面给出一个可参考的分区规划。假设目标是把外部诊断仪通过 DoIP 发来的 UDS 请求,路由到车内 CAN FD 总线上,并把响应回传。

功能模块所在分区关键职责典型周期/时延
DoIP ServerA 核 Linux/APTCP/UDP 监听、车辆识别、路由激活连接建立 < 100 ms
诊断路由表A 核 Linux/AP按逻辑地址映射到 CAN 通道与目标 ECU查表 < 1 ms
UDS 会话管理M 核 CP Dcm会话超时、安全访问状态、P2 定时P2 50 ms 量级
CanTp 多帧收发M 核 CPISO 15765-2 分段与重组与总线周期绑定
SecOC/密钥HSE加解密、密钥存储硬件加速

该规划中,诊断请求的路径是:诊断仪 → 以太网 → A 核 DoIP Server → 共享内存 → M 核 Dcm/CanTp → CAN FD → 目标 ECU;响应沿反向路径返回。A 核负责“连接与路由”,M 核负责“协议时序与总线收发”,HSE 负责“安全”。

S32G DoIP 诊断网关分区与数据路径 外部诊断仪 DoIP Client 以太网 A 核:Linux BSP / AUTOSAR AP DoIP Server(TCP/UDP) 诊断路由表 / 连接状态机 日志 / OTA / 管理面 共享内存 TX/RX 环形缓冲 64B/槽 + 中断 M 核:AUTOSAR CP Dcm / Dem CanTp / PduR CanIf / Com CAN FD 总线 目标 ECU UDS 响应 / 周期信号 HSE 安全子系统 密钥管理 / SecOC 安全启动 / 安全访问 数据路径:诊断仪 → A核 DoIP → 共享内存 → M核 Dcm/CanTp → CAN FD → 目标 ECU(响应反向) 安全路径:HSE 为 A核/M核提供密钥与加解密支撑,虚线表示安全服务调用

五、启动与分区配置要点

分区规划最终要落到启动链与配置上。典型启动顺序是:BootROM → HSE 安全启动 → M 核 CP 先启动(保证总线与诊断底层就绪)→ A 核 Linux 启动 → AP 进程拉起 DoIP Server。这样可避免 A 核先起而 M 核未就绪导致诊断请求丢失。

在配置层面,需要明确三件事:一是共享内存的地址与大小,必须在设备树和 CP 配置中一致;二是中断号与核间通知机制,避免轮询造成 CPU 占用;三是诊断路由表的逻辑地址映射,例如把 0x0E00 映射到 CAN1、0x0E01 映射到 CAN2,并规定超时与重试次数。以下是一个路由表配置片段示例:

/* DoIP 诊断路由表示例(逻辑地址 → 通道) */
route[0] = { .logical_addr = 0x0E00, .channel = CAN1, .target_addr = 0x7A0, .timeout_ms = 200 };
route[1] = { .logical_addr = 0x0E01, .channel = CAN2, .target_addr = 0x7A1, .timeout_ms = 200 };
route[2] = { .logical_addr = 0x0E02, .channel = CAN1, .target_addr = 0x7A2, .timeout_ms = 500 };

判断分区是否合理,可以观察三个指标:诊断请求从以太网进入到 CAN 发出的端到端时延是否稳定;M 核 CPU 负载是否留有余量;A 核在连接数增加时是否影响转发时延。若时延抖动大,通常说明关键路径被放在了 Linux 用户态,应考虑下沉到 M 核或使用实时优先级。

常见误区:把 DoIP 协议栈和 CanTp 都放在 A 核 Linux 用户态,虽然开发快,但诊断转发时延受调度影响大,且难以满足 P2 定时要求。建议至少把 CanTp 与 Dcm 的时序部分放在 M 核 CP。

综上,S32G 诊断网关的分区规划应围绕“实时性下沉、管理面上浮、安全由 HSE 兜底”展开。A 核负责连接、路由与管理,M 核负责协议时序与总线收发,HSE 负责安全,三者通过共享内存与中断协同,才能构成一个可预测、可测量、可维护的 DoIP 诊断网关。