From 26f2326c96d7eac36909dc70a174f62dd484eaea Mon Sep 17 00:00:00 2001 From: wangfq Date: Mon, 17 Aug 2026 11:06:56 +0800 Subject: [PATCH] =?UTF-8?q?fix(vd960DBN):=20=E6=A0=88=E6=BA=A2=E5=87=BA?= =?UTF-8?q?=E6=AD=A2=E8=A1=80=20=E2=80=94=20load=5Fcfg=20=E5=8E=BB?= =?UTF-8?q?=E8=B0=83=E8=AF=95=E6=89=93=E5=8D=B0,=20output=5Fcfg=20?= =?UTF-8?q?=E6=9A=82=E5=85=B3=20(2026-08-17)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实验D确认 load_cfg/output_cfg 为跑飞触发点。根因: .bss≈46KB (BLE栈+ETH DMA 7.6KB+SPI_FLASH_BUF 4KB+网络缓冲) 挤占 RAM, 栈仅 ~1.9KB (BOOT_CNT@0x2000f84c 证明 .noinit 被推到 RAM 顶)。 load_cfg 的 printf 栈峰值触顶 → 覆盖 .noinit+返回地址 → PC 跑飞循环。 修复: - cfig_flash.c: load_cfg 内 3 处调试 PRINT 注释 (magic mismatch×2 + Sub_Code×1) - peripheral_main.c: load_cfg 恢复(配置加载保留); output_cfg 调用 #if 0 (纯调试打印) - devlog: 实验D结论 + 修复记录 根治待办: 减 .bss 给栈腾 4KB+ (需 .map 确认大数组); output_cfg 恢复调试打印前需减栈压力 --- .../OnlyUpdateApp_Peripheral/APP/cfig_flash.c | 9 ++++-- .../APP/peripheral_main.c | 15 ++++----- vd960DBN/docs/devlog.md | 32 ++++++++++++++++--- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/cfig_flash.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/cfig_flash.c index 889ceb4..49a7422 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/cfig_flash.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/cfig_flash.c @@ -245,7 +245,8 @@ void load_cfg_from_flash(void) 现场: SPI_Flash_Write(参数区 0x00, 512B) → RST=0x00000000 硬件复位 → magic 写不进 → 无限复位循环。SPI 写触发硬件复位实锤(与快照区无关)。 临时方案: 不写 Flash, 用内存默认配置继续 (恢复原逻辑删本块即可) */ - PRINT("CFG: magic mismatch - MEMORY DEFAULTS (factory SPI write disabled)\n"); + /* 2026-08-17 栈溢出修复: 调试 PRINT 栈峰值触顶(1.9KB栈), #if 0 */ + /* PRINT("CFG: magic mismatch - MEMORY DEFAULTS (factory SPI write disabled)\n"); */ memset(g_dev_number, 0, 6); memcpy(g_dev_number, gMacAddr, 6); sprintf(g_dev_number_str, "%02X%02X%02X%02X%02X%02X", @@ -289,7 +290,8 @@ void load_cfg_from_flash(void) g_sub_code_enable.dgdus_enable = 0; g_sub_code_enable.wbdus_enable = 0; g_sub_code_enable.radar_enable = 0; - PRINT("CFG: memory defaults OK (no factory write)\n"); + /* 2026-08-17 栈溢出修复: #if 0 */ + /* PRINT("CFG: memory defaults OK (no factory write)\n"); */ return; } @@ -360,7 +362,8 @@ void load_cfg_from_flash(void) g_sub_code_enable.wbdus_enable = (g_sub_code_enable.code_set >> 5) & 0x01; g_sub_code_enable.radar_enable = (g_sub_code_enable.code_set >> 6) & 0x01; - PRINT("\nSub_Code: 0x%04X, net_enable:%d, iot_enable:%d\n", g_sub_code_enable.code_set, g_sub_code_enable.net_enable, g_sub_code_enable.iot_enable); + /* 2026-08-17 栈溢出修复: #if 0 */ + /* PRINT("\nSub_Code: 0x%04X, net_enable:%d, iot_enable:%d\n", g_sub_code_enable.code_set, g_sub_code_enable.net_enable, g_sub_code_enable.iot_enable); */ // g_sub_code_enable.laser_enable = (g_sub_code_enable.code_set >> 9) & 0x01; // g_sub_code_enable.lora_enable = (g_sub_code_enable.code_set >> 15) & 0x01; diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c index d95b7bd..f83bb49 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/peripheral_main.c @@ -357,15 +357,14 @@ int main(void) OFFLOG_RCC_RSTSCKR |= OFFLOG_RST_RMVF; /* RMVF (bit24): 清复位标志 */ } - /* ===== 实验D (2026-08-17): 验证 load_cfg/output_cfg 是否为栈溢出触发点 ===== - BOOT_CNT@0x2000f854 → 栈≈1.9KB (极小)。此二函数含 malloc(512B)+ - SPI_Flash_Read+大量 printf(%s), 栈峰值可能触顶。 - 稳定 → 触发点确认(此处栈深); 仍崩 → 触发点在别处(BLE init等) */ -#if 0 + /* ===== 栈溢出修复 (2026-08-17): 实验D确认 load_cfg/output_cfg 为触发点 ===== + .bss≈46KB → 栈仅~1.9KB; load_cfg 的 printf 栈峰值触顶 → 跑飞。 + 修复: load_cfg 恢复(保留配置加载), 其内部调试 PRINT 已 #if 0 (cfig_flash.c); + output_cfg 全部为调试打印, 调用暂 #if 0 (栈峰值来源)。 + 根治: 减 .bss 给栈腾 4KB+ (待 .map 确认大数组) */ load_cfg_from_flash(); - output_cfg_from_flash(); -#else - PRINT("EXPD: load_cfg/output_cfg skipped\n"); +#if 0 + output_cfg_from_flash(); /* 调试打印专用, 栈峰值高, 恢复前需减栈压力 */ #endif #endif diff --git a/vd960DBN/docs/devlog.md b/vd960DBN/docs/devlog.md index 88884e5..720db97 100644 --- a/vd960DBN/docs/devlog.md +++ b/vd960DBN/docs/devlog.md @@ -33,11 +33,35 @@ Hex 日志诊断: | `snapshot.h` | 声明 `snap_delayed_init()` | | `peripheral_main.c` | main() 移除 snap_init 调用;主循环喂狗后加 snap_delayed_init();撤销实验A(恢复 offlog_boot)/实验B(恢复 load_cfg/output_cfg);保留 BOOT_CNT 诊断打印 | +### 实验 D 结论(2026-08-17 晚,commit 452ff68/后续) +实验 D(跳过 load_cfg/output_cfg)**设备完全正常启动**(WCHNET/TCP/BLE 全通)→ +**触发点确认 = load_cfg_from_flash / output_cfg_from_flash**(栈溢出)。 + +BOOT_CNT 打印扩展证实 RAM 布局: +``` +BOOT_CNT:1 @0x2000f84c END:0x2000f834 SP:0x2000ffd0 +``` +- END(0x2000f834) = 堆起点 → **.bss ≈ 46KB**(BLE 栈 + ETH DMA 7.6KB + SPI_FLASH_BUF 4KB + 网络缓冲) +- g_boot_count@0x2000f84c = .noinit 被推到 RAM 顶 → **栈仅 ~1.9KB**(危险) +- 栈溢出 → 覆盖 .noinit(g_boot_count 恒1/g_fault_diag 消失) + 返回地址 → PC 跑飞 → 循环 +- **快照延后无效的原因**:问题不是快照 SPI,是栈空间被 .bss 挤占 + +### 修复(栈溢出止血) +| 文件 | 变更 | +|------|------| +| `cfig_flash.c` | load_cfg 内 3 处调试 PRINT 注释(magic mismatch ×2 + Sub_Code ×1)——printf 栈峰值是压垮 1.9KB 栈的最后一根稻草 | +| `peripheral_main.c` | load_cfg 恢复(保留配置加载);output_cfg 调用 #if 0(纯调试打印,栈峰值高) | + +### 遗留(根治) +- [ ] **减 .bss 给栈腾 4KB+**:需用户提供编译后 .map 确认 46KB 组成(BLE 缓冲/ETH_RX_BUF/iot payload) +- [ ] output_cfg 恢复:减栈后重新启用调试打印 +- [ ] 快照区 3s 延后初始化保留(已确认非根因,但作为启动早期 SPI 减压措施无害) +- [ ] 示波器 VDD:确认 SPI 擦写瞬间电源裕量(次要,软件栈溢出已确认) + ### 验证 -- [ ] 板级:开机 3s 内无 `INIT: snap ok`(快照区未初始化),3s 后出现 -- [ ] 板级:不再循环重启,BOOT_CNT 不再恒 1 -- [ ] 板级:断网期间快照正常落盘、BLE 0x28/0x29/0x2A 查询正常 -- [ ] 若仍循环:示波器抓 VDD(SPI 擦写瞬间跌落)+ 实验B 二分 load_cfg/output_cfg +- [x] 实验D:跳过 load_cfg/output_cfg → 正常启动(WCHNET/TCP/BLE 全通) +- [ ] 板级:本修复版(load_cfg 恢复+去打印)→ 正常启动 + 配置加载生效 +- [ ] 板级:不再循环重启 ### 遗留 - BOOT_CNT 打印保留(确认 .noinit 段生效 + 区分复位 vs 跑飞重启)