Files
STM32F4-Base/docs/内存管理/存储栈RAM优化调研.md
T
wandering1 506eccc68f docs: 错误码传播审计收口并删除该文档(E-xx 转历史编号族)
本次会话先后销项与关闭:
- E-61 SD2506 清 INTAF:原实现只读取 CTR1,而按手册 ARST=0 时读操作
  不清标志,属空操作;改为读-改-写 CTR1,并按手册订正 CTR1 位宏
  (INTAF/INTDF/BLF 位置,ARST 归 CTR3)
- E-16 cfg_file:新增 CFG_FILE_MAX_NAME_LEN(段名/键名 ≤15),注册时
  拒绝超长键名;s_gen_document 两处 snprintf 改检查式;补 TC-CFG-024
  用例(主机单测 149→151 PASSED)
- E-23 TC704:PHASE7_MULTI_COUNT 8→5(并发上限 = 8 − 3 个常驻监听),
  accept 失败分支加网络代次检查(网络重建即重建监听)
- E-26(UDP)按“保留 API + 文档定案”关闭;E-30 评估为不必要后关闭;
  N-4(ACCEPT 决定不实施)关闭

审计文档剩余 5 项 P2 + 2 项监督,经用户裁定“都不重要”后整体删除:
- 删除 docs/问题记录/错误码传播审计.md(634 行)
- 九类缺陷模式表迁入 docs/编号规范.md §4.2.1(PAT-01~09)
- E-xx 转为纯历史编号族:编号规范 §4.1 属主改“无(原属主已删除)”,
  §4.3 保持冻结;全仓 26 处引用按“保留编号、去悬空文档名”处理
- 顺带修正 N-4 收口遗留:排期详述 C1 才是 E-25/E-27/E-28 的承载处
  (审计 §4 曾误写为登记簿);README 两处 C1 旧名改回“net 层跨上下文收口”

一并提交此前遗留的体系层评审报告 2026-10-14 复核 WIP(六维评分复核、
未闭环 Top 5→3、三区水位实测刷新)。

校验:Keil 构建 0 错误 0 警告(Code=212344);check_doc_links
--sections-strict 与 --all(142 文档)通过;内存双台账刷新后均 PASS。
2026-10-15 07:39:38 +08:00

6.2 KiB
Raw Blame History

存储栈 RAM 优化调研

版本 v1.1 日期 2026-09-21 作者 AI 辅助调研 数据来源:data/ram_report_20260921.md(.map 静态占用)+ 逐行代码核验(nand_ftl.c / gd5f2gq5ue.c / Lib/dhara / Lib/FatFs/ffconf.h / lftpd*) 定位:RAM使用分析与优化方案.md 的存储专项补充;优化项编号 P0/P1/P2,与 docs/内存管理/RAM使用分析与优化方案.md §6 的 S 序号在"规划"一节对齐 v1.1 清理(2026-09-21 同日):移除已落地的 P0-1 BBT 页缓冲收缩(−1,776B,commit be1a30a)与编程回读校验整体移除的实施记录(详见 GD5F TRAP-GD5F-05),以及过期逐模块基线表;仅保留未实施项与回归要求

1. 现状约束(不变,是下述全部方案的依据)

  • 存储栈静态 RAM 全在 RW_IRAM1(主 SRAM 128KB);页缓冲(nand_ftl 3×2KB + gd5f 页缓冲/位图)走 SPI1 DMA(阈值 >1024B),DMA1/DMA2 物理不可达 CCM → 不能直迁 CCM(唯一途径:迁移 + gd5f_dma_buf_ok() 运行时守卫自动回落 CPU 轮询(2026-09-21 加固),不会静默失败,代价仅每页零点几 ms CPU)
  • 3×2KB 页缓冲是结构成本不可直缩:dhara journal 要求整页 checkpoint(journal.c:196 整页 memset);512B 扇区落 2KB 页必须整页 RMW;可动的只有 s_copy_buf(→ P0-2)
  • CPU-only 缓冲(lftpd static ~3.6K / cfg_file 0.7K / FATFS win 0.6K / lftpd_io 0.6K)迁 CCM 零代价(→ P1-5①)
  • 栈上 FIL 重复占深链:syslog 两处、cfg 存储两处、开机探针各一个局部 FIL(每个含 512B 私有 buf,≈552B),全压在 defaultTask 最坏链 2,776B 内(→ P1-4 靶点)
  • FatFs 配置已低 RAM 取向:FF_MAX_SS=512、FF_USE_LFN=0、FF_VOLUMES=1、FF_FS_LOCK=0;FF_FS_REENTRANT=1 为 defaultTask/ftpTask 并发访问必需,勿动
  • 教训(2026-09-21):任何比对式校验必须在两份独立副本间进行(U-Boot sf test 双缓冲形态)——旧 GC 拷贝自比对缺陷已随回读校验整体移除而消失;若未来测试构建恢复回读诊断,勿重蹈此坑

2. 方案清单(未实施)

