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:
@@ -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 看门狗 4s(iot_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 → 45ms;SNAP_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.c,BLE 新增 0x28/0x29/0x2A)
|
||||
|
||||
### 背景
|
||||
|
||||
Reference in New Issue
Block a user