SOC心跳超时60秒方案评估(2023-11-20)

📌 主题:SOC 心跳超时时间从冷启动 40 分钟、热启动 150 秒缩短为量产版本的 60 秒

JiraMICOCKPIT-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、E4U32023.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-24RC062024.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 次5340ms4599ms7220ms5734ms

刷机场景验证

  • 针对MCU MI release 版本,在 EDL、小米汽车 PC 刷机鉴权工具 刷机场景下正常
    • 金手指开关一直按着(短接),这是进入 EDL 刷机必经流程,对研发人员无感
  • 针对MCU MI release 版本,在 reset -f 指令后 fastboot 刷机 场景下,会出现刷机失败
    • 应对策略:
      1. 将 MCU 版本刷成 debug 版本
      2. SOC 刷机
      3. 将 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

参考