feat(vd960DBN): 传感快照区落地 snapshot.c + BLE SNAP_STAT/QUERY/CLEAR

- snapshot.h/c: 64B 定长 SnapRec (头部16B + 4x12B 0xC0线圈数据原样)
  环形分区独立于事件日志, 快照区 = 总容量 - 固定区576KB - 事件区
- 线程模型: USART2 ISR 只打包+RAM暂存(8深满丢新), 主循环 snap_flush 落盘
  (iot_sensor_ingest 在中断上下文, SPI 45ms 擦除严禁进中断)
- dbn_ble_srv: SNAP_STAT(0x28)/SNAP_QUERY(0x29)/SNAP_CLEAR(0x2A)
  QUERY 上限 2 条 (64x2+2=130B, ODR 教训防御)
- iot_mqtt_srv: ingest 挂 snap_enqueue, publish_sensor 挂 snap_flush
  (放在 READY 检查前, 断网照常落盘)
- peripheral_main: offlog_init 后加 snap_init
- 清空审计: 写事件流 log_clear payload[0]=2
- 测试: test_snapshot.c 8 例全过, offlog/ble_offlog 回归全过
- 文档: DLD960_BLE协议 V1.02 + ROADMAP P1.2 状态 + devlog
This commit is contained in:
wangfq
2026-08-12 17:40:14 +08:00
parent a8120cc852
commit 92887a3d92
12 changed files with 1123 additions and 8 deletions
+28
View File
@@ -6,6 +6,34 @@
---
## 2026-08-12 — 传感快照区落地(snapshot.cBLE 新增 0x28/0x29/0x2A
### 背景
ROADMAP P1.2 分区规划(参数区→OTA→事件日志区→传感快照区)中,事件区已落地(offlog),快照区此前为预留。本次实现快照流:0xC0 传感帧按上报节奏落盘,断网期间波形照常记录,可离线回放。
### 关键设计决策
1. **64B 定长记录 SnapRec**:头部 16Bmagic=0xA6/len/flags/seq/ts_ms/boot_seq+ 4×12B 线圈数据(与 0xC0 线上格式逐字节一致,可直接对照抓包)→ W25Q32 下 48064 条。
2. **线程安全(踩坑预警)**`iot_sensor_ingest()`**USART2 ISR 上下文**`loop_uart_proto.h:209` 明确标注)被调用!SPI 擦除 ~45ms 绝不能在中断里做 → 中断只打包+入 RAM 暂存(8 深,满丢新),主循环 `iot_mqtt_publish_sensor()` 每轮 `snap_flush()` 落盘。单生产者(中断)单消费者(主循环)count 计数环形,volatile 字节天然原子。
3. **分区表同一事实来源**:快照区 = 总容量 − 固定区 576KB − 事件区(`g_offlog_part.area_size`),杜绝两模块对事件区大小理解不一致。
4. **审计**:快照清除写事件流 `log_clear`payload[0]=2=快照流)。
5. **BLE 指令对齐 OFFLOG 模式**SNAP_STAT(0x28)/SNAP_QUERY(0x29)/SNAP_CLEAR(0x2A)QUERY 上限 2 条(64×2+2=130B ≤ 单包缓冲,ODR 教训防御)。
### 测试
`test_snapshot.c` 8 例全过(中断安全/打包格式/环形回绕/掉电恢复/扇区切换/暂存满丢新/清空审计/分区表);`test_offlog` 8 例、`test_ble_offlog` 7 例回归全过。
> ⚠ 测试踩坑:不要在同文件 include offlog.c + snapshot.c —— 两个 .c 的 static 变量(如 `_wr_off`)在同一翻译单元**符号冲突**,快照 clear 审计会污染事件写指针。测试改为 mock `g_offlog_part` + `offlog_evt`。
### 待板上验证
- 快照区 0x110000 起、W25Q32 48064 条 capacity 打印
- 中断风暴下暂存满丢新行为(观察点:`g_snap_drop`
- 掉电恢复跨扇区扫描
---
## 2026-08-12 — BLE 分包粒度动态化修复(Too large noti 丢包)
### 背景