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 侧时序确定性。
三、Linux BSP 与实时核的协同
Linux BSP 提供启动链、设备树、网络驱动、PFE/LLCE 驱动以及文件系统。DoIP 网关在 Linux 侧通常以用户态进程或内核模块形式存在。若采用用户态实现,需关注 socket 收发的实时性;若诊断转发时延要求严格,可将关键路径下沉到 M 核,Linux 只做管理面。
跨核通信常见三种方式:共享内存 + 中断、RPMSG、以及基于以太网的内部通道。以共享内存为例,可划分 TX/RX 两个环形缓冲区,每个槽位固定 64 字节,头部包含通道号、长度、时间戳。M 核在 CAN 中断中写入接收 PDU,A 核轮询或中断触发读取;反向则用于诊断请求下发。这种设计使诊断转发路径可预测,便于测量端到端时延。
四、诊断网关应用分区规划示例
下面给出一个可参考的分区规划。假设目标是把外部诊断仪通过 DoIP 发来的 UDS 请求,路由到车内 CAN FD 总线上,并把响应回传。
| 功能模块 | 所在分区 | 关键职责 | 典型周期/时延 |
|---|---|---|---|
| DoIP Server | A 核 Linux/AP | TCP/UDP 监听、车辆识别、路由激活 | 连接建立 < 100 ms |
| 诊断路由表 | A 核 Linux/AP | 按逻辑地址映射到 CAN 通道与目标 ECU | 查表 < 1 ms |
| UDS 会话管理 | M 核 CP Dcm | 会话超时、安全访问状态、P2 定时 | P2 50 ms 量级 |
| CanTp 多帧收发 | M 核 CP | ISO 15765-2 分段与重组 | 与总线周期绑定 |
| SecOC/密钥 | HSE | 加解密、密钥存储 | 硬件加速 |
该规划中,诊断请求的路径是:诊断仪 → 以太网 → A 核 DoIP Server → 共享内存 → M 核 Dcm/CanTp → CAN FD → 目标 ECU;响应沿反向路径返回。A 核负责“连接与路由”,M 核负责“协议时序与总线收发”,HSE 负责“安全”。
五、启动与分区配置要点
分区规划最终要落到启动链与配置上。典型启动顺序是: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 核或使用实时优先级。
综上,S32G 诊断网关的分区规划应围绕“实时性下沉、管理面上浮、安全由 HSE 兜底”展开。A 核负责连接、路由与管理,M 核负责协议时序与总线收发,HSE 负责安全,三者通过共享内存与中断协同,才能构成一个可预测、可测量、可维护的 DoIP 诊断网关。