# 方案 省 RAM 区域 风险 验证
P0-2 s_copy_buf 2048→512:GC 拷贝改分段 read→program_load(program_load/read_from_cache 支持列地址);纯 RAM 优化(GC 拷贝暂存减半) −1,536B(可选,不计入当前预期) SRAM1 低(仅动拷贝机制) 待 RAM 余量需要时再议
P0-3 lftpd 缓冲收紧:response 512→256、read_buffer 512→256、arg_buf 512→256、name 256→128 ×2(本卷仅 8.3 短名,路径深度浅);数据块 2×1024 与 message 不动 −1,024B SRAM1 低(FTP 客户端实测行长远低于新值) @build + FTP 上传/下载/LIST 闭环 + @test
P1-4 FF_FS_TINY=1:删每 FIL 私有的 512B buf,文件数据走 FatFs->win 共享窗 静态 −528B;且栈上每处 FIL 峰值 −528B(defaultTask 最坏链 2,776→~2,250,实测峰 2,136→~1,600) SRAM1 + CCM 栈 中(所有文件 I/O 经 512B 窗 bounce,FTP 吞吐 −20~40%;LIST 与文件读交错只影响速度) 存储套件 + FTP 吞吐实测 + 日志/配置闭环;与 S7 缩栈捆绑(直接支撑 defaultTask 降档)
P1-5 APP_CCM_ENABLE 门(与 S6 同宏):①CPU-only 缓冲迁 CCM——lftpd static 3.6K + cfg_file 0.7K + FATFS win 0.6K + lftpd_io ≈ −4.9K 零代价;②DMA 页缓冲(nand_ftl 4.6K + gd5f 位图/页 0.8K)迁 CCM 走轮询 ≈ −5.4K,需实测吞吐 −10.3K SRAM1→CCM 低①/中② 分段实施;每步跑 ram_report.py + @test + FTP 吞吐
P2-6 NAND copy-back 命令(0x15→0x10)替代主机搬页:省 s_copy_buf 的拷贝用途 + 减半 SPI 流量 −512B(P0-2 后) SRAM1 高(片上 ECC 在 copy-back 下的语义须台架实证) 仅评估,暂缓
P2-7 lftpd 数据块 2×1024→512 −1,024B SRAM1 吞吐 −~30% RAM 仍紧时才做
P2-8 syslog/cfg 共享一个静态 FIL(同任务串行) 净≈0(静态+528/栈−528) — 不推荐:P1-4 已覆盖同一收益面 —

明确不做:移除 dhara(丢掉电一致性与坏块重映射,代价不对称);journal checkpoint 分片(违反 dhara 协议);调 gc_ratio(无 RAM 收益);FF_FS_REENTRANT=0(defaultTask+ftpTask 并发访问 FatFs 必需)。

3. 分阶段规划(与 RAM使用分析与优化方案.md §6 S 序号对齐)

阶段 内容 收益 前置
第一步(独立小批) P0-3(P0-2 搁置,待 RAM 余量需要时再议) −1,024B 无
第二步(并入 S7 缩栈批) P1-4 FF_FS_TINY=1 → 复跑 stack_report.py → defaultTask 降档(最坏链 ~2,250 支撑 3,584B 配置,余量 37%)+ 其余任务按 S7 目标 −528B 静态 + 栈档下调释放 CCM 堆 第一步合入
第三步(与 S6/S8 同批) 先 S8 堆 48K→32K(CCM 释放 ~16K),再 P1-5 ①→② 分批迁 CCM SRAM1 再 −10.3K;CCM 占用 +10.3K(由 S8 腾挪覆盖) S8 或同批评估 CCM 水位

全部落地后存储栈预期:SRAM1 常驻降至 ~1.9KB(现 13.7KB,其中 P0-1 已省 1,776B 不重复计;余下仅小状态量),页缓冲驻 CCM(轮询),未实施项合计换回 SRAM1 ≈ −11.9K(P0-2 搁置,其 −1,536B 不计);叠加 S5(LVGL 40K→16K)后 SRAM1 余量 >65KB。

4. 回归与基线

  • FTP 吞吐基线(2026-09-21 实测,4MB 文件,端到端含网络;瓶颈在存储侧,100M 网络非瓶颈):STOR 126.9 KB/s(32.3s)/ RETR 321.4 KB/s(12.7s),回传逐字节 MATCH(测试文件已自清理)→ P0-3/P1-4 前后各留一轮实测对比(P1-4 预期吞吐降幅 20~40%)
  • P1-4 前后各跑一次 stack_report.py + ram_report.py(AGENTS.md 门禁)
  • P1-5 的 ②(页缓冲入 CCM 走轮询)须以实测吞吐定去留:若 NAND 读吞吐降幅 >30%,则只迁 CPU-only 侧(①)
  • P0-2/P2-x:待 RAM 余量需要时再议
  • 下次存储改动照常执行台架破坏性套件 + 掉电 resume
  • 基线数字可用 data/ram_report_20260921.md(P0-1 前快照)复核;实施后重生成基线报告并回填总方案