固件 0.1.4-c5:整片刀片不应答(INA226 + PCA9555 同时 NAK 200 ms)⇒ 关这一路

- t_safety:eFuse 开着、本路两颗都 NAK 连续 10 圈 ⇒ abort + 关 eFuse,新事件 20 BLADE_MUTE;
  只关 eFuse,不再写刚 NAK 过的 PCA9555。只有一颗不答应仍按 §10.10 盲跑、保持供电
- 起因:板 B 第 2 槽 PRSNT2# 卡低,刀片挪走后空槽 eFuse 开了约 4 h,原判据一条没响
- 需求 §10.10 加一行 + 表后第 3 条;rack 事件 20 命名并标红
- 宿主机 26 ctest 全绿(test_t_safety_rules +4 例)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-09-28 09:07:39 +08:00
共同撰写人 Claude Opus 5.5
父节点 ef91daf07d
当前提交 385d2f9c47
共修改 11 个文件,包含 1275 行新增和 1105 行删除
+23 -1
查看文件
@@ -43,6 +43,8 @@ const char *t_safety_ev_str(safety_ev_t ev)
return "mux失联全断";
case SAFETY_EV_SLOT_EMPTY:
return "刀片不在位";
case SAFETY_EV_BLADE_MUTE:
return "刀片不应答关路";
default:
return "?";
}
@@ -183,7 +185,27 @@ static hal_err_t cycle_rail(void *arg)
}
}
/* 判据就在这里跑:断 VBUS 要在本路通道选好、锁还持着的此刻(规矩 3)。 */
/* 整片刀片不应答(T_SAFETY_BLADE_MUTE_N 的理由)。**不走 `trip_rail_locked()`**:
它要先写这片 PCA9555 断 VBUS,而这片刚刚 NAK 过 —— 再发一次只是白等十几 ms 的
IDF NAK 超时、把本圈预算吃光(规矩 4)。只关 eFuse(锁外,GPIO 直连,永远关得掉)。
判据本身不发任何事务:两个 ok 位是上面刚读出来的。 */
safety_rail_t *st = &s->st[rail - 1];
if (rail_efuse_is_on(rail) && !s->rail_ok[rail - 1] && !s->io_ok[rail - 1]) {
if (st->mute_n < 0xFF) {
st->mute_n++;
}
if (st->mute_n >= T_SAFETY_BLADE_MUTE_N) {
st->pend_abort = true;
st->pend_efuse = true;
st->pend_ev = (uint8_t)SAFETY_EV_BLADE_MUTE;
/* 同 SR-5:不清零。关掉之后下一圈 en 为 false 自然清;写引脚失败的话下一圈立刻再关。 */
}
} else {
st->mute_n = 0;
}
/* 判据就在这里跑:断 VBUS 要在本路通道选好、锁还持着的此刻(规矩 3)。
rail_ok 为 false 时它第一道闸就返回,不会盖掉上面攒下的 BLADE_MUTE。 */
judge_locked(s, rail, a->now);
return first;
}