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:
@@ -333,6 +333,41 @@ static void test_part_table(void)
|
||||
printf("PASS test_part_table\n");
|
||||
}
|
||||
|
||||
/* 测试9: 懒擦 — init 只擦当前写扇区, 其余扇区由环形写切扇区时覆盖
|
||||
(修复: 原 init 擦全部 751 扇区 ~34s → 主循环阻塞超 IWDG 4s → 不断复位) */
|
||||
static void test_lazy_erase(void)
|
||||
{
|
||||
LUP_SensorReport sr;
|
||||
SnapRec r;
|
||||
uint32_t i;
|
||||
|
||||
reset_flash();
|
||||
/* 在数据扇区 2 预埋旧数据 (模拟 Flash 残留) */
|
||||
flash[SNAP_DATA_BASE + 4096] = 0xAA;
|
||||
flash[SNAP_DATA_BASE + 4096 + 1] = 0x55;
|
||||
|
||||
snap_init();
|
||||
/* 懒擦: 只擦扇区 1, 扇区 2 保持旧数据 */
|
||||
CHECK(flash[SNAP_DATA_BASE] == 0xFF); /* 扇区1 已擦 */
|
||||
CHECK(flash[SNAP_DATA_BASE + 4096] == 0xAA); /* 扇区2 未动 */
|
||||
CHECK(flash[SNAP_DATA_BASE + 4096 + 1] == 0x55);
|
||||
|
||||
make_report(&sr, 0x600, 600);
|
||||
for (i = 0; i < 64; i++) { /* 写满扇区 1 */
|
||||
snap_enqueue(&sr);
|
||||
snap_flush();
|
||||
}
|
||||
CHECK(flash[SNAP_DATA_BASE + 4096] == 0xAA); /* 仍在扇区 1 内, 扇区2 未动 */
|
||||
|
||||
snap_enqueue(&sr); /* 第 65 条切扇区 */
|
||||
snap_flush();
|
||||
CHECK(flash[SNAP_DATA_BASE + 4096] != 0xAA); /* 扇区2 已擦并写入新数据 */
|
||||
CHECK(snap_read_idx(64, &r) == 0);
|
||||
CHECK(r.seq == 65);
|
||||
CHECK(snap_count() == 65);
|
||||
printf("PASS test_lazy_erase\n");
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
test_fresh_init_and_flush();
|
||||
@@ -343,6 +378,7 @@ int main(void)
|
||||
test_ram_overflow_drop();
|
||||
test_clear_audit();
|
||||
test_part_table();
|
||||
test_lazy_erase();
|
||||
|
||||
if (failures) {
|
||||
printf("\n%d FAILURE(S)\n", failures);
|
||||
|
||||
Reference in New Issue
Block a user