@@ -53,27 +53,40 @@ ECC 状态(`ECCS1:ECCS0`):`00`=无错;`01/10/11`=纠正 1/2/3 bit; `10`
所有测试套件(CH395F / 存储 / GD5F)统一收归 `ch395fTestTask` 线程(`test/ch395f_test_task.c`
的 `StartCh395fTestTask` ),通过 `test/test_config.h` 中的 `TEST_SUITE_*` 宏在**编译期**选择要跑的套件。
选中 `TEST_SUITE_GD5F` 时,`test_config.h` 会自动 `#define ENABLE_GD5F_TESTS` 及全部
`ENABLE_GD5F_PHASE*_TESTS` ,随后由 `gd5f_test_run()` ( `test/gd5f_test_task.c` )按阶段串行执行。
选中 `TEST_SUITE_GD5F` 时,`test_config.h` 会自动 `#define ENABLE_GD5F_TESTS` 及**只读阶段**宏
( PHASE1/2/10) ,随后由 `gd5f_test_run()` ( `test/gd5f_test_task.c` )按阶段串行执行。
> `defaultTask` **不再承担任何测试**(仅空闲);所有测试都只在 `ch395fTestTask` 中运行。
> **破坏性用例开关(2026-09-21 新增,默认关闭)**: `test_config.h` 的 `ENABLE_DESTRUCTIVE_TESTS`
> 控制所有**会改变设备持久状态**的用例——写/擦 NAND、`nand_ftl_format`、FatFS 建文件写文件、
> 向 BBT 持久化坏块标记(永久减少可用容量)。关闭时为**只读模式**,可随时在在用设备上跑;
> 打开后才编译并运行 PHASE3~9,以及 PHASE2 的 TC-206/207、PHASE10 的 TC-1003/1004。
> 依据:2026-09-21 实测一轮破坏性 GD5F 运行即消耗一个块(容量 95248 → 95200, TC-STO-04 恢复不回来),
> 故破坏性用例只在**产品首次上电/产线首启**或明确需要时开启。
`test/test_config.h` 配置示例(三选一,互斥,多选触发 `#error` ):
``` c
// #define TEST_SUITE_CH395F
// #define TEST_SUITE_STORAGE
# define TEST_SUITE_GD5F /* 选中后自动开启 gd5f 全部 阶段宏 */
# define TEST_SUITE_GD5F /* 选中后自带 gd5f 只读 阶段宏 */
// #define ENABLE_DESTRUCTIVE_TESTS /* 需写/擦/格式化/落盘坏块时才打开(默认关闭) */
```
执行顺序(由 `gd5f_test_run()` 按阶段串行,与函数依赖一致):
`init/read_id/reset` → `BBT` → `页读写` → `块擦除` → `ECC` → `SPI 原语` → `DMA 边界` → `FTL` → `FatFS` → `边界条件` 。
- **只读(默认)**: `init/read_id/reset` → `BBT(读取与 RAM 内标记)` → `DMA 守卫读方向(TC-704) ` → `边界条件(越界 / size=0) `
- **破坏性(开关打开时插入其间)**:`页读写` → `块擦除` → `ECC` → `SPI 原语` → `DMA 边界(701~703、705) ` → `FTL(含 format) ` → `FatFS`
开机横幅会明确打印本次模式:`mode: READ-ONLY (...)` 或 `mode: DESTRUCTIVE (...)` 。
> `defaultTask` **不再承担任何测试**(仅空闲);所有测试都只在 `ch395fTestTask` 中运行。
### 启用测试
1. 在 `test/test_config.h` 取消注释所需的 `TEST_SUITE_*` 宏(如 `TEST_SUITE_GD5F` ) ;
1. 在 `test/test_config.h` 取消注释所需的 `TEST_SUITE_*` 宏(如 `TEST_SUITE_GD5F` ) ,
需要写/擦类用例时再打开 `ENABLE_DESTRUCTIVE_TESTS` ;
2. 编译(`@build` )确认 0 错误 0 警告;
3. 烧录后串口观察 `[NAND-TEST]` 日志与各 TC 的 `PASS/FAIL` ,结尾打印
3. 烧录后串口观察 `mode: ...` 横幅、 ` [NAND-TEST]` 日志与各 TC 的 `PASS/FAIL` ,结尾打印
`=== GD5F2GQ5UE Tests: X/Y PASSED ===` ;
4. 不选任何 `TEST_SUITE_*` 时为正常产品构建(`ch395fTestTask` 空闲,不跑测试)。
@@ -468,13 +481,13 @@ ECC 状态(`ECCS1:ECCS0`):`00`=无错;`01/10/11`=纠正 1/2/3 bit; `10`
| **通过标准 ** | 数据一致 |
| **覆盖原则 ** | DMA 大数据路径 |
### TC-GD5F-704: DMA 可达性守卫负路径(读方向)
### TC-GD5F-704: DMA 可达性守卫负路径(读方向,只读,两种模式都跑 )
| 字段 | 值 |
|------|-----|
| **ID ** | TC-GD5F-704 |
| **优先级 ** | P0 |
| **类型 ** | 边界/健壮性测试 |
| **类型 ** | 边界/健壮性测试( **只读**,不受 `ENABLE_DESTRUCTIVE_TESTS` 门控) |
| **标题 ** | 目的缓冲位于 CCM(不可达区)时守卫应拒绝 DMA 并回落轮询,数据仍正确 |
| **前置条件 ** | FreeRTOS 堆驻留 CCM( scatter `RW_CCM` );探针缓冲由 `pvPortMalloc(2048)` 取得(堆不在 CCM 时用例跳过) |
| **测试步骤 ** | 1. 先用 SRAM 静态缓冲参考读同页<br>2. 探针缓冲预填参考值的反码<br>3. `gd5f2gq5ue_read()` 整页读入 CCM 探针缓冲<br>4. 与参考缓冲逐字节比对 |
@@ -496,7 +509,8 @@ ECC 状态(`ECCS1:ECCS0`):`00`=无错;`01/10/11`=纠正 1/2/3 bit; `10`
| **判定依据 ** | 同 TC-GD5F-704(写方向 DMA 读 CCM 同样不落地) |
| **覆盖原则 ** | DMA 可达性守卫(写方向);堆缓冲禁入 DMA 的运行时强制(内存分配策略 R3) |
> ⚠ **卷破坏警告**:阶段 8 会调用 `nand_ftl_format()` 清空 dhara map,阶段 9 会写入文件——
> ⚠ **卷破坏警告(仅 `ENABLE_DESTRUCTIVE_TESTS` 打开时) **:阶段 8 会调用 `nand_ftl_format()`
> 清空 dhara map,阶段 9 会写入文件——
> 整轮 GD5F 套件(含 Phase 8/9)运行后卷数据即失效,且大写入可能使 dhara 把若干块记为
> 运行期坏块(2026-09-21 实测:一次整轮运行容量 95248 → 95200,日志见
> `[ERR][NAND_FTL] program verify: data mismatch, blk 305`,该块由 dhara 自行隔离,测试仍 68/68 通过)。
@@ -732,7 +746,17 @@ ECC 状态(`ECCS1:ECCS0`):`00`=无错;`01/10/11`=纠正 1/2/3 bit; `10`
| TC-STO-03 | 坏块注入下存储写入 | P1 | PASS |
| TC-STO-04 | BBT 重建 + 重新格式化(恢复) | P1 | 受 `ENABLE_STORAGE_RECOVERY_TESTS` 控制(默认关) |
> 当前实测: `TEST_SUITE_GD5F` 构建一次运行全部阶段,结尾输出 `=== GD5F2GQ5UE Tests: 68/68 PASSED (failed=0) ===`( 68 为各 TC 内部断言总数,含 TC-GD5F-205~207 BBT 持久化用例、TC-GD5F-704/705 DMA 守卫负路径;TC 覆盖见上表)。`TEST_SUITE_STORAGE` 套件结尾输出 `=== Storage Tests: 11/11 PASSED (failed=0) ===`( TC-STO-01/02/03 各含若干内部断言,且 TC-STO-01 依赖的 `s_cached_lpn` 哨兵 bug 已修复)。两套件均 0 错误 0 警告通过 MDK 编译。
> 当前实测( 2026-09-21, `ENABLE_DESTRUCTIVE_TESTS` 关闭 / 打开两种配置):
> 只读模式 `=== GD5F2GQ5UE Tests: 16/16 PASSED (failed=0) ===`( PHASE1/2/7 的 TC-704/10,无任何写操作,
> 卷内容与容量均不变);破坏性模式 `=== GD5F2GQ5UE Tests: 68/68 PASSED (failed=0) ===`(全部阶段)。
> `TEST_SUITE_STORAGE` 只读模式实测 `=== Storage Tests: 3/3 PASSED (failed=0) ===`( mount + TC-STO-05,
> 卷内容与容量不变);破坏性模式为全量集成用例(2026-09-20 实测 **20/20 PASSED**,含 TC-STO-01/02/03/05/06)。
> 各套件在两种模式下均 0 错误 0 警告通过 MDK 编译。
>
> **破坏性用例清单**(仅在 `ENABLE_DESTRUCTIVE_TESTS` 打开时编译运行):
> GD5F: TC-GD5F-206/207、301~305、401~404、501~502、601~605、701~703、705、801~802、901、1003~1004
> ( TC-GD5F-704 为**只读**,两次运行都跑);存储:TC-STO-01、02、03、06 与内建文件系统写读/
> 性能压测(TC-STO-05 为只读,始终运行);RTC:TC-RTC-002(写时间,跑完复原)、014(写 SRAM)、015(写报警)。
---