错误码审计报告闭环:E-31 修复留档(da1a6e8)与残余首扫窗口特性及自愈策略

This commit is contained in:
2026-09-21 18:40:59 +08:00
parent 1d2a53bbc9
commit 92048b37fe
+6 -4
View File
@@ -20,7 +20,7 @@
**结论**:09-21 的确定性缺陷族(值拷贝回传字段、就绪位消费、EOF 关监听)已修复并在位;本次全项目普查 **结论**:09-21 的确定性缺陷族(值拷贝回传字段、就绪位消费、EOF 关监听)已修复并在位;本次全项目普查
**新确认 59 项**错误码传播缺陷:**P0×2、P1×22、P2×35**。2 项 P0 均为"值说成功、状态说失败"的静默 **新确认 59 项**错误码传播缺陷:**P0×2、P1×22、P2×35**。2 项 P0 均为"值说成功、状态说失败"的静默
数据丢失路径,均可在生产触发且当前零告警。(2026-09-21 复核修订:E-32 经手册 §4.8"出厂配置 82H"证伪由 P0 降 P2; 数据丢失路径,均可在生产触发且当前零告警。(2026-09-21 复核修订:E-32 经手册 §4.8"出厂配置 82H"证伪由 P0 降 P2;
E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺序 + DFRobot 官方库/社区代码同序列 0x10←0x80、0x0F←0x84)证伪——0x84 本已含 D2=WRTC2,代码与手册一致,详见 §7-19) E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺序 + DFRobot 官方库/社区代码同序列 0x10←0x80、0x0F←0x84)证伪——0x84 本已含 D2=WRTC2,代码与手册一致,详见 §7-19;E-31 同日修复(commit da1a6e8:resume 失败按错误分类、仅真空白判新卷,其余失败自检上报 + 保留卷 + 主循环有界重试;详见 §3.1/§5 第一档 #2))
| 级别 | 含义 | 数量 | 编号 | | 级别 | 含义 | 数量 | 编号 |
|---|---|---|---| |---|---|---|---|
@@ -33,7 +33,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
| 编号 | 位置 | 一句话 | | 编号 | 位置 | 一句话 |
|---|---|---| |---|---|---|
| E-01 | `App/cfg_file.c:1151` | `cfg_file_poll` 的"文件超长=损坏"检查是死代码(读长被钉死在阈值)→ >4096B 配置文件被截断解析当有效 → 界外配置静默回工厂默认 → 基线粘住错误状态 → 下次开机 load 守卫判"损坏" → **用户配置文件整体销毁** | | E-01 | `App/cfg_file.c:1151` | `cfg_file_poll` 的"文件超长=损坏"检查是死代码(读长被钉死在阈值)→ >4096B 配置文件被截断解析当有效 → 界外配置静默回工厂默认 → 基线粘住错误状态 → 下次开机 load 守卫判"损坏" → **用户配置文件整体销毁** |
| E-31 | `Drivers/BSP/GD5F2GQ5UE/nand_ftl.c:250-252` | `dhara_map_resume` **任何**失败(含单次瞬态页读失败)→ `dhara_map_clear` → **整卷逻辑映射静默丢弃** → FatFs 探针判卷无效 → 整卷重格式化 → 全部用户数据丢失;dhara 本可区分"真空白"(合法)与 ECC/损坏(必须上报),glue 层把错误分类全坍缩 | | E-31 | `Drivers/BSP/GD5F2GQ5UE/nand_ftl.c:250-252` | `dhara_map_resume` **任何**失败(含单次瞬态页读失败)→ `dhara_map_clear` → **整卷逻辑映射静默丢弃** → FatFs 探针判卷无效 → 整卷重格式化 → 全部用户数据丢失;dhara 本可区分"真空白"(合法)与 ECC/损坏(必须上报),glue 层把错误分类全坍缩。**已修复(2026-09-21,commit da1a6e8)**:resume 失败按 `dhara_error_t` 分类(仅真空白判 fresh)、其余失败 mount 层自检上报 + 保留卷 + 主循环有界重试 |
### P1 速览(22 项) ### P1 速览(22 项)
@@ -142,6 +142,8 @@ 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 轮询) - **触发**: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 层丢弃了全部区分信息 - **影响**:全部逻辑→物理映射静默丢弃 → 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`(重格式化须显式确认/自愈策略明确) - **修复方向**:按 `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 警告;残余特性说明见下条
- **残余特性(修复范围外,留档)**:`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 项) ### 3.2 P1(22 项)
@@ -364,7 +366,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
| # | 项 | 内容 | 关联 | | # | 项 | 内容 | 关联 |
|---|---|---|---| |---|---|---|---|
| 1 | **E-32**(降 P2) | SD2506 init:18H 改"先回读验证 0x82,≠ 则 write_enable→写 18H=0x82→回读→write_disable"(18H 非易失、出厂 0x82,正常路径保留原写);注释更正(0x20/ARST 误注 → 0x7B 为手册 L396 推荐写禁止态值;ARST 在 CTR3 非 CTR1);**已修复 2026-09-21(commit 41e111b:18H 回读校验 + 漂移时写允许窗口重置与回读验证;台架 RTC 套件 PASS)** | P2 | | 1 | **E-32**(降 P2) | SD2506 init:18H 改"先回读验证 0x82,≠ 则 write_enable→写 18H=0x82→回读→write_disable"(18H 非易失、出厂 0x82,正常路径保留原写);注释更正(0x20/ARST 误注 → 0x7B 为手册 L396 推荐写禁止态值;ARST 在 CTR3 非 CTR1);**已修复 2026-09-21(commit 41e111b:18H 回读校验 + 漂移时写允许窗口重置与回读验证;台架 RTC 套件 PASS)** | P2 |
| 2 | **E-31** | `dhara_map_resume` 按 `dhara_error_t` 分类:仅 `DHARA_E_TOO_BAD` 判 fresh,其余返回失败给 mount 层 + 自检上报,禁止静默 clear | P0 | | 2 | **E-31** | `dhara_map_resume` 按 `dhara_error_t` 分类:仅 `DHARA_E_TOO_BAD` 判 fresh,其余返回失败给 mount 层 + 自检上报,禁止静默 clear;**已修复 2026-09-21(commit da1a6e8:journal.c find_checkblock/find_root/read_checkpage 保留真实 I/O 错误(扫描读失败不再覆盖为 TOO_BAD、读成功但 checkpoint 不符判 CORRUPT_MAP)+ nand_ftl 分类(非 TOO_BAD 返回 STA_NOINIT 给 mount 层)+ freertos.c bring-up 重构为 storage_bring_up() 并加 3×2s 有界重试自愈;构建 0 错误 0 警告)** | P0 |
| 3 | **E-01** | `cfg_file_poll` 前置 `st.size > CFG_FILE_MAX_LEN` 守卫(工厂默认+模板+自检留痕);save 加 `out_len ≤ 4096` 守卫 | P0 | | 3 | **E-01** | `cfg_file_poll` 前置 `st.size > CFG_FILE_MAX_LEN` 守卫(工厂默认+模板+自检留痕);save 加 `out_len ≤ 4096` 守卫 | P0 |
| 4 | **E-34** | CH395F 字节级路径:`HAL_MAX_DELAY` → 有限超时(100~500ms)+ 返回值检查 | P1 | | 4 | **E-34** | CH395F 字节级路径:`HAL_MAX_DELAY` → 有限超时(100~500ms)+ 返回值检查 | P1 |
| 5 | **E-33** | CH395F DMA 传输加错误通道(返回状态/错误标志);失败 → net_send/recv 返回 -1;错误完成分支 INFO→ERROR | P1 | | 5 | **E-33** | CH395F DMA 传输加错误通道(返回状态/错误标志);失败 → net_send/recv 返回 -1;错误完成分支 INFO→ERROR | P1 |
@@ -521,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)。* *报告完。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 警告;台架/产品固件回归验证待执行)。*