From 8cf01544f6d06bd56d7ae00d6c6d30e061466bda Mon Sep 17 00:00:00 2001 From: wangfq Date: Mon, 17 Aug 2026 10:31:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(vd960DBN):=20=E5=BF=AB=E7=85=A7=E5=8C=BA?= =?UTF-8?q?=E5=BB=B6=E5=90=8E=E5=88=9D=E5=A7=8B=E5=8C=96(=E5=BC=80?= =?UTF-8?q?=E6=9C=BA3s=E5=90=8E)=20=E2=80=94=20=E9=81=BF=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=97=A9=E6=9C=9FSPI=E9=87=8D=E8=B4=9F=E8=BD=BD?= =?UTF-8?q?=E7=AA=97=E5=8F=A3=20(2026-08-17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 诊断: 08-14恢复快照区后频繁重启。RSTSCKR无复位标志(非硬件复位) + BOOT_CNT恒=1(.noinit被清, RAM全丢级) + 实验A(跳过offlog_boot)仍崩 → 启动早期SPI重负载(offlog/snap init 擦+整扇区写回~80ms×2)让系统 进入临界状态, 后续SPI操作(load_cfg读参数区)成为压垮点。 方案: - snapshot.c/h: 新增 snap_delayed_init(), 主循环每轮调用, 开机3s后 首次进入执行 snap_init (非阻塞, mstick()>=3000 门控) - peripheral_main.c: main() 移除 snap_init 调用; 主循环喂狗后加 snap_delayed_init(); 撤销实验A(恢复offlog_boot)/实验B(恢复load_cfg) - 3s内传感帧由 snap_enqueue/snap_flush 的 !_ready 门控自动丢弃不落盘 - 保留 BOOT_CNT 诊断打印(.noinit 计数器+地址) - devlog 置顶 2026-08-17 条目 --- .../APP/include/snapshot.h | 1 + .../APP/peripheral_main.c | 31 ++++---------- .../OnlyUpdateApp_Peripheral/APP/snapshot.c | 16 ++++++++ vd960DBN/docs/devlog.md | 41 +++++++++++++++++++ 4 files changed, 65 insertions(+), 24 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/include/snapshot.h b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/include/snapshot.h index 8ddd57c..3db41ed 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/include/snapshot.h +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/include/snapshot.h @@ -122,6 +122,7 @@ typedef struct { * API *===========================================================================*/ void snap_init(void); /* 上电初始化 (扫描恢复) */ +void snap_delayed_init(void); /* 主循环延后初始化 (开机 3s 后, 2026-08-17) */ uint8_t snap_enabled(void); /* Flash 初始化成功 */ void snap_enqueue(const LUP_SensorReport *sr); /* 主循环入队: 打包→RAM 暂存 (满丢新) */ diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c index f929461..12be4da 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c @@ -238,6 +238,7 @@ void Main_Circulation(void) { FAULT_MARKER(MK_LOOP_TOP); iot_watchdog_kick(); /* 无条件喂狗 (2026-08-13): 原只在 iot_mqtt_poll, tcp_json 分支不喂 */ + snap_delayed_init(); /* 快照区延后初始化: 开机 3s 后首次进入执行 (2026-08-17) */ TMOS_SystemProcess(); if(g_net_state.flag < 2) @@ -335,39 +336,21 @@ int main(void) PRINT("INIT: storage ok\n"); offlog_init(); PRINT("INIT: offlog ok\n"); - /* 快照区: 上电扫描恢复 (2026-08-14, printf 重入修复后恢复启用) */ - snap_init(); - PRINT("INIT: snap ok\n"); + /* 快照区: 延后初始化 (2026-08-17) — snap_init 移到主循环 3s 后 + (snap_delayed_init), 避开启动早期 SPI 重负载窗口 (擦+整扇区写回 ~80ms); + 3s 内的传感帧由 snap_enqueue/snap_flush 的 !_ready 门控自动丢弃不落盘 */ - /* ===== 实验A (2026-08-17): 跳过 offlog_boot SPI 写 — 验证跑飞触发点 ===== - 背景: 日志 RSTSCKR 全 0(非硬件复位) + snap ok 后 71B 乱码 + 无 ASCII - → PC 跑飞跳回 0x00000000 重启, 触发点在 offlog_boot(SPI 32B 页写) - 与 08-12 实验 99ef634 一致: 跳过 offlog_boot 写 → 不崩 - 不崩 → offlog_boot 写实锤; 仍崩 → 跑飞点下移 load_cfg/output_cfg - 验证后恢复: 取消 #if 0, 并视结果考虑延后到主循环喂狗后执行 */ + /* offlog_boot: 记录本次复位原因到事件日志。 + 实验A(2026-08-17, 跳过offlog_boot仍崩)证明其非跑飞触发点 → 已恢复 */ { uint32_t rcc_rst = OFFLOG_RCC_RSTSCKR; -#if 0 offlog_boot(rcc_rst); -#else - PRINT("EXPA: offlog_boot skipped\n"); -#endif OFFLOG_RCC_RSTSCKR |= OFFLOG_RST_RMVF; /* RMVF (bit24): 清复位标志 */ } - /* ===== 实验B (2026-08-17): 跳过 load_cfg/output_cfg — 跑飞触发点下移 ===== - 实验A(跳过 offlog_boot)仍崩 → 触发点不在 offlog_boot。 - 本版: #if 0 load_cfg_from_flash + output_cfg_from_flash - (load_cfg = malloc + SPI_Flash_Read 参数区512B + memcpy + free; - output_cfg = 大量 %s 打印 iot_net_info 等配置) - 不崩 → 触发点在此二函数(SPI 读参数区 or %s 越界打印); - 仍崩 → 触发点更晚(MAC/BLE init/主循环)或更早(snap_init 内) */ -#if 0 + /* load_cfg/output_cfg: 参数区 SPI 读 + 配置打印 — 实验B未测, 快照延后方案优先, 已恢复 */ load_cfg_from_flash(); output_cfg_from_flash(); -#else - PRINT("EXPB: load_cfg/output_cfg skipped\n"); -#endif #endif PRINT("MAC: %02X %02X %02X %02X %02X %02X\r\n", gMacAddr[0],gMacAddr[1], gMacAddr[2], gMacAddr[3],gMacAddr[4],gMacAddr[5]); diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/snapshot.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/snapshot.c index 4d408b3..d8c4df5 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/snapshot.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/snapshot.c @@ -210,6 +210,22 @@ void snap_init(void) _ready = 1; } +/*=========================================================================== + * 延后初始化 (2026-08-17): 开机 SNAP_START_DELAY_MS 后首次进入时执行一次。 + * 目的: 避开启动早期 SPI 重负载窗口 (擦扇区 + 整扇区写回 ~80ms), 该窗口 + * 疑似触发 VDD 跌落/跑飞 (08-17 诊断: BOOT_CNT 恒=1, RSTSCKR 无标志)。 + * 附带: 3s 内的传感帧由 snap_enqueue/snap_flush 的 !_ready 门控自然丢弃, + * 不落盘 (开机初期串口数据视为无效快照)。 + * 主循环每轮调用, 非阻塞 (未到延时/已初始化直接 return)。 + *===========================================================================*/ +#define SNAP_START_DELAY_MS 3000 +void snap_delayed_init(void) +{ + if (_ready) return; /* 已初始化 */ + if (mstick() < SNAP_START_DELAY_MS) return; /* 未到延时窗口 */ + snap_init(); +} + /*=========================================================================== * 落盘 (主循环上下文) *===========================================================================*/ diff --git a/vd960DBN/docs/devlog.md b/vd960DBN/docs/devlog.md index f26ab09..88884e5 100644 --- a/vd960DBN/docs/devlog.md +++ b/vd960DBN/docs/devlog.md @@ -4,10 +4,51 @@ > > 项目定位: DLD960 通信板 — BLE 配网、TCP JSON 协议服务、Loop MCU 串口桥接 +## 2026-08-17 — 快照区延后初始化(开机 3s 后)— 启动早期 SPI 重负载疑似触发跑飞 + +### 背景 +08-14 恢复快照区功能(8873b33)后,现场频繁"复位"(100~180ms 一轮完整启动日志)。 +Hex 日志诊断: + +| 观察 | 推断 | +|------|------| +| RST_REASON 首次 0x08000000(POR),之后恒 0x00000002(无任何复位标志位) | 非硬件复位(POR/IWDG/SFT/PIN 都会置位) | +| 无 FAULT_DIAG 输出 | 非 HardFault(fault_diag 仅在 HardFault 后打印) | +| 每轮都到 `INIT: snap ok`,之后无任何 ASCII 直接 71B 乱码+重启 | 跑飞点在 snap_init 之后(offlog_boot/load_cfg/output_cfg 区间) | +| 实验A(跳过 offlog_boot,commit 0c717e4):仍崩 | offlog_boot 非触发点 | +| BOOT_CNT 恒=1(.noinit 计数器每次从 0 开始) | RAM 全丢级重启(掉电-恢复但未触发 POR) | + +### 结论 +启动早期 SPI 重负载(offlog_init 擦+整扇区写回 ~80ms + snap_init 擦+整扇区写回 ~80ms) +让电源/系统进入临界状态,随后的 SPI 操作(load_cfg 读参数区)成为压垮点。 +08-13"稳定 6 分钟"实为实验状态(snap_init/offlog_boot 均 #if 0),非完整固件。 + +### 方案 +快照区延后到开机 3s 后初始化:避开启动早期 SPI 重负载窗口;3s 内传感帧 +由 snap_enqueue/snap_flush 的 !_ready 门控自然丢弃(视为无效快照数据)。 + +| 文件 | 变更 | +|------|------| +| `snapshot.c` | 新增 `snap_delayed_init()`:主循环每轮调用,mstick()>=3000 且未初始化时执行 snap_init(非阻塞) | +| `snapshot.h` | 声明 `snap_delayed_init()` | +| `peripheral_main.c` | main() 移除 snap_init 调用;主循环喂狗后加 snap_delayed_init();撤销实验A(恢复 offlog_boot)/实验B(恢复 load_cfg/output_cfg);保留 BOOT_CNT 诊断打印 | + +### 验证 +- [ ] 板级:开机 3s 内无 `INIT: snap ok`(快照区未初始化),3s 后出现 +- [ ] 板级:不再循环重启,BOOT_CNT 不再恒 1 +- [ ] 板级:断网期间快照正常落盘、BLE 0x28/0x29/0x2A 查询正常 +- [ ] 若仍循环:示波器抓 VDD(SPI 擦写瞬间跌落)+ 实验B 二分 load_cfg/output_cfg + +### 遗留 +- BOOT_CNT 打印保留(确认 .noinit 段生效 + 区分复位 vs 跑飞重启) +- 快照区延后 3s 期间(0~3s)传感数据不落盘(按需求接受) +- 电源裕量问题若确认:W25Q32 VCC 加 100nF+10uF 电容、SPI 走线远离电源 + --- ## 2026-08-14 — 快照区功能恢复启用 + UART2 波特率澄清 + ### 背景 printf 重入复位问题已确诊修复(2026-08-13,SPI 写无罪)。实验遗留的隔离代码收尾:快照区恢复启用、模拟写密度的 `sim_snap_spi` 实验桩移除。