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:
@@ -167,11 +167,9 @@ void snap_init(void)
|
||||
|
||||
if (!(h.magic[0] == SNAP_HEAD_MAGIC0 && h.magic[1] == SNAP_HEAD_MAGIC1 &&
|
||||
h.magic[2] == SNAP_HEAD_MAGIC2 && h.magic[3] == SNAP_HEAD_MAGIC3)) {
|
||||
/* 全新区: 擦全部数据扇区, 写头 */
|
||||
uint32_t i;
|
||||
for (i = 0; i < SNAP_DATA_SECTOR_CNT; i++) {
|
||||
SPI_Flash_Erase_Sector(SNAP_DATA_BASE / 4096 + i);
|
||||
}
|
||||
/* 全新区: 懒擦 — 只擦当前写扇区 (数据扇区1) ~45ms, 其余扇区由环形写
|
||||
切扇区时自动擦。原擦全部 751 扇区 ~34s → 主循环阻塞超 IWDG 4s → 复位 */
|
||||
SPI_Flash_Erase_Sector(SNAP_DATA_BASE / 4096);
|
||||
memset(&h, 0xFF, sizeof(h));
|
||||
h.magic[0] = SNAP_HEAD_MAGIC0;
|
||||
h.magic[1] = SNAP_HEAD_MAGIC1;
|
||||
@@ -306,7 +304,9 @@ static void snap_pack(const LUP_SensorReport *sr, SnapRec *rec)
|
||||
}
|
||||
|
||||
/*===========================================================================
|
||||
* 中断安全入队 (USART2 ISR 上下文; 无 SPI, 无阻塞; 满丢新不覆盖)
|
||||
* 入队 (主循环上下文: uart_srv → lup_process_frame → iot_sensor_ingest)
|
||||
* USART2 ISR 只逐字节喂 lup_feed_byte, 完整帧由主循环 uart_srv 处理 →
|
||||
* 本函数不在中断里, 但保留 RAM 暂存 + flush 两段式: 批量落盘省 SPI 写次数
|
||||
* - 生产者只写 g_snap_wr / g_snap_pending / g_snap_count
|
||||
* - 消费者只读 g_snap_rd; count 为 volatile 字节, 单核单指令读写天然原子
|
||||
* - 满判定: count >= DEPTH (容量 = SNAP_RAM_DEPTH)
|
||||
@@ -389,12 +389,11 @@ int snap_read_idx(uint32_t idx, SnapRec *out)
|
||||
*===========================================================================*/
|
||||
void snap_clear(void)
|
||||
{
|
||||
uint32_t i;
|
||||
if (!_ready) return;
|
||||
|
||||
for (i = 0; i < SNAP_DATA_SECTOR_CNT; i++) {
|
||||
SPI_Flash_Erase_Sector(SNAP_DATA_BASE / 4096 + i);
|
||||
}
|
||||
/* 逻辑清除 + 只擦写指针起点扇区 (~45ms): count=0 使旧数据不可读,
|
||||
其余扇区由环形写覆盖时自动擦。原擦全部 751 扇区 ~34s > IWDG 4s → 复位 */
|
||||
SPI_Flash_Erase_Sector(SNAP_DATA_BASE / 4096);
|
||||
_wr_off = SNAP_DATA_BASE;
|
||||
_wr_sector = 1;
|
||||
_count = 0;
|
||||
|
||||
Reference in New Issue
Block a user