feat(vd960DBN): 脱机事件日志系统 (W25Q32 环形) — 解决重复上线取证
背景: 设备挂平台测试出现重复上线(现场未断电), 无本地日志无法区分
设备真复位 vs MQTT 断连重连。iot_handle_suback 每次重连都发
initialize 是重复上线的直接证据, 日志需能区分二者。
实现 (V3.6, ROADMAP P1.2 事件流先行):
- offlog.c/h: W25Q32 256KB 环形事件日志 (头扇区+63数据扇区, 8064条)
- 32B 定长记录: magic/type/len/flags/seq/ts_ms/unix_ts/boot_seq/payload[12]
- 8 类事件: BOOT(复位原因)/IOT_CONNECT/READY/DISCONN/RECONN/
EVT_RETRY/GIVEUP/COIL/TIME_ANCHOR/LOG_CLEAR
- 掉电恢复: 头扇区写指针锚点 + 上电 seq 连续性扫描
- 编译期断言防 32B padding 回归
- 插桩 (全部主循环上下文, socket 中断内不写 SPI):
- main(): offlog_init + RCC_RSTSCKR 复位原因采集/清除
- iot_mqtt_poll(): MQTT 状态沿检测 (CONNECT/READY/DISCONN)
- 重连退避/TCP超时/CONNACK拒绝: RECONN/DISCONN(4)/(3)
- iot_evt_process/enqueue: EVT_RETRY/GIVEUP/COIL
- net_srv.c dev_time_sync: TIME_ANCHOR 时钟同步锚点
- tests/test_offlog.c: gcc 隔离单测 6 例 (mock W25Q32 NOR 语义)
关键坑: ①中断内写SPI阻塞 ②结构体36B padding致环形错乱
③扇区级覆盖粒度count扣减语义 (均单测抓出)
待办: P1.3 导出命令(log_query/stat/clear) + 快照流 + 复位原因板上验证
This commit is contained in:
@@ -22,6 +22,7 @@
|
||||
#include "eth_driver.h"
|
||||
#include "net_srv.h"
|
||||
#include "storage.h"
|
||||
#include "offlog.h"
|
||||
#include "tcp_json_srv.h"
|
||||
#include "loop_uart_proto.h"
|
||||
#include "iot_mqtt_srv.h"
|
||||
@@ -302,6 +303,16 @@ int main(void)
|
||||
PRINT("SystemCoreClock:%d\n", SystemCoreClock);
|
||||
GetMacAddr(gMacAddr);
|
||||
storage_init();
|
||||
offlog_init();
|
||||
|
||||
/* 复位原因: 必须在初始化后立即读 (离复位时刻最近), 并清除标志,
|
||||
保证下次上电只反映本次复位原因 (RCC_RSTSCKR, STM32F1/CH32V20x 兼容) */
|
||||
{
|
||||
uint32_t rcc_rst = OFFLOG_RCC_RSTSCKR;
|
||||
offlog_boot(rcc_rst);
|
||||
OFFLOG_RCC_RSTSCKR |= (1UL << 27); /* RMVF: 清复位标志 */
|
||||
}
|
||||
|
||||
load_cfg_from_flash();
|
||||
output_cfg_from_flash();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user