fix(vd960DBN): 联网复位事故 — OTA 命令缓冲合并 union (RAM 90% 栈余量不足)
现象: SUBACK 后收平台 report_config (PUBLISH len=197) → HardFault → NVIC_SystemReset (RST_REASON 0x10000000 = SFT, 非 IWDG) → 死循环复位 根因: RAM 90.02% + 6 个 OTA 分支独立 static resp[256~400] + hexbuf[513] 共 ~2.5KB BSS → 栈余量被挤 → iot_handle_publish 深调用链栈溢出 (局部栈改 static 是伪优化: BSS↑=栈余量↓; 正解是 union 复用减总量) 修复: - iot_mqtt_srv.c: 6 resp + hexbuf 合并函数级 static union _ota_io (~2KB 省) - ota_srv.c: _chunk_buf/_fs_frame 合并 union (~260B 省) + 删无用变量 验证: 语法 0 错误; gcc 隔离单测 10/10; 待板级确认 RAM 回 ~88% 不再复位
This commit is contained in:
@@ -4,6 +4,33 @@
|
||||
>
|
||||
> 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接
|
||||
|
||||
## 2026-08-20 — 联网复位事故修复:OTA 命令缓冲合并 union(RAM 90% 栈余量不足)
|
||||
|
||||
### 现象(板级)
|
||||
|
||||
联网后 SUBACK → 平台下发 MQTT PUBLISH(len=197,即 `report_config` 时钟同步)→ **HardFault → NVIC_SystemReset**(`RST_REASON: 0x10000000` = SFT 软件复位位,非 IWDG 0x20000000;CH32V20x 默认 HardFault_Handler 即软件复位)→ 死循环复位。
|
||||
|
||||
### 根因
|
||||
|
||||
MRS 编译 RAM **90.02%**(44248/48KB)逼近历史 .bss 挤栈红线。本次 OTA 实现 6 个命令分支各声明独立 `static char resp[256~400]` + `static char hexbuf[513]`(合计 ~2.5KB BSS)→ 栈余量被挤 → `iot_handle_publish` 深调用链(MQTT 解析 → simple_json → snprintf,report_config 分支本身还有局部 `data[512]`)**栈溢出 → HardFault**。复现稳定(每次收 report_config 必崩)。
|
||||
|
||||
### 修复
|
||||
|
||||
| 项 | 改动 | 省 |
|
||||
|----|------|-----|
|
||||
| iot_mqtt_srv.c | 6 个 resp + hexbuf 合并为函数级 `static union _ota_io { resp[512]; hexbuf[513]; }`(互斥复用) | **~2KB BSS** |
|
||||
| ota_srv.c | `_chunk_buf[256]` + `_fs_frame[254]` 合并 union(下载/校验与刷写帧互斥) | ~260B |
|
||||
| ota_srv.c | 删无用 `_fs_block_crc` | 4B |
|
||||
|
||||
**教训**:RAM 90% 环境下"局部栈改 static"是**伪优化**——BSS 增加 = 栈余量减少,深调用链照样溢出。正确方向是**合并复用缓冲减少总占用**(union),不是搬家。
|
||||
|
||||
### 验证
|
||||
|
||||
- 语法 0 错误(基线 interrupt 假阳性除外);gcc 隔离单测 10/10 PASS
|
||||
- **待板级确认**:拉最新代码重编,RAM 应回 ~88%,联网收 report_config 不再复位
|
||||
|
||||
---
|
||||
|
||||
## 2026-08-20 — Loop MCU 远程 OTA 固件实现(MQTT V1.08,ROADMAP P1.4 ①)
|
||||
|
||||
### 背景
|
||||
|
||||
Reference in New Issue
Block a user