fix(V4B): V4.36.35 — EMA cast 根治: 有符号先除 (爆炸源)
35uH V4.36.34 全绿 (13+ cycle, band_timeout 2次实战) — VEM 恒 130715 暴露玄机 根因 (C 语义实锤): g += (uint32_t)_ema_d/128; _ema_d=-10 → (uint32)(-10)=4294967286 → /128 = +33554431/样本 → EMA 爆炸 (20260907a 10:23:03 VEM 垃圾起始=CAPVD 首破 EMA) V4.36.34 自愈每样本兜住(炸+重置净零)掩盖; V4.36.33 无自愈 → RLN 垃圾+假触发卡死 修: g += (uint32_t)(_ema_d / 128) 有符号先除; 自愈保留最后防线 ADR 条件修复: _t_ms 恒 2000 原永不触发 → 独立计数 5×2s=10s 语法0 error, 4测试全绿; spec V2.52 / devlog V2.70
This commit is contained in:
@@ -1269,7 +1269,9 @@ void vd1_task(void)
|
||||
if (_ema_d > _ema_lim) _ema_d = _ema_lim;
|
||||
else if (_ema_d < -_ema_lim) _ema_d = -_ema_lim;
|
||||
if (_ema_d != 0)
|
||||
g_vacuum_ema += (uint32_t)_ema_d / VACUUM_EMA_ALFA;
|
||||
/* V4.36.35: cast 顺序修复 — (uint32_t)负值/128 = +3355万/样本(爆炸源!)
|
||||
* 必须 有符号先除: -10/128=0, -200/128=-1(wrap 减) — 20260908 实锤根因 */
|
||||
g_vacuum_ema += (uint32_t)(_ema_d / VACUUM_EMA_ALFA);
|
||||
if (((int32_t)loop1_Origin - (int32_t)g_vacuum_ema) > (int32_t)(loop1_Origin >> 2) ||
|
||||
((int32_t)g_vacuum_ema - (int32_t)loop1_Origin) > (int32_t)(loop1_Origin >> 2))
|
||||
g_vacuum_ema = loop1_Origin;
|
||||
@@ -1730,10 +1732,13 @@ void loop_task_function(void *pvParameters)
|
||||
g_q_lo, g_vacuum_ema, g_rel_smooth, _rln, loop1_cnt_release,
|
||||
(unsigned long)loop1_ORG_SUM);
|
||||
}
|
||||
if ((_t_ms % 10000) == 0) /* V4.36.34 诊断: 关键变量地址 (每 10s) */
|
||||
static uint16_t _adr_cnt = 0; /* V4.36.35: _t_ms 恒 2000, 原条件永不触发; 独立计数 5 次×2s=10s */
|
||||
if (++_adr_cnt >= 5) {
|
||||
_adr_cnt = 0;
|
||||
PRINT("ADR|VEM=%08X ORGSUM=%08X Origin=%08X RSM=%08X\n",
|
||||
(unsigned)&g_vacuum_ema, (unsigned)&loop1_ORG_SUM,
|
||||
(unsigned)&loop1_Origin, (unsigned)&g_rel_smooth);
|
||||
}
|
||||
g_slope_limit_cnt = 0; // 限幅计数按周期清 (统计最近 2s)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user