From c3f424abc0e4a46f443290e98227315f2a54f79a Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Mon, 21 Sep 2026 19:23:25 +0800 Subject: [PATCH] =?UTF-8?q?E-31=E5=9B=9E=E5=BD=92=E7=95=99=E6=A1=A3?= =?UTF-8?q?=EF=BC=9A=E4=BA=A7=E5=93=81=E5=9B=BA=E4=BB=B6=E5=8F=B0=E6=9E=B6?= =?UTF-8?q?=E9=AA=8C=E8=AF=81PASS=EF=BC=88@test=E9=97=AD=E7=8E=AF+?= =?UTF-8?q?=E6=97=A2=E6=9C=89=E5=8D=B7resume+=E9=85=8D=E7=BD=AE=E4=BF=9D?= =?UTF-8?q?=E7=95=99+=E5=85=A8=E7=89=87=E5=9B=9E=E8=AF=BB=E4=B8=80?= =?UTF-8?q?=E8=87=B4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/问题记录/错误码传播审计.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/问题记录/错误码传播审计.md b/docs/问题记录/错误码传播审计.md index 971c48bf..4e6d87b8 100644 --- a/docs/问题记录/错误码传播审计.md +++ b/docs/问题记录/错误码传播审计.md @@ -142,7 +142,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺 - **触发**:resume 扫描(大量页读)中**任何一次**瞬态读失败——ECC glitch / SPI 瞬断 / WIP 轮询超时(2026-09-20 台架瞬态读异常,其低 VDD 归因与"混合页"解读后续均被证伪——见 GD5F Trap 05;曾为它引入的 2ms settle 已于 2026-09-21 移除,就绪判定回归 WIP 轮询) - **影响**:全部逻辑→物理映射静默丢弃 → FatFs 探针判卷无效 → **整卷重格式化**(2026-09-20 `.fschk` 重格式化循环为同族事故)→ 全部用户数据丢失;仅一行 info 级日志。dhara 本可区分 `DHARA_E_TOO_BAD`(真空白芯片,正当 fresh)与 `DHARA_E_ECC`/`BAD_BLOCK`/`CORRUPT_MAP`(真实完整性故障)——glue 层丢弃了全部区分信息 - **修复方向**:按 `err` 分类——仅 `DHARA_E_TOO_BAD`/无 checkpoint 判 fresh;其余错误**返回失败给 mount 层**,由自检上报、禁止静默 `dhara_map_clear`(重格式化须显式确认/自愈策略明确) -- **已修复(2026-09-21,commit da1a6e8,第一档 #2)**:① `Lib/dhara/journal.c` 错误源治理——`find_checkblock`/`find_root` 不再把扫描中的读失败覆盖为 `DHARA_E_TOO_BAD`(扫描出现过读失败 → 上报首个 I/O 错误如 ECC;仅扫描全程 I/O 干净且无 checkpoint 才报 `TOO_BAD`);`read_checkpage`/`find_root` 的"读成功但 checkpoint magic/epoch 不符"改报 `DHARA_E_CORRUPT_MAP`(该点之前 checkpoint 环的存在性已被证明,"空白卷"不成立)→ resume 任何 -1 返回值都携带可分类的真实错误码 ② `nand_ftl.c` `disk_initialize` 分类:仅 `err == DHARA_E_TOO_BAD`(真空白卷)走 fresh(journal 已被失败 resume 复位为空态);其余失败 `return STA_NOINIT` 给 mount 层——禁止静默清 map,卷原样保留 → `f_mount` 失败(FR_NOT_READY)→ defaultTask 自检 `filesystem fault` ③ `freertos.c` 明确自愈策略:原启动块重构为 `storage_bring_up()`(挂载+空卷建卷+两击探针+自愈重格式化+日志挂载+配置加载+就绪屏障,均幂等);启动期失败后主循环每 2s 重试(`STORAGE_BRINGUP_RETRIES=3`),成功即补跑"存储就绪"序列(瞬态毛刺数秒内免重启恢复);耗尽重试维持无存储降级态(自检已上报、卷保留、不重格式化,等下次上电重新 resume)。构建 0 错误 0 警告;残余特性说明见下条 +- **已修复(2026-09-21,commit da1a6e8,第一档 #2)**:① `Lib/dhara/journal.c` 错误源治理——`find_checkblock`/`find_root` 不再把扫描中的读失败覆盖为 `DHARA_E_TOO_BAD`(扫描出现过读失败 → 上报首个 I/O 错误如 ECC;仅扫描全程 I/O 干净且无 checkpoint 才报 `TOO_BAD`);`read_checkpage`/`find_root` 的"读成功但 checkpoint magic/epoch 不符"改报 `DHARA_E_CORRUPT_MAP`(该点之前 checkpoint 环的存在性已被证明,"空白卷"不成立)→ resume 任何 -1 返回值都携带可分类的真实错误码 ② `nand_ftl.c` `disk_initialize` 分类:仅 `err == DHARA_E_TOO_BAD`(真空白卷)走 fresh(journal 已被失败 resume 复位为空态);其余失败 `return STA_NOINIT` 给 mount 层——禁止静默清 map,卷原样保留 → `f_mount` 失败(FR_NOT_READY)→ defaultTask 自检 `filesystem fault` ③ `freertos.c` 明确自愈策略:原启动块重构为 `storage_bring_up()`(挂载+空卷建卷+两击探针+自愈重格式化+日志挂载+配置加载+就绪屏障,均幂等);启动期失败后主循环每 2s 重试(`STORAGE_BRINGUP_RETRIES=3`),成功即补跑"存储就绪"序列(瞬态毛刺数秒内免重启恢复);耗尽重试维持无存储降级态(自检已上报、卷保留、不重格式化,等下次上电重新 resume)。构建 0 错误 0 警告;产品固件台架回归 PASS(2026-09-21 19:19,commit da1a6e8 构建:`@test` 闭环 Required 全中/Forbidden 零命中,`Map resumed: 2441/96064 sectors used` 既有卷 resume 成功、`FATFS mounted`、`[CFG] load: OK (523B)` 用户配置保留、`[FTP] waiting for connection` 屏障链通、ST-LINK 全片回读 No difference);残余特性说明见下条 - **残余特性(修复范围外,留档)**:`find_checkblock` 首扫窗口 = 块 0 起至多 `DHARA_MAX_RETRIES`(8) 块——环已回卷且回卷后 journal 尚未写满一个 checkpoint 周期(<32 页/64KB)即掉电的窄窗口内,checkpoint 均不在块 0–7 → 扫描 I/O 干净但找不到 checkpoint → 仍判 `TOO_BAD` fresh(与修复前行为一致,非瞬态读失败触发);根治需扩大首扫窗口/环定位,属独立设计项(与 E-10/E-53 驱动错误通道统一一并评估) ### 3.2 P1(22 项) @@ -523,4 +523,4 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺 --- -*报告完。59 项发现全部带 file:line 落点;P0/P1 核心机制经父审计组逐行复核(含 `docs/芯片手册/SD2506API-G.md` L392-398/L537/§4.8 原文核对与 `SD2506_Trap_Records.md` 硬件观测交叉验证)。2026-09-21 复核修订:E-32 由 P0 降 P2(充电器 P0 链被"出厂 82H"证伪)、E-39 机制改写(ARST 在 CTR3、驱动从未写过 CTR3)、E-60"write_enable WRTC2 与手册矛盾"经手册表头位序 + DFRobot GravityRtc 官方库/社区代码 + 实测三方复核证伪(0x84 本已含 D2=WRTC2,代码与手册 L392 一致)移除,见 §7-19;18H 寄存器事实经手册 §4.8 专用表复核(Bit7=EN_Charge、Bit1=Charge1、Bit0=Charge0,复位 0x03,出厂 0x82=EN+5k,总表 L119 该行转录有误以 §4.8 为准);§6 交叉引用补 P2-2/P2-6。审计期间未修改任何代码、未执行构建;2026-09-21 依第一档 #1 完成 E-32 修复(commit 41e111b:18H 回读校验 + 漂移时写允许窗口重置与回读验证、0FH 死写与误注移除、充电宏位订正;构建 0 错误 0 警告,台架 RTC 套件 Phase 1 6/6 + Phase 2 累计 17/17 PASS 含 set==readback,产品固件重烧后启动校验 PASS,ST-LINK 全片回读 No difference);同日依第一档 #2 完成 E-31 修复(commit da1a6e8:journal.c 三处错误源治理——扫描读失败不再覆盖为 TOO_BAD、读成功但 checkpoint 不符判 CORRUPT_MAP + nand_ftl.c 错误分类——仅真空白判 fresh、其余失败返回 STA_NOINIT 给 mount 层 + freertos.c 启动块重构为 storage_bring_up() 并加 3×2s 有界重试自愈策略;构建 0 错误 0 警告;台架/产品固件回归验证待执行)。* +*报告完。59 项发现全部带 file:line 落点;P0/P1 核心机制经父审计组逐行复核(含 `docs/芯片手册/SD2506API-G.md` L392-398/L537/§4.8 原文核对与 `SD2506_Trap_Records.md` 硬件观测交叉验证)。2026-09-21 复核修订:E-32 由 P0 降 P2(充电器 P0 链被"出厂 82H"证伪)、E-39 机制改写(ARST 在 CTR3、驱动从未写过 CTR3)、E-60"write_enable WRTC2 与手册矛盾"经手册表头位序 + DFRobot GravityRtc 官方库/社区代码 + 实测三方复核证伪(0x84 本已含 D2=WRTC2,代码与手册 L392 一致)移除,见 §7-19;18H 寄存器事实经手册 §4.8 专用表复核(Bit7=EN_Charge、Bit1=Charge1、Bit0=Charge0,复位 0x03,出厂 0x82=EN+5k,总表 L119 该行转录有误以 §4.8 为准);§6 交叉引用补 P2-2/P2-6。审计期间未修改任何代码、未执行构建;2026-09-21 依第一档 #1 完成 E-32 修复(commit 41e111b:18H 回读校验 + 漂移时写允许窗口重置与回读验证、0FH 死写与误注移除、充电宏位订正;构建 0 错误 0 警告,台架 RTC 套件 Phase 1 6/6 + Phase 2 累计 17/17 PASS 含 set==readback,产品固件重烧后启动校验 PASS,ST-LINK 全片回读 No difference);同日依第一档 #2 完成 E-31 修复(commit da1a6e8:journal.c 三处错误源治理——扫描读失败不再覆盖为 TOO_BAD、读成功但 checkpoint 不符判 CORRUPT_MAP + nand_ftl.c 错误分类——仅真空白判 fresh、其余失败返回 STA_NOINIT 给 mount 层 + freertos.c 启动块重构为 storage_bring_up() 并加 3×2s 有界重试自愈策略;构建 0 错误 0 警告;产品固件台架回归 PASS:`@test` 闭环 Required(含 `Map resumed`/`FATFS mounted`)全中、Forbidden 零命中,既有卷 2441/96064 扇区 resume 成功、用户配置 523B 原样加载、FTP 屏障链通,ST-LINK 全片回读 No difference)。*