🦘 HQ1项目 P301车型 实车联调 IPC 通道排查 Checklist v0.2
8.2 VM 间三通道 + 7.4 R↔A 四子通道 · 7 通道全链路 · 显示+声音异常排查 P0 锁死
📄 文档信息
| 性质 | 实车联调现场操作手册 / 8 组共用 / 一键 dump |
|---|---|
| 适用 | 阶段 3 收口 + 阶段 4 全域联调 |
| 读者 | 8 组组长 + 马鹤(MCU A 核) + 恒润(MCU R 核) + 现场实施工程师 |
| 关联 |
• 6-26 IPC rpmsg 排查思路 v0.1(方法论,本份是操作手册) • V0.5 架构图 IPC Framework 卡(bad · 6/24 台架测试不通) • 6/30 实车联调上下文:显示+声音功能批量异常 |
📝 变更日志
| 版本 | 时间 | 变更 |
|---|---|---|
| v0.1 | 6/30 19:23 | 飞书初版 · 4 通道 × 4 维度 |
| v0.2 | 6/30 19:25 |
• 合并 7.4 R 核 ↔ A 核 4 子通道 • 通道 4 拆 4 子通道(4.1/4.2/4.3/4.4) • 新增环形缓冲区 + IPI 排查维度 • 6/9 必问孙强 5 问 |
0️⃣ 排查前置(8 组执行前必做,1 分钟)
| # | 动作 | 命令 |
|---|---|---|
| 0.1 | 清空历史日志 | adb logcat -c |
| 0.2 | 记现场时间戳基准 | adb shell date > /sdcard/t0.txt |
| 0.3 | 现场异常发生时刻手动记到 log.txt(谁/何时/现象) | — |
| 0.4 | 异常期间不要复位,先抓现场再复位 | — |
1️⃣ 4 通道 × 4 维度 主排查矩阵
横轴 = 8.4 三个安全机制 + 业务数据,纵轴 = 8.2/8.3 四个通道
| 通道 \\ 维度 | E2E 端到端保护 (CRC + 序号) |
心跳超时检测 | SMMU 静态配置 | 业务数据正确性 |
|---|---|---|---|---|
| 通道 1 仪表数据同步 SafetyLinux → 副屏 AAOS |
logcat | grep -iE "E2E|CRC|sequence"❌ CRC mismatch / seq error |
logcat | grep -iE "heartbeat|timeout"❌ heartbeat timeout |
dmesg | grep -iE "SMMU|IOMMU"❌ SMMU fault |
踩油门,看副屏车速同步;拍照录屏 |
| 通道 2 智驾状态同步 SafetyLinux → 中控 SR 区 |
同上(过滤 SR|perception) |
同上(过滤 plan|sr) |
同上 | 看 SR 区规划线/障碍物是否刷新 |
| 通道 3 时间同步 虚拟 PTP / 共享时间基准 |
logcat | grep -iE "PTP|phc|offset"❌ offset > 1ms |
ptp4l / chrony 状态查询 |
同上 | 音画同步主观测试 |
| 通道 4 跨核通信 A 核 ↔ R 核(Mailbox + SRAM) |
logcat | grep -iE "mailbox|E2E" |
logcat | grep -iE "R-core|heartbeat" |
dmesg | grep -iE "SMMU.*R" |
方向盘按键 → 看方控是否响应 |
判定标准(每格):
✅ 正常 = 命令无报错 + 业务数据刷新
❌ 异常 = 触发关键词 + 业务不刷新(要立即升级到第 5 节)
✅ 正常 = 命令无报错 + 业务数据刷新
❌ 异常 = 触发关键词 + 业务不刷新(要立即升级到第 5 节)
1️⃣.5 通道 4 细分:7.4 R 核 ↔ A 核 4 子通道 v0.2 新增
7.4 节机制统一:片上 共享内存(环形缓冲区) + 中断(IPI / Mailbox)
4 条独立通道,机制相同但语义不同,必须独立测
4 条独立通道,机制相同但语义不同,必须独立测
7.4 4 子通道总览
| 子通道 | 方向 | 业务内容 | 6/30 实车异常表现 | 优先级 |
|---|---|---|---|---|
| 4.1 整车 CAN 信号 | R → A | 车身/底盘/动力 CAN 报文,周期性刷新 | 仪表/中控数据不刷新(显示异常主嫌疑);报警音不触发(声音异常) | P0 |
| 4.2 智驾控制指令 | A → R | SafetyLinux 发出智驾控制量 | 智驾失效(阶段 3 后主查) | P2 |
| 4.3 车机控制指令 | A → R | AAOS VHAL 透传用户操作(方向盘/旋钮/按键) | 方向盘按键/音量旋钮/蓝牙电话按键失灵(声音异常主嫌疑) | P0 |
| 4.4 诊断请求 | 双向 | UDS / 诊断透传 | 诊断工具失灵(不直接影响显示/声音) | P2 |
7.4 4 子通道根因路径(显示+声音异常锁死)
📺 显示异常根因路径(主嫌疑):
R 核(CAN 总线)→ [7.4-4.1 共享内存 ring buffer + IPI] → A 核 SafetyLinux
→ [8.2 通道 1 共享内存 + Doorbell] → AAOS 副屏
→ 显示图层合成
任意一段断 = 仪表/中控数据不刷新
🔊 声音异常根因路径(主嫌疑):
方向盘按键 → AAOS VHAL → [7.4-4.3 共享内存 + IPI] → R 核执行
→ 蓝牙电话 / 音频 / AMP
4.3 断了 = 用户按键没反应,自然也没声音
7.4 4 子通道 × 5 维度 排查矩阵 v0.2 新增
| 子通道 \\ 维度 | E2E 端到端 | 心跳/超时 | 环形缓冲区 | IPI/Mailbox 中断 | 业务数据 |
|---|---|---|---|---|---|
| 4.1 整车 CAN 信号 | logcat | grep -iE "CAN.*CRC|CAN.*E2E"❌ CRC mismatch |
logcat | grep -iE "CAN.*timeout"❌ CAN timeout |
cat /proc/.../can_ringbuffer (路径问中兴)❌ ring overflow |
cat /proc/interrupts | grep -iE "ipi.*can"❌ IPI lost |
踩油门,看仪表车速;打方向,看转向指示;按双闪,听声音 |
| 4.2 智驾控制指令 | logcat | grep -iE "plan.*E2E|control.*CRC" |
logcat | grep -iE "plan.*timeout" |
cat /proc/.../plan_ringbuffer |
cat /proc/interrupts | grep -iE "ipi.*plan" |
看智驾规划线是否下发到 R 核执行 |
| 4.3 车机控制指令 | logcat | grep -iE "VHAL.*E2E|key.*CRC" |
logcat | grep -iE "VHAL.*timeout" |
cat /proc/.../vhal_ringbuffer |
cat /proc/interrupts | grep -iE "ipi.*vhal" |
方向盘音量+/-,Mode 键,蓝牙电话接听/挂断 |
| 4.4 诊断请求 | logcat | grep -iE "UDS.*E2E|diag.*CRC" |
logcat | grep -iE "diag.*timeout" |
cat /proc/.../diag_ringbuffer |
cat /proc/interrupts | grep -iE "ipi.*diag" |
跑一遍 UDS 诊断命令,看响应 |
⚠️ 4.1 和 4.3 = P0 必查 — 显示+声音异常主嫌疑
⚠️ 环形缓冲区状态路径在 v0.1 是问号,6/9 跟中兴要实际路径
⚠️ 环形缓冲区状态路径在 v0.1 是问号,6/9 跟中兴要实际路径
2️⃣ L0 共因层(批量异常时 T+0 必查)
优先于上面 4 通道 — 显示/声音同时坏 = 共因 > 特性
| # | 动作 | 命令 | 正常 vs 异常 |
|---|---|---|---|
| E.1 | 系统稳定性 | adb shell uptime + adb shell dmesg | grep -iE "panic|oops|reset" |
✅ uptime > 1h · ❌ 有 panic 或频繁复位 |
| E.2 | Watchdog 状态 | adb shell dumpsys watchdog |
✅ 无 timeout · ❌ 有 timeout |
| E.3 | 跨域服务存活 | adb shell dumpsys activity services | grep -iE "SafetyLinux|AAOS|IPC" |
✅ 服务都在 · ❌ 有 crash |
| E.4 | SoC 复位 | adb shell cat /proc/reset_reason |
✅ 正常断电 · ❌ 有 SoC 复位原因 |
3️⃣ 现场日志打包脚本(1 键 dump)
每个通道异常触发,1 键 dump 全套日志到本地 incidents/ 目录
#!/bin/bash
# 现场一键 dump,文件名带时间戳 + 通道名
# 用法: ./dump_incident.sh <通道编号 1-4-子通道>
# 例: ./dump_incident.sh 4.1 (整车 CAN 信号)
CH=${1:-unknown}
TS=$(date +%Y%m%d_%H%M%S)
NAME="incident_ch${CH}_${TS}"
echo "[dump] start channel=$CH ts=$TS"
# 系统层
adb shell "dmesg > /sdcard/${NAME}_dmesg.log"
adb shell "cat /proc/uptime > /sdcard/${NAME}_uptime.log"
adb shell "cat /proc/reset_reason > /sdcard/${NAME}_reset.log"
# Android logcat
adb shell "logcat -d -b crash > /sdcard/${NAME}_crash.log"
adb shell "logcat -d -b main > /sdcard/${NAME}_main.log"
adb shell "logcat -d -b system > /sdcard/${NAME}_system.log"
# 跨域 / 显示 / 音频
adb shell "dumpsys activity services > /sdcard/${NAME}_svc.log"
adb shell "dumpsys SurfaceFlinger > /sdcard/${NAME}_sf.log"
adb shell "dumpsys media.audio_flinger > /sdcard/${NAME}_af.log"
adb shell "dumpsys media.audio_policy > /sdcard/${NAME}_ap.log"
# 7.4 跨核通信(v0.2 新增)
adb shell "cat /proc/interrupts > /sdcard/${NAME}_interrupts.log"
# ring buffer 状态:路径问中兴 6/9 之后补
# adb shell "cat /proc/.../ringbuffer_${CH} > /sdcard/${NAME}_ringbuffer.log"
# 拉回本地
mkdir -p ./incidents/
adb pull /sdcard/${NAME}_*.log ./incidents/
echo "[dump] saved: ./incidents/${NAME}_*.log"
每个异常 → 一键 dump → 8 组共享目录,8 组共用同一份现场数据
4️⃣ 异常判定 — bug vs 8.4 主动保护
🚨 8.4 安全机制主动丢数据 ≠ bug,是保护行为,先记下来不阻塞
| 现象 | 是 bug 的特征 | 是 8.4 保护的特征 |
|---|---|---|
| 副屏仪表数据丢 | 多个字段都丢 / 一直卡死 | 偶发 1-2 个字段 + E2E 日志有 CRC fail |
| 中控 SR 区不刷新 | 全程不刷新 | 偶发 + 心跳超时触发 |
| 蓝牙电话无声 | 全程无声 | 偶发 + 通道降级日志 |
| 音画不同步 | 一直不同步 | PTP offset > 1ms 报警 |
| CAN 数据丢(4.1) | 多个报文丢/全丢 | 偶发个别报文 + CAN CRC fail |
| 方向盘按键失灵(4.3) | 所有按键全失灵 | 偶发 1-2 个按键 + VHAL timeout |
判定原则
- 持续异常 = bug → 进 bug 单流程
- 偶发异常 + 8.4 日志 = 保护,记下来,继续往后走(不阻塞)
- 持续异常 + 8.4 日志 = 链路不稳 → 查物理通道(共享内存被踩 / Doorbell 失能 / Mailbox 漏中断),升级到 P0
5️⃣ 兜底升级路径
T+0 L0 共因层(E.1-E.4) → 30 min 结论
↓ 有共因 ↓ 没共因
T+30m 全组拉群同步 进 1-4 通道排查矩阵
↓ ↓
T+1h 升安全评审/项目 按通道异常触发 dump 脚本
↓ ↓
T+2h 走 ca-api 红线 8 组共用 incidents/ 目录
评审流程 跨组异常 → 大群同步
↓
持续异常 + 8.4 日志 → 查物理通道(共享内存/DOORBELL/Mailbox)→ P0
6️⃣ 责任分工(8 组 × 4 通道 12 子通道)
| 通道 | 主负责 | 配合 |
|---|---|---|
| 1 仪表数据(VM 间) | 组 3 多屏显示 + 组 7 AutoSar | 组 1 整体架构 |
| 2 智驾状态(VM 间) | 组 2 Hypervisor 智驾底座 + 组 3 多屏显示 | Tomas(卓驭) |
| 3 时间同步(VM 间) | 组 1 整体架构 + 组 2 Hypervisor | 组 2 |
| 4.1 整车 CAN 信号 | 马鹤(R 核) + 组 7 AutoSar | 组 1 整体架构 + 组 3 多屏显示 |
| 4.2 智驾控制指令 | Tomas(卓驭) + 组 2 智驾底座 | 马鹤(R 核) |
| 4.3 车机控制指令 | 组 1 VHAL + 马鹤(R 核) | 恒润(R 核)蓝牙/音频 |
| 4.4 诊断请求 | 组 8 系统运维 + 马鹤 | 组 7 AutoSar |
| L0 共因 | 组 1 整体架构 + 组 8 系统运维 | 8 组拉群 |
7️⃣ 待 lock 的 7.4 关键细节 6/9 必问
必带资料:
notes/HQ1项目-P301车型-7.4-跨核通信-spec-v0.1.md (v0.2 后另起)
| # | 问题 | 影响 |
|---|---|---|
| Q1 | 7.4 4 条子通道是共享一块共享内存(4 个 ring buffer)还是4 块独立内存? | 共享 → 1 条挂了影响 3 条 · 独立 → 隔离好但占内存 → 影响 P0 评估 |
| Q2 | 环形缓冲区大小? 有没有溢出风险? producer/consumer 速率匹配? | 影响 4.1 整车 CAN 信号高频场景 |
| Q3 | IPI 优先级? 4 条子通道谁优先? 智驾控制 vs 整车 CAN 哪个优先? | 影响 7.4 调度策略 |
| Q4 | Mailbox 寄存器路径? 排查命令要拿实际路径 | 决定 §1.5 4.1-4.4 排查矩阵的 ring buffer 状态命令能不能跑 |
| Q5 | 共享内存物理地址? SMMU 静态配置里映射到哪? 有没有按通道分页? | 决定 SMMU 隔离粒度 |
8️⃣ 关键 takeaway v0.2 增量
- 6/30 显示+声音异常,主嫌疑就是 7.4-4.1(CAN 信号)+ 7.4-4.3(车机控制) — 这两条挂了,所有跨域业务都断
- 通道 4 从 1 条拆成 4 条(v0.1 → v0.2 关键升级),checklist 责任分工也要拆到 4 个子通道,8 组重新对齐
- 环形缓冲区 + IPI 计数器 是 v0.2 新的排查抓手,6/9 跟中兴拿到具体路径
- 7.4 4 条通道是 1 块共享内存还是 4 块 = P0 风险评估依据,必问孙强
- 批量异常先 L0 后 1-4 — 共因导向,不要 8 组各查各的
- 8.4 主动保护 ≠ bug — 偶发 + 8.4 日志 = 记下不阻塞
- 现场异常不立即复位 — 先 dump 再复位
- 异常触发 dump 脚本 — 一键 8 组共享,避免重复抓现场
- ca-api bypass TEE — 实车联调时特定数据被异常丢弃或异常通过,先怀疑 TEE 状态(不写具体路径,按红线)
📎 附 A:7.4 4 子通道详细规格
A.1 整车 CAN 信号(R → A · 子通道 4.1) P0
| 项 | 内容 |
|---|---|
| 机制 | R 核周期性读取 CAN 总线 → 写入共享内存环形缓冲区 → IPI 通知 A 核 |
| 订阅方 | SafetyLinux(仪表)+ AAOS(中控/副屏) |
| 典型周期 | 5ms / 10ms / 20ms(取决于 CAN 报文类型) |
| 数据内容 | 车速/转速/油量/胎压/车门状态/灯光/转向角/双闪/手刹/... |
| E2E 保护 | CRC32 + 8-bit 序号 |
| 异常表现 | 仪表数据不刷新 / 报警音不触发 / 中控控车按钮状态错 |
A.2 智驾控制指令(A → R · 子通道 4.2) P2
| 项 | 内容 |
|---|---|
| 机制 | SafetyLinux 发出智驾规划/控制量 → 写入共享内存 → IPI 通知 R 核 |
| 典型周期 | 30ms / 50ms(BEV 帧周期) |
| 数据内容 | 规划线/目标加速度/制动请求/转向角/... |
| E2E 保护 | CRC32 + 16-bit 序号 |
| 异常表现 | 智驾失效 / 规划线不下发 / 车辆不响应 |
A.3 车机控制指令(A → R · 子通道 4.3) P0
| 项 | 内容 |
|---|---|
| 机制 | AAOS VHAL 接收用户操作 → 写入共享内存 → IPI 通知 R 核 |
| 典型周期 | 事件触发(非周期性) |
| 数据内容 | 方向盘按键(音量+/-/Mode/接听/挂断/语音)/旋钮/触屏/... |
| E2E 保护 | CRC16 + 8-bit 序号 |
| 异常表现 | 方向盘按键失灵 / 蓝牙电话无声 / 方控失效 |
A.4 诊断请求(双向 · 子通道 4.4) P2
| 项 | 内容 |
|---|---|
| 机制 | UDS 诊断报文 → 写入共享内存 → IPI 通知对方 |
| 典型周期 | 事件触发 |
| 数据内容 | UDS Service ID / DID / Response / ... |
| E2E 保护 | CRC16 + 8-bit 序号 |
| 异常表现 | 诊断工具失灵 / 标定工具失灵 / 远程诊断失灵 |
📎 附 B:v0.1 → v0.2 变更说明
| 项 | v0.1 | v0.2 | 原因 |
|---|---|---|---|
| 通道 4 粒度 | 1 条(跨核通信) | 4 条(7.4 子通道) | 7.4 明确 4 条独立通道,业务语义不同 |
| 通道 4 优先级 | 单条无优先级 | 4.1/4.3 = P0,4.2/4.4 = P2 | 6/30 异常根因路径锁死 |
| 排查维度 | 4 个(E2E/心跳/SMMU/业务) | 4 子通道 × 5 维度 | 7.4 增加环形缓冲区 + IPI 维度 |
| 6/9 待问 | 无 | 5 问 | 7.4 细节待 lock |
| 责任分工 | 4 通道 × 8 组 | 12 子通道 × 8 组 | 通道 4 拆 4 子通道 |
| 异常判定 | 4 行 | 6 行 | 增加 4.1 CAN 丢 / 4.3 按键失灵 |
| dump 脚本 | 11 类日志 | 12 类(+interrupts) | 7.4 IPI 计数器需要 |
| 关联文档 | V0.5 + 6-26 排查思路 | V0.5 + 6-26 排查思路 + 7.4 spec(待) | 7.4 spec 6/9 后另起 |