fix(vd960DBN): 栈溢出止血 — load_cfg 去调试打印, output_cfg 暂关 (2026-08-17)
实验D确认 load_cfg/output_cfg 为跑飞触发点。根因: .bss≈46KB (BLE栈+ETH DMA 7.6KB+SPI_FLASH_BUF 4KB+网络缓冲) 挤占 RAM, 栈仅 ~1.9KB (BOOT_CNT@0x2000f84c 证明 .noinit 被推到 RAM 顶)。 load_cfg 的 printf 栈峰值触顶 → 覆盖 .noinit+返回地址 → PC 跑飞循环。 修复: - cfig_flash.c: load_cfg 内 3 处调试 PRINT 注释 (magic mismatch×2 + Sub_Code×1) - peripheral_main.c: load_cfg 恢复(配置加载保留); output_cfg 调用 #if 0 (纯调试打印) - devlog: 实验D结论 + 修复记录 根治待办: 减 .bss 给栈腾 4KB+ (需 .map 确认大数组); output_cfg 恢复调试打印前需减栈压力
This commit is contained in:
+28
-4
@@ -33,11 +33,35 @@ Hex 日志诊断:
|
||||
| `snapshot.h` | 声明 `snap_delayed_init()` |
|
||||
| `peripheral_main.c` | main() 移除 snap_init 调用;主循环喂狗后加 snap_delayed_init();撤销实验A(恢复 offlog_boot)/实验B(恢复 load_cfg/output_cfg);保留 BOOT_CNT 诊断打印 |
|
||||
|
||||
### 实验 D 结论(2026-08-17 晚,commit 452ff68/后续)
|
||||
实验 D(跳过 load_cfg/output_cfg)**设备完全正常启动**(WCHNET/TCP/BLE 全通)→
|
||||
**触发点确认 = load_cfg_from_flash / output_cfg_from_flash**(栈溢出)。
|
||||
|
||||
BOOT_CNT 打印扩展证实 RAM 布局:
|
||||
```
|
||||
BOOT_CNT:1 @0x2000f84c END:0x2000f834 SP:0x2000ffd0
|
||||
```
|
||||
- END(0x2000f834) = 堆起点 → **.bss ≈ 46KB**(BLE 栈 + ETH DMA 7.6KB + SPI_FLASH_BUF 4KB + 网络缓冲)
|
||||
- g_boot_count@0x2000f84c = .noinit 被推到 RAM 顶 → **栈仅 ~1.9KB**(危险)
|
||||
- 栈溢出 → 覆盖 .noinit(g_boot_count 恒1/g_fault_diag 消失) + 返回地址 → PC 跑飞 → 循环
|
||||
- **快照延后无效的原因**:问题不是快照 SPI,是栈空间被 .bss 挤占
|
||||
|
||||
### 修复(栈溢出止血)
|
||||
| 文件 | 变更 |
|
||||
|------|------|
|
||||
| `cfig_flash.c` | load_cfg 内 3 处调试 PRINT 注释(magic mismatch ×2 + Sub_Code ×1)——printf 栈峰值是压垮 1.9KB 栈的最后一根稻草 |
|
||||
| `peripheral_main.c` | load_cfg 恢复(保留配置加载);output_cfg 调用 #if 0(纯调试打印,栈峰值高) |
|
||||
|
||||
### 遗留(根治)
|
||||
- [ ] **减 .bss 给栈腾 4KB+**:需用户提供编译后 .map 确认 46KB 组成(BLE 缓冲/ETH_RX_BUF/iot payload)
|
||||
- [ ] output_cfg 恢复:减栈后重新启用调试打印
|
||||
- [ ] 快照区 3s 延后初始化保留(已确认非根因,但作为启动早期 SPI 减压措施无害)
|
||||
- [ ] 示波器 VDD:确认 SPI 擦写瞬间电源裕量(次要,软件栈溢出已确认)
|
||||
|
||||
### 验证
|
||||
- [ ] 板级:开机 3s 内无 `INIT: snap ok`(快照区未初始化),3s 后出现
|
||||
- [ ] 板级:不再循环重启,BOOT_CNT 不再恒 1
|
||||
- [ ] 板级:断网期间快照正常落盘、BLE 0x28/0x29/0x2A 查询正常
|
||||
- [ ] 若仍循环:示波器抓 VDD(SPI 擦写瞬间跌落)+ 实验B 二分 load_cfg/output_cfg
|
||||
- [x] 实验D:跳过 load_cfg/output_cfg → 正常启动(WCHNET/TCP/BLE 全通)
|
||||
- [ ] 板级:本修复版(load_cfg 恢复+去打印)→ 正常启动 + 配置加载生效
|
||||
- [ ] 板级:不再循环重启
|
||||
|
||||
### 遗留
|
||||
- BOOT_CNT 打印保留(确认 .noinit 段生效 + 区分复位 vs 跑飞重启)
|
||||
|
||||
Reference in New Issue
Block a user