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:
wangfq
2026-09-08 14:14:00 +08:00
parent 76177fd086
commit 5cde26265f
4 changed files with 25 additions and 5 deletions
+14
View File
@@ -4,6 +4,19 @@
---
## 2026-09-08 — EMA cast 顺序根治:爆炸源定位(固件 V4.36.35)
35µH V4.36.34 全绿日志(13+ cycle 全正常,band_timeout 兜底实战 2 次 14:10:54/14:11:05SUM 对照 0~58M 循环符合 500 窗)——但 VEM 恒 130715 暴露玄机:CAPVD 经常低 2~10 counts(差负)而 VEM 纹丝不动。
**根因(C 语义实锤,本机验证)**
```c
g += (uint32_t)_ema_d / 128; // _ema_d=-10 → (uint32_t)(-10)=4294967286 → /128 = 33554431 → +3355万!
g += (uint32_t)(_ema_d / 128); // 正确: -10/128=0; -200/128=-1(wrap 减)
```
V4.36.31 原式 (uint32_t)((int32_t)CAPVD-(int32_t)g)/128 同样缺陷——CAPVD 首次低于 EMA 即爆炸(20260907a 35µH 10:23:03 VEM 536M 起始时刻=CAPVD 首次跌破 EMA ✓)。V4.36.34 的偏差>25% 自愈在同一块内每样本拉回 → 净零(表面正常,实际每样本炸一次);V4.36.33 无自愈 → 垃圾持续 → RLN 垃圾+假 Car_In → 卡死。
**V4.36.35**:① 1272 行改 (uint32_t)(_ema_d/128) 有符号先除(治本);自愈保留为最后防线;② ADR 条件修复(原 _t_ms 恒 2000 永不触发 → 独立计数 5×2s=10s)。语法 0 error、4 测试全绿;REV 4.36.35spec V2.52 / devlog V2.70。
## 2026-09-08 — EMA 内存污染:VEM 垃圾实锤 + 钳位自愈防御(固件 V4.36.34)
35µH 日志(35uH 释放不了)VEM 字段垃圾 536259907→846958055→2224104615(显示负) 递增, 10:23:03 起持续。
@@ -2126,6 +2139,7 @@ if (dev >= dlt_ORG × 4) {
| 版本 | 时间 | 说明 |
|------|------|------|
| V2.70 | 2026-09-08 | V4.36.35 EMA cast 根治(有符号先除): (uint32)负差/128=+3355万爆炸源; ADR 条件修复 |
| V2.69 | 2026-09-08 | V4.36.34 EMA 钳位自愈+SUM/ADR 诊断: 35µH VEM 垃圾实锤(写源待定) |
| V2.68 | 2026-09-04 | V4.36.33 vac_ref 重锚阈值(OriginEMA>1×dlt 才锚 EMA): 修边缘悬停拉低 EMA 触发高度漂移 |
| V2.67 | 2026-09-04 | V4.36.32 释放后分级补偿(冻结1s+降权2s×1/5): 仿132T 慢采样防残余整窗拉低 Origin |
+2 -1
View File
@@ -1,6 +1,6 @@
# DLD154V4B 技术规格书
> 单路线圈车辆检测器 | 固件版本: V4.36.34 | 文档版本: V2.51
> 单路线圈车辆检测器 | 固件版本: V4.36.35 | 文档版本: V2.52
> 本文档面向工程开发、系统集成及故障深度分析
---
@@ -844,3 +844,4 @@ DLD154V4B V1.4 起实现该专利的整数化版本,用于大车通行时的
| V2.49 | 2026-09-04 | 文档勘误:① 4.4.2 表"折算频率下降"列少乘 2(应 = dXn/Xn: 2.06/0.43/0.23/0.15%);② 补方向澄清——本表只管 CAPVD>Origin(L 升方向),车压 L 降方向冻结不在此表;③ 4.3.1 注 USE_PLANB_TABLE 双表 |
| V2.50 | 2026-09-04 | **V4.36.33 vac_ref 重锚阈值 VAC_REF_DELTA_DLT=1**:用户反馈触发高度漂移(间隔几秒再压变浅、多试几轮恢复)——EMA(α128 τ1.28s)+4×dlt 宽窗把金属板悬感应边缘(dev−20~−40)当真空快学 → vac_ref 被拉低 → 触发线漂移。修: 仅 OriginEMA>1×dlt(真锚错 J1 130 counts) 才重锚 EMA, 小偏差用 Origin |
| V2.51 | 2026-09-08 | **V4.36.34 EMA 钳位+自愈+诊断**35µH 日志 VEM 垃圾实锤(536M→846M→2224M 递增, 10:23:03 起) → EMA 内存被越界写(值≈ORG_SUM 语义但数值不匹配; 写源未定)。防御: EMA 每步限 ±3×dlt、与 Origin 偏差>25% 自愈回 Origin;诊断: DBG 加 SUM(ORG_SUM 对照)+每 10s ADR(四变量地址) |
| V2.52 | 2026-09-08 | **V4.36.35 EMA cast 顺序根治**(uint32_t)负差/128 = +3355万/样本(C 语义: 负 cast uint32 后无符号除法)——V4.36.31 引入的 EMA 爆炸源, V4.36.34 自愈每样本兜住(炸+重置净零)掩盖; 修: 有符号先除 (uint32_t)(_ema_d/128)。35µH V4.36.34 全绿: 13+ cycle 正常+band_timeout 兜底 2 次实战; ADR 条件修复(_t_ms 恒 2000 原永不触发) |
+2 -2
View File
@@ -14,11 +14,11 @@
#define __CMCNG_H__
#define PRODUCT_MODEL "DLD154"
#define FIRMWARE_VER "4.36.34" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
#define FIRMWARE_VER "4.36.35" // 主.子.修订 (2026-09-03 起: 小改动只增 REV; MAIN/SUB 由产品定)
#define HARDWARE_VER "3.00"
#define FIRMWARE_VER_MAIN 4
#define FIRMWARE_VER_SUB 36
#define FIRMWARE_VER_REV 34
#define FIRMWARE_VER_REV 35
#define HARDWARE_VER_MAIN 3
#define HARDWARE_VER_SUB 0
@@ -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)
}
}