b22779d244
报告 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)。
Drivers/BSP/GD5F2GQ5UE/ — GD5F2GQ5UE SPI NAND 驱动 + FTL
256MB SPI NAND Flash 驱动,以及之上的 FTL(Flash 转换层,
nand_ftl.c)—— 提供逻辑块映射、坏块管理、磨损均衡。再上层是 dhara(坏块/磨损算法)与 FatFs。
文件一览
| 文件 | 作用 |
|---|---|
gd5f2gq5ue.c/h |
NAND 芯片底层驱动:读/写/擦除、页/块管理、ID 与状态查询 |
nand_ftl.c/h |
FTL 层:逻辑地址 → 物理地址映射、坏块表、磨损均衡 |
硬件接口
- SPI1:PE0 CS / PB3 SCK / PB4 MISO / PB5 MOSI / PB8 WP / PE1 HOLD
三层存储栈
FatFs(文件系统)
↓
dhara(坏块管理 + 磨损均衡算法,Lib/dhara/)
↓
nand_ftl.c(本目录,FTL 适配)
↓
gd5f2gq5ue.c(本目录,芯片驱动)
↓
GD5F2GQ5UE 芯片
⚠️ 改本驱动前必读陷阱
| 陷阱 | 说明 |
|---|---|
| FatFs 打开模式 | FA_OPEN_APPEND(0x30) 不含 FA_WRITE(0x02)——追加写必须 FA_WRITE|FA_OPEN_APPEND,否则 f_write 恒返 FR_DENIED(7) |
| FatFs 文件名 | 严格 8.3 短名、不得以点开头(.fschk 会 FR_INVALID_NAME,纯 RAM 判定不碰盘);自愈逻辑严禁把名字类错误归入"卷损坏"触发集 |
f_write 簇分配失败返回 FR_OK + 短写 |
判失败必须校验写回字节数(无错误码) |
| 禁用 C 库堆分配 | MicroLIB 堆仅 512B,malloc 必返回 NULL;用 pvPortMalloc/vPortFree |
完整台账见
docs/问题记录/GD5F2GQ5UE_Trap_Records.md。
相关文档
- 存储架构:
docs/架构设计/STM32F4-Base存储架构说明.md - 测试指南:
docs/测试说明/GD5F2GQ5UE_Test_Guide.md - 容量恢复:
docs/测试说明/存储维护与容量恢复.md