fix(vd960DBN): 栈溢出止血 — load_cfg 去调试打印, output_cfg 暂关 (2026-08-17)
实验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 恢复调试打印前需减栈压力
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user