SOC心跳超时60秒方案评估(2023-11-20)
📌 主题:SOC 心跳超时时间从冷启动 40 分钟、热启动 150 秒缩短为量产版本的 60 秒
Jira:MICOCKPIT-9639
背景
2023.8.9 功能安全相关功能使能,为了系统 debug,SOC 心跳超时时间还有一些遗留项:
- MCU 冷启动 40 分钟。原因:在 fastboot 刷机场景下,如果心跳超时时间为 60 秒,由于此时 QNX 系统没有启动(XBL 阶段),
system_monitor/svs_watchdog都没有启动,SPI 心跳和 GPIO 心跳都会出现超时,MCU 会重启整个 SOC,导致刷机失败。 - MCU 热启动 150 秒。原因:ramdump 生成需要 110 秒,为了调查 QNX ramdump 问题,心跳超时时间必须大于 ramdump 生成时间。
目标
2023.12.08,SOC 心跳超时时间从冷启动 40 分钟、热启动 150 秒缩短为量产版本的 60 秒。
实施方案
- MCU 端代码上 E4U3(miui1.1)和 master 分支
- MCU 分为 release 版本和 debug 版本
- MCU release 版本:SOC 心跳超时时间从冷启动 40 分钟、热启动 150 秒缩短为量产版本的 60 秒
- MCU debug 版本:继续保持之前方案(冷启动 40 分钟、热启动 150 秒)
- 增加心跳开关(无云控):BIOS、安卓界面
代码提交
| 链接 | 描述 | 合入分支 | 合入时间 |
|---|---|---|---|
| https://odm.git.auto.mioffice.cn/c/ICI2_MCU_NXP_K3_XIAOMI/+/4280 | [SafetyDiag][perf]修改 release 版本 SPI 和 GPIO 心跳超时时间为 60 秒,debug 版本保持不变 | master、E4U3 | 2023.12.8 |
| https://odm.git.auto.mioffice.cn/c/ICI2_MCU_NXP_K3_XIAOMI/+/6247 | [heartbeat][feat]修改 spi 心跳超时,允许在 60 到 180 秒内动态修改 | master、rls-watt-s-HyperOS.1.2.0-24RC06 | 2024.4.12 |
测试验证
60 秒心跳超时时间合理性
- 喂狗进程启动最大平均时间为 6.962 秒
- 三次刷机后重启:
system_monitor平均 5.394s,svs_watchdog平均 6.962s - 正常 10 次冷启动:
system_monitor平均 3.865s,svs_watchdog平均 5.315s
- 三次刷机后重启:
- 冷启动压测 4700 次,43 小时,无 60 秒心跳超时引起的重启
测得的心跳丢失间隔(1275 次重启,dev 版本)
| 软件版本 | 重启次数 | SPI 心跳丢失最长 | SPI 心跳丢失平均 | GPIO 心跳丢失最长 | GPIO 心跳丢失平均 |
|---|---|---|---|---|---|
| SOC: miui1.1 1128 dev MCU: miui1.1 1128 dev | 1275 次 | 5340ms | 4599ms | 7220ms | 5734ms |
刷机场景验证
- 针对MCU MI release 版本,在 EDL、小米汽车 PC 刷机鉴权工具 刷机场景下正常
- 金手指开关一直按着(短接),这是进入 EDL 刷机必经流程,对研发人员无感
- 针对MCU MI release 版本,在
reset -f指令后 fastboot 刷机 场景下,会出现刷机失败- 应对策略:
- 将 MCU 版本刷成 debug 版本
- SOC 刷机
- 将 MCU 版本刷成 release 版本
- 应对策略:
当前设计方案
SOC 视角
SPI 心跳:
system_monitor每秒上报心跳给 MCU- 如果长时间没有上报心跳给到 MCU,MCU 重启 SOC
- 心跳超时时间:60 秒
- 在心跳开关关闭时,超时不会重启 SOC
GPIO 心跳:
svs_watchdog每 500 毫秒翻转 GPIO 口- MCU 每 200 毫秒检测 GPIO 口是否翻转,如果没有翻转,计数累加,如果超过阈值,MCU 重启 SOC
- 心跳超时时间:60 秒
- 在心跳开关关闭时,超时不会重启 SOC
MCU 视角
- SPI 心跳:接收不到 SPI 心跳,每 3 秒 SPI 心跳计数增加 1;接收到 SPI 心跳,SPI 心跳计数清零。如果 SPI 心跳计数超过设定值则重启 SOC。
- GPIO 心跳:每 200 毫秒判断 GPIO 是否反转,若没有反转则 GPIO 心跳计数加 1;若反转则 GPIO 心跳计数清零。如果 GPIO 心跳计数超过设定值则重启 SOC。
MCU 关闭心跳场景(power_soc_app.c)
- 如果 eeprom 中关闭 SOC 心跳检测定时器的 flag 不为 0,则不初始化 SOC 心跳检测定时器。因此 SOC 发送关闭心跳检测指令后需要热启动才可以生效。
- 开始进入 STR 时,关闭 SOC 心跳检测定时器:
static void __power_dispatch_soc_str_message(U16 param)
{
POWER_SOC_PRINTF((const U8*) "MIPM:soc_str_message\r\n");
safetyDiagQM_stop_check_navi_watch_dog_timer();
safetyDiagQM_heartbeat_monitors_stop();
power_mana_dispatch_power_mana_sub_state(PW_STATE_STR, ePWR_STATE_ENTRY_REASON_DEFAULT);
}- 金手指关闭心跳:上电过程中检测到金手指按下,会关闭 MCU 内狗和 MCU 外狗,同时停止 SOC 心跳检测定时器。
打开心跳(退出 STR 时,POWER_MANA.c)
BOOL power_mana_soc_str_state_exit(void)
{
BOOL flag = FALSE;
safetyDiagQM_start_check_navi_watch_dog_timer();
safetyDiagQM_heartbeat_monitors_start();
mp5_comm_create_ex();
power_mana_signal_set_state(eSIGNAL_TYPE_SOC_STR_ACTIVE, FALSE);
POWER_MANA_PRINTF("POWER:soc_str_state_exit\r\n");
return flag;
}德赛产线刷写影响
- 芯片烧录工位:单芯片烧录,直接罐装 ROM。OK
- 产线生产(BIOS):MCU 关闭 SPI 心跳检测,GPIO 心跳检测使能。OK
- 上板验证:使用金手指开关方案。OK
- 老化工位:第一次安卓开机。OK
- 线刷返修工位:金手指开关,MCU 检测金手指 GPIO 电平,可以关闭心跳检测机制,再执行线刷。OK