refactor(nand): dhara 几何字面量收单一真源 + 两条编译期守卫
上一笔提交 720f841 留下的待办,已登记在报告与 GD5F Trap Records 遗留 3。
ftl_page_in_range() 的越界上界 = num_blocks << log2_ppb,完全依赖 log2_ppb;
而这两个 log2_* 原本在 disk_initialize 里是裸字面量 11 / 6。将来换 128 页/块
的兼容片、只改了 GD5F_* 常量而忘了同步字面量,守卫会**静默算错**——偏大就是
越界守卫失效,正是它要防的那一类错误,且不报任何错。
收口方式比"加一条断言"更彻底:字面量收成 FTL_LOG2_PAGE_SIZE / FTL_LOG2_PPB
单一真源(disk_initialize 与守卫同取此宏,杜绝两处各写一遍再各自漂移),再加
两条负数组编译期守卫 FTL_PAGE_SIZE == (1 << FTL_LOG2_PAGE_SIZE) 与
GD5F_PAGES_PER_BLOCK == (1 << FTL_LOG2_PPB)。AC5 不支持 C11 _Static_assert,
负数组是本项目惯用法(同本目录 gd5f2gq5ue.h 的 N-26 DMA 契约守卫)。
验证:@build 0 错 0 警且**代码尺寸逐字节不变**(Code 213,540 / ER_IROM1
232,280 B / RW_IRAM1 75,232 B)→ 纯语义等价重构;主机侧移植层单测
149/149 PASSED。**守卫牙齿实测**:临时把 FTL_LOG2_PPB 改成 7 → 编译失败
(nand_ftl.c:70 error C2118 负下标),改回即恢复,证明它真会拦而不是摆设。
文档:GD5F Trap Records 遗留 3 由"待办"改为"同日已收口"并记收口方式;
nand_ftl.c 模块头修改记录补第 ④ 条。
This commit is contained in:
@@ -20,7 +20,11 @@
|
||||
* DHARA_PAGE_NONE)旧会被地址位截断成真实页 → 静默读写
|
||||
* 错页,现报 DHARA_E_CORRUPT_MAP(不能用 BAD_BLOCK:会
|
||||
* 误标无辜好块;不能用 RECOVER:会触发回收);
|
||||
* ③ 补主机侧移植层单测 test/host/nand_port/(L0.5)
|
||||
* ③ 补主机侧移植层单测 test/host/nand_port/(L0.5);
|
||||
* ④ 几何字面量收成 FTL_LOG2_PAGE_SIZE / FTL_LOG2_PPB
|
||||
* 单一真源 + 两条负数组编译期守卫:越界上界依赖
|
||||
* log2_ppb,换料时只改 GD5F_* 而忘改字面量会**静默**
|
||||
* 把守卫算大 = 越界守卫失效,现改为直接编译错
|
||||
*/
|
||||
|
||||
/* 头文件包含区 */
|
||||
@@ -50,6 +54,22 @@
|
||||
#define FTL_NUM_BLOCKS (GD5F_TOTAL_BLOCKS - FTL_START_BLOCK)
|
||||
#define FTL_START_PAGE (FTL_START_BLOCK * GD5F_PAGES_PER_BLOCK)
|
||||
|
||||
/* dhara 几何字面量的**单一真源**(Trap 07 遗留 3 的收口):disk_initialize 与
|
||||
* 下方守卫都取这两个宏,不再各写一遍 11 / 6。 */
|
||||
#define FTL_LOG2_PAGE_SIZE 11u
|
||||
#define FTL_LOG2_PPB 6u
|
||||
|
||||
/* 编译期守卫:`ftl_page_in_range()` 的越界上界 = `num_blocks << log2_ppb`,
|
||||
* **完全依赖 log2_ppb**。将来换料(例如 128 页/块的兼容片)只改了 GD5F_* 常量
|
||||
* 而忘了同步这里的字面量,守卫会静默算错——偏大就是越界守卫失效,正是它要防的
|
||||
* 那一类错误,而且不报任何错。下面两条把"字面量 == GD5F 常量的 log2"钉死,
|
||||
* 不一致直接编译错。负数组 typedef 是 AC5 下的项目惯用法(AC5 不支持 C11
|
||||
* _Static_assert),同本目录 gd5f2gq5ue.h 的 N-26 DMA 契约守卫。 */
|
||||
typedef char ftl_geometry_log2_page_size_check_t[
|
||||
(FTL_PAGE_SIZE == (1 << FTL_LOG2_PAGE_SIZE)) ? 1 : -1];
|
||||
typedef char ftl_geometry_log2_ppb_check_t[
|
||||
(GD5F_PAGES_PER_BLOCK == (1 << FTL_LOG2_PPB)) ? 1 : -1];
|
||||
|
||||
/* dhara 逻辑地址到物理地址转换 */
|
||||
static inline uint32_t ftl_phy_block(dhara_block_t b) { return b + FTL_START_BLOCK; }
|
||||
static inline uint32_t ftl_phy_page(dhara_page_t p) { return p + FTL_START_PAGE; }
|
||||
@@ -341,8 +361,8 @@ DSTATUS disk_initialize(BYTE pdrv) {
|
||||
return STA_NOINIT;
|
||||
}
|
||||
|
||||
s_nand.log2_page_size = 11;
|
||||
s_nand.log2_ppb = 6;
|
||||
s_nand.log2_page_size = FTL_LOG2_PAGE_SIZE;
|
||||
s_nand.log2_ppb = FTL_LOG2_PPB;
|
||||
/* dhara 可见块数 = 总块数 - 保留块池(BBT 存储区不交给 dhara,避免被擦写) */
|
||||
s_nand.num_blocks = gd5f_get_usable_blocks();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user