feat(V4B): V4.31 — 故障补偿时序再调: 预判2s + 补偿7s (总恢复 ~15s)

V4.30 基础上现场手感再收紧: ENV_WARN_WAIT 300→200(2s);
ENV_RESYNC_WAIT 800→700(7s); 恢复确认 200(2s) 不变
时序: 2s 黄灯预判锁存 → 7s 进入学习 → 6s 学完原子替换 → 2s 确认灭
test_env_resync.c 同步 → 5 场景 ALL PASS (warn@200, applied@1300, 灭@1500)
文档: devlog V2.29 / spec V2.10 / design doc v0.8
This commit is contained in:
wangfq
2026-09-03 16:16:37 +08:00
parent 4200d96250
commit 7983bfd72d
7 changed files with 59 additions and 29 deletions
+18 -18
View File
@@ -1,13 +1,13 @@
/*
* test_env_resync.c — 环境重校准(受控基线更新) gcc 隔离单测 (DLD154V4B V4.30)
* test_env_resync.c — 环境重校准(受控基线更新) gcc 隔离单测 (DLD154V4B V4.31)
*
* 镜像 = TaskLoop.c vd1_task() 无车段 dev>0 分支 (V4.24/25/26/30), 逻辑与固件一致:
* 镜像 = TaskLoop.c vd1_task() 无车段 dev>0 分支 (V4.24/25/26/30/31), 逻辑与固件一致:
* - 高位 dev>+4dlt: 等待确认(g_env_wait_cnt) → 满 ENV_WARN_WAIT 预判锁存 g_env_warn
* - 满 ENV_RESYNC_WAIT → 进入学习 g_env_resync(高位段才计数; 压线/回摆=搁置)
* - 学习: 200 样本/窗, 窗均值漂移 ≤0.1% 连续 2 窗 → env_resync_apply 原子替换
* - 预算 ENV_LEARN_MAX_TICKS 超时 → abort 不污染
* - 非高位空闲 dev>-dlt 连续 ENV_RECOVER_WAIT → 清 g_env_warn (黄灯灭)
* V4.30 拍板: 预判 3s + 补偿 8s + 替换后空闲 2s 灭
* V4.31 拍板: 预判 2s + 补偿 7s + 替换后空闲 2s 灭
* 镜像宏与固件一致(改 ENV_* 时同步此处!)
*/
#include <stdio.h>
@@ -17,9 +17,9 @@
#include <stdint.h>
/* ===== 镜像固件宏 (TaskLoop.c/TaskLoop.h 同步) ===== */
#define ENV_WARN_WAIT 300 /* V4.30: 预判 3s */
#define ENV_WARN_WAIT 200 /* V4.31: 预判 2s */
#define ENV_RECOVER_WAIT 200 /* V4.30: 替换后空闲 2s 恢复确认 */
#define ENV_RESYNC_WAIT 800 /* V4.30: 补偿(学习等待) 8s */
#define ENV_RESYNC_WAIT 700 /* V4.31: 补偿(学习等待) 7s */
#define ENV_LEARN_WINDOW 200
#define ENV_LEARN_MAX_TICKS 3000
#define STABLE_ORIGIN_PPT 1
@@ -164,7 +164,7 @@ static void reset_all(void)
sim_tick_cnt = 0;
}
/* ===== 场景 1: 永久变化 (A 拿走) — 3s 预判 → 8s 触发 → 3窗学完 ~14s 替换 → +2s 灭 ===== */
/* ===== 场景 1: 永久变化 (A 拿走) — 2s 预判 → 7s 触发 → 3窗学完 ~13s 替换 → +2s 灭 ===== */
static void test_permanent_change_recovers(void)
{
int tick, warn_at = 0;
@@ -179,9 +179,9 @@ static void test_permanent_change_recovers(void)
if (sim_applied_cnt)
break;
}
printf("1. 永久变化: warn_at=%d learn_start=%d applied_at=%d Origin=%u (期望 300 / 1 / ~1400 / 128856)\n",
printf("1. 永久变化: warn_at=%d learn_start=%d applied_at=%d Origin=%u (期望 200 / 1 / ~1300 / 128856)\n",
warn_at, sim_learn_start_cnt, (int)sim_tick_cnt, sim_Origin);
assert(warn_at == 300);
assert(warn_at == 200);
assert(sim_learn_start_cnt == 1);
assert(sim_applied_cnt == 1);
assert(sim_Origin == 128856UL);
@@ -204,11 +204,11 @@ static void test_transient_keeps_warn(void)
int loop;
reset_all();
for (loop = 0; loop < 700; loop++) { /* 7s 高位 */
for (loop = 0; loop < 600; loop++) { /* 6s 高位 */
sim_CAPVD = 128856UL;
sim_tick();
}
printf("2. 瞬态 7s 高位: warn=%d learn=%d (期望 1 / 0)\n", g_env_warn, sim_learn_start_cnt);
printf("2. 瞬态 6s 高位: warn=%d learn=%d (期望 1 / 0)\n", g_env_warn, sim_learn_start_cnt);
assert(env_warn_active() == 1);
assert(sim_learn_start_cnt == 0);
@@ -226,14 +226,14 @@ static void test_transient_keeps_warn(void)
assert(g_env_warn == 0);
assert(sim_learn_start_cnt == 0);
for (loop = 0; loop < 700; loop++) { /* 再 7s 高位 → 重新锁存, 仍不学 */
for (loop = 0; loop < 600; loop++) { /* 再 6s 高位 → 重新锁存, 仍不学 */
sim_CAPVD = 128856UL;
sim_tick();
}
printf(" 二次 7s 高位: warn=%d learn=%d (期望 1 / 0)\n", g_env_warn, sim_learn_start_cnt);
printf(" 二次 6s 高位: warn=%d learn=%d (期望 1 / 0)\n", g_env_warn, sim_learn_start_cnt);
assert(g_env_warn == 1);
assert(sim_learn_start_cnt == 0);
printf("2. 瞬态高位(<8s)不学, 锁存保持, 恢复确认后灭 OK\n");
printf("2. 瞬态高位(<7s)不学, 锁存保持, 恢复确认后灭 OK\n");
}
/* ===== 场景 3: 学习期目标压线 = 搁置(不退出) → 走后再学完 → 替换 ===== */
@@ -243,7 +243,7 @@ static void test_interrupted_learn_recomputes(void)
int applied_at = 0;
reset_all();
for (loop = 0; loop < 800; loop++) { /* 8s → 学习开始 */
for (loop = 0; loop < 700; loop++) { /* 7s → 学习开始 */
sim_CAPVD = 128856UL;
sim_tick();
}
@@ -287,7 +287,7 @@ static void test_unstable_learn_gives_up(void)
int i;
reset_all();
for (loop = 0; loop < 800; loop++) {
for (loop = 0; loop < 700; loop++) {
sim_CAPVD = 128856UL;
sim_tick();
}
@@ -314,7 +314,7 @@ static void test_no_repeat_learn(void)
int loop;
reset_all();
for (loop = 0; loop < 800; loop++) {
for (loop = 0; loop < 700; loop++) {
sim_CAPVD = 128856UL;
sim_tick();
}
@@ -343,12 +343,12 @@ static void test_no_repeat_learn(void)
int main(void)
{
printf("test_env_resync (V4.30: 预判3s/补偿8s/恢复2s)\n");
printf("test_env_resync (V4.31: 预判2s/补偿7s/恢复2s)\n");
test_permanent_change_recovers();
test_transient_keeps_warn();
test_interrupted_learn_recomputes();
test_unstable_learn_gives_up();
test_no_repeat_learn();
printf("ALL PASS (ENV_WARN 300 / RESYNC 800 / RECOVER 200)\n");
printf("ALL PASS (ENV_WARN 200 / RESYNC 700 / RECOVER 200)\n");
return 0;
}