fix(vd960DBN): init/clear 懒擦修复不断重启 — 34s 全量擦除超 IWDG 4s

现场: 烧录快照固件后 CH32V208 不断重启 + 串口乱码
根因: snap_init 首擦 751 扇区 ~34s (头在擦完才写→复位后仍全新→死循环);
      snap_clear 34s / offlog_clear 2.8s 同类; 均超 IWDG 4s
修复(懒擦): init/clear 只擦写指针起点扇区 ~45ms, 其余由环形写切扇区
      逻辑自动擦; clear 为逻辑清除 (count=0 旧数据不可读)
附带: usart_biz.c 非 0x7F 帧 %s 打印改 hex (Loop 数据当字符串=乱码源)
      snapshot.h 线程模型注释修正 (lup_process_frame 实际在主循环 uart_srv)
测试: test_snapshot 9例(新增 lazy_erase) + offlog/ble_offlog 回归全过
This commit is contained in:
wangfq
2026-08-12 18:31:56 +08:00
parent 92887a3d92
commit 3d4814bffe
8 changed files with 105 additions and 32 deletions
+37
View File
@@ -6,6 +6,43 @@
---
## 2026-08-12 — 设备不断重启修复:init/clear 同步全量擦除阻塞超 IWDG
### 现场症状
烧录快照固件后 CH32V208 不断重启,启动打印(`CH32V20x_BLE_LIB` / `SystemCoreClock` / `W25Q32 OK!`)后出现乱码:`>>8>潈8>0>8...`
### 根因链
| # | 环节 | 问题 |
|---|------|------|
| 1 | `snap_init()` 全新区 | 首次初始化**同步擦全部 751 个数据扇区 ≈ 34s**SPI 擦除 45ms/扇区) |
| 2 | IWDG 看门狗 4siot_mqtt_srv.c:978 | 34s 主循环阻塞 → 看门狗超时 → 复位 |
| 3 | 复位后快照区仍无 "SNAP" magic | 头在擦完数据扇区后才写 → 下次启动又全新区 → **再擦 34s → 再复位 = 死循环** |
| 4 | `offlog_init()` 首擦 5.7s / `offlog_clear()` 2.8s | 同类隐患(事件区全新或清空时) |
| 5 | `snap_clear()` 擦 751 扇区 34s | IWDG 启用后执行 BLE SNAP_CLEAR 命令 → 必复位 |
| 6 | `usart_biz.c:195` 非 0x7F 帧 `%s` 打印 | Loop MCU 数据被当字符串 → 串口乱码刷屏 |
> 附带修正认知:`lup_process_frame` 实际由**主循环** `uart_srv()` 调用(usart_biz.c:166),USART2 ISR 只逐字节喂 `lup_feed_byte()`。快照 enqueue/flush 全程主循环上下文——此前 snapshot.h 注释误标"ISR 上下文"。
### 修复:懒擦(init/clear 只擦当前写扇区,45ms
- `snap_init` / `offlog_init` 全新区:只擦数据扇区 1(写指针起点),其余扇区由环形写**切扇区逻辑自动擦**(write_raw 已有 has_data 判定)
- `snap_clear` / `offlog_clear`**逻辑清除**(count=0 → 旧数据立即不可读)+ 只擦写指针起点扇区;其余扇区写覆盖时逐个擦
- `usart_biz.c`:非 0x7F 帧 `%s` 打印改 hex` %02X`),杜绝二进制当字符串
启动阻塞 34s → 45msSNAP_CLEAR 阻塞 34s → 45ms。环形覆盖语义完全不变。
### 测试
`test_snapshot` 9 例全过(新增 test_lazy_erase:预埋扇区 2 旧数据,init 后保持,写满 64 条切扇区时正确覆盖);`test_offlog` 8 例、`test_ble_offlog` 7 例回归全过。
### 待现场确认
- 乱码另一可能源:**Loop MCU ↔ CH32 UART2 波特率/接线**192000 应为标准 0x7F 帧;若 Loop 发送端配置不同,帧头识别失败 → 非 0x7F 路径)。hex 打印修复后可通过 `Rcv_len:xx,dat: 7F 00 ...` 判断 Loop 帧是否正常到达。
---
## 2026-08-12 — 传感快照区落地(snapshot.cBLE 新增 0x28/0x29/0x2A
### 背景