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
@@ -142,11 +142,9 @@ void offlog_init(void)
if (!(h.magic[0] == OFFLOG_HEAD_MAGIC0 && h.magic[1] == OFFLOG_HEAD_MAGIC1 &&
h.magic[2] == OFFLOG_HEAD_MAGIC2 && h.magic[3] == OFFLOG_HEAD_MAGIC3)) {
/* 全新区: 擦全部数据扇区, 写头 */
uint32_t i;
for (i = 0; i < OFFLOG_DATA_SECTOR_CNT; i++) {
SPI_Flash_Erase_Sector(OFFLOG_DATA_BASE / 4096 + i);
}
/* 全新区: 懒擦 — 只擦当前写扇区 ~45ms (原擦全部 127 扇区 ~5.7s,
主循环阻塞超 IWDG 4s 风险), 其余由环形写切扇区时自动擦 */
SPI_Flash_Erase_Sector(OFFLOG_DATA_BASE / 4096);
memset(&h, 0xFF, sizeof(h));
h.magic[0] = OFFLOG_HEAD_MAGIC0;
h.magic[1] = OFFLOG_HEAD_MAGIC1;
@@ -478,12 +476,11 @@ int offlog_evt_to_json(const OfflogEvt *e, char *buf, int buf_len)
*===========================================================================*/
void offlog_clear(void)
{
uint32_t i;
if (!_ready) return;
for (i = 0; i < OFFLOG_DATA_SECTOR_CNT; i++) {
SPI_Flash_Erase_Sector(OFFLOG_DATA_BASE / 4096 + i);
}
/* 逻辑清除 + 只擦写指针起点扇区 (~45ms, 原 2.8s 接近 IWDG 4s 风险):
count=0 使旧数据不可读, 其余扇区由环形写覆盖时自动擦 */
SPI_Flash_Erase_Sector(OFFLOG_DATA_BASE / 4096);
_wr_off = OFFLOG_DATA_BASE;
_wr_sector = 1;
_count = 0;