docs(存储): 补上 N-15 页缓冲可合并性论证,判定三块不可合并

报告 N-15 一直写"与 R-3 同批评估",但评估从来没写过——nand_ftl.c:300
的注释直接引用了这份不存在的"报告 R-3"。本次补齐:

- 6,216 B = RW 16 + ZI 6,200,三块 2 KB 页缓冲 6,144 B 占 98.8%
- 不可合并:dhara_map_write 先 auto_gc(map.c:327)再落数据,GC 搬页
  与"待写的 s_cache_buf""攒了 16 页的 checkpoint 元数据 s_page_buf"
  三方同时存活,任两块合并都是静默错数据而非报错
- s_page_buf 也不能缩:元数据跨 0..1,999 偏移,编程的是整页
- 唯一可动的是 s_copy_buf:分块 512 B(-1,536 B,4 次 CPU 轮询)或
  内部搬页 copy-back(-2,048 B,须实证"奇偶属性相同"限制)
- 收益落点 RW_IRAM1(余 55,808 B),红线在 CCM(余 7,904 B)→ 判定不做

顺带订正 nand_ftl.c 两处注释:悬空引用改指本节;s_page_buf 原文写
"仅装 132 B 走轮询"不成立,实际按整页 2,048 B 编程、同样走 DMA。

@build 0 错 0 警告,镜像逐项不变(232,536 / 132,688 / 232,824)。
This commit is contained in:
2026-10-23 12:03:08 +08:00
parent 6822726b2c
commit b22779d244
3 changed files with 100 additions and 6 deletions
+5 -3
View File
@@ -297,7 +297,8 @@ int dhara_nand_prog(const struct dhara_nand *n, dhara_page_t p, const uint8_t *d
*
* 成本处理:先查页首 64 B——页首就有数据的页(绝大多数已编程页)当场返回非空,
* 与旧实现同价;只有"目前读到的全是 0xFF"的页才继续扫后段。分块用栈上 64 B
* 缓冲,不新增 2 KB 静态 RAM(页缓冲三块不可合并的评估见报告 R-3)。
* 缓冲,不新增 2 KB 静态 RAM(页缓冲三块不可合并的论证见
* docs/内存管理/存储栈RAM优化调研.md §5)。
*/
int dhara_nand_is_free(const struct dhara_nand *n, dhara_page_t p) {
uint8_t buf[64];
@@ -402,8 +403,9 @@ DSTATUS disk_initialize(BYTE pdrv) {
/* N-26 启动期地址自检(2026-10-12):本文件三个页缓冲是 SPI1 DMA 路径上
* 唯一的**静态**缓冲(dhara_map_read/write → dhara_nand_read/prog/copy,
* 2048 B > GD5F_DMA_THRESHOLD;s_page_buf 现仅装 dhara meta 132 B 走轮询,
* 但它同为页尺寸且交给 dhara 内部使用,一并守住防将来越窗)。
* 2048 B > GD5F_DMA_THRESHOLD;s_page_buf 页内虽只攒 132 B 元数据,
* 但编程的是**整页**(journal.c:992),传输长度同为 2048 B、同样走 DMA,
* 一并守住防将来越窗)。
* DMA1/DMA2 不可达 CCM——若 scatter 改动/段放置把它们挪进 CCM,DMA 会
* **静默不落地**(数据错而传输"成功")。缓冲地址链接期才确定,armcc
* 无法编译期断言(见 gd5f2gq5ue.h 的窗口常量注释),故在 init 期自检: