错误码审计报告闭环:E-32 修复留档(41e111b)与 E-60 三方复核证伪归档

This commit is contained in:
2026-09-21 17:45:53 +08:00
parent 115ed00039
commit 98df006ae6
+11 -10
View File
@@ -115,7 +115,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
| **syslog** | 队列条目纯输入型(id + 静态串指针);defaultTask 唯一写者;内核前 post 走 `s_preboot[8]` 静态数组 → 队列惰性创建(首次 drain 时) | 输入型结构免疫 P1;preboot 数组内核后并发写(E-08) |
| **CH395F** | socket 命令回芯片原生 8 位状态(0x00 成功 / 0x10 BUSY 兼"进行中"与"轮询超时");init 族三值 OK/TIMEOUT/ERROR;**DMA 数据路径 `void` 无错误通道**;字节路径返回值未检查 + `HAL_MAX_DELAY` | E-33/E-34/E-46/E-47 |
| **RS485** | `HAL_StatusTypeDef` 返回;RX 数据**只能**经 `rs485_on_rx` ISR 钩子观察(getter 恒 0);init 吞武装结果 | E-36/E-37/E-48~E-50 |
| **SD2506(RTC)** | int 返回:0=OK / -1=参数 / -2=I2C;**0 仅表 I2C 事务成功 ≠ 芯片接受了写**(WRTC 写保护层,驱动无回读校验);上电默认写禁止;18H 充电寄存器**非易失**(出厂 82H、上电即充电使能);写允许序列与手册 L392"三者全 1"矛盾待台架确认 | E-32(P2)/E-38/E-39/E-51/E-52/E-60 |
| **SD2506(RTC)** | int 返回:0=OK / -1=参数 / -2=I2C;**0 仅表 I2C 事务成功 ≠ 芯片接受了写**(WRTC 写保护层,驱动无回读校验);上电默认写禁止;18H 充电寄存器**非易失**(出厂 82H、上电即充电使能);write_enable 序列(0x10←0x80、0x0F←0x84,三者 WRTC 全 1)已三方复核与手册 L392 一致(原 E-60"矛盾"证伪,§7-19) | E-32(P2)/E-38/E-39/E-51/E-52 |
| **GD5F + FTL** | int32 码:0 / -1 ERROR / -2 BUSY_TIMEOUT / -3 ECC / -4 PROGRAM_FAIL / -5 ERASE_FAIL / -6 ID_MISMATCH;**仅 -4/-5 是单元缺陷(可判坏块),-1/-2 是瞬态**;`dhara_error_t` 分类完整(TOO_BAD/ECC/CORRUPT_MAP…)但 **glue 层映射坍缩**;`f_close` = FTL 提交点 | E-31/E-40/E-41/E-42/E-43/E-53~E-57 |
| **TPAFE5160** | 阻塞 API:0 / -1 参数 / -2 BUSY(10ms,唯一硬超时);IRQ 模式 = ISR 双缓冲 + `s_ready`;**FRSTDATA 校验承诺未实现** | E-44/E-45/E-58 |
| **net 消费方** | lftpd(队列+直调混合,控制通道阻塞 recv);timeSync(全队列,从不读 errno → 免疫 E-03);ui_sink(队列 + DONTWAIT + NoClear + EOF 不关监听 = 全项目唯一完全合规消费方,作修复参照);test(直调+队列混合) | E-02/E-04/E-06/E-20~E-24 |
@@ -248,7 +248,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
- **位置**:手册 4.1 寄存器表:**ARST = CTR3(11H) D7**(D6=F32K/D5=TDS1/D4=TDS0/D3~D0=FS3~FS0,复位值 0000-0000);`sd2506.h:55` 定义了 `SD2506_REG_CTR3=0x11` 但**全驱动零次写 CTR3**(grep 证实);`clear_alarm` 契约 `sd2506.h:261-267`、实现 `sd2506.c:470-478`(依赖"ARST=1 时读 CTR1 自动清 INTAF",手册 L398)
- **模式**:P3(契约不可达)/ P8
- **影响**:ARST 恒为复位值 0 → 报警匹配后 INTAF 锁存且读不自动清除 → 首次报警后 INTAF **永久锁存**;`clear_alarm` 成为"返回 0 但什么都没清"的空操作;INT 脚单事件报警模式下锁存低电平不释放
- **修复方向**:在写允许窗口置 ARST=1(`write_enable` → 写 CTR3=0x80 → `write_disable`);注意 11H 属 00H~71H 保护段,直接写无效(与 E-60 同一写保护机制);若项目确认不使用 RTC 报警,改在契约中明示"报警功能未启用"并评估移除
- **修复方向**:在写允许窗口置 ARST=1(`write_enable` → 写 CTR3=0x80 → `write_disable`);注意 11H 属 00H~71H 保护段,直接写无效(写保护机制已三方复核确认,见 §7-19);若项目确认不使用 RTC 报警,改在契约中明示"报警功能未启用"并评估移除
#### E-40 FTL:erase/prog 任何失败(含瞬态)→ 判坏块并持久化
- **位置**:`nand_ftl.c:104-113`(`dhara_nand_erase`:`ret != GD5F_OK` → `mark_bad` + `DHARA_E_BAD_BLOCK`——前件 `ret==GD5F_ERASE_FAIL` 被后件完全包含,即**一切失败**都判坏块)、`:121-132`(`program_load/exec` 失败 → mark_bad,同坍缩)、`:141-164`(回读/ECC/数据不符 → mark_bad)
@@ -288,7 +288,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
- **影响**:帧 N 完成置 ready → 消费者未及读取 → 下一圈触发清零 → 帧 N **永久丢失**;高速采样系统性丢样,上层无法区分"无新数据"与"数据丢了"(现 adc_task 空桩休眠,E-59)
- **修复方向**:从 `start_conv_irq` 移除 `s_ready=0`(生命周期归消费者)或改帧序号制
### 3.3 P2(36 项,一行式)
### 3.3 P2(35 项,一行式)
**配置/日志/事件**
@@ -318,7 +318,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
| 编号 | 位置 | 问题 | 修复方向 |
|---|---|---|---|
| E-32 | `sd2506.c:182,191`;`sd2506.h:126` | **(2026-09-21 复核后由 P0 降档)**init 两笔写在写禁止态发出被芯片忽略(L394/537 属实),**但**手册 §4.8"出厂均配置成 82H"+ 18H 非易失 → 充电器上电即已使能,**原"充电器终身未使能"P0 链证伪**;残留问题 = ① `:187-190` 注释与代码矛盾(注释称写 0x20 且"ARST=1",实际写 0x7B 且 ARST 在 CTR3 不在 CTR1)② init 无回读校验(18H 若被长时掉电腐蚀则无人发现)③ `docs/硬件平台/V0.0_网表详细分析报告.md:280`"已核实无缺陷"无回读证据 | 18H 改"回读验证 0x82,≠ 则 write_enable→写→回读→write_disable";注释更正(0x7B = 手册 L396 推荐的写禁止态 CTR1 值;ARST 在 CTR3) |
| E-32 | `sd2506.c:167-211`(修复后);`sd2506.h:114-125` | **(2026-09-21 复核后由 P0 降档;同日已修复)**init 两笔写在写禁止态发出被芯片忽略(L394/537 属实),**但**手册 §4.8"出厂均配置成 82H"+ 18H 非易失 → 充电器上电即已使能,**原"充电器终身未使能"P0 链证伪**;残留问题 = ① `:187-190` 注释与代码矛盾(注释称写 0x20 且"ARST=1",实际写 0x7B 且 ARST 在 CTR3 不在 CTR1)② init 无回读校验(18H 若被长时掉电腐蚀则无人发现)③ `docs/硬件平台/V0.0_网表详细分析报告.md:280`"已核实无缺陷"无回读证据 ④ `SD2506_CHARGE_5K (1U<<0)` 宏位错误(手册 §4.8:5K=Charge1=bit1,0x82=EN_Charge|Charge1 已正确;零引用休眠;总表 L119 18H 行转录与 §4.8 不符以 §4.8 为准) | **已修复(2026-09-21,commit 41e111b)**:18H 回读校验(=0x82 不写;≠ 则经写允许窗口重置 0x82 + 回读验证);0FH 0x7B 死写移除(写禁止态被芯片忽略);注释订正(ARST 在 CTR3 非 CTR1);`SD2506_CHARGE_5K` 宏位订正(bit1)并补 10K/断开/INIT_VALUE 宏。台架实证:RTC 套件 Phase 1 6/6 + Phase 2 累计 17/17 PASS(含 set==readback)、产品固件重烧启动校验 PASS、ST-LINK 全片回读 No difference |
| E-46 | `ch395f.h:151` | `0xECH` 无效 ARMCC 字面量(= SD2506 0x0FH 同族);当前零引用休眠,首个使用者即踩 | 改 `0xECU` + pre-commit 禁 `0xNNH` 检查 |
| E-47 | `ch395f.c:606-622` | 轮询超时与芯片忙共用 `0x10` 码 + 跨命令陈旧状态(共享 CMD_STATUS 读即清 → 下条命令可能先读到上条的完成态);现边界统一按可重试处理,影响有限 | 独立超时码或轮次序号 |
| E-48 | `rs485.c:173` | ErrorCallback 重武装返回值丢弃(现良性:ORE 路径 HAL 先复位 RxState=READY;非阻塞错误路径原武装存活自愈) | 非 HAL_OK 记 WARN |
@@ -333,7 +333,9 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
| E-57 | `gd5f2gq5ue.h:119/140/189/222-253` | 公共 API 返回类型 `int`/`int32_t` 混用(码值均为小负数,无功能影响) | 统一 `int32_t` |
| E-58 | `tpafe5160.c:322-324/:343/:354` | 双缓冲角色互换 + 任务抢占 → 撕裂读(get_buf 与拷贝完成之间被抢占超一个帧周期 = 8 通道失去同步性) | 原子快照拷贝 API(关中断+memcpy)或文档化时限 |
| E-59 | `adc_task.c:37-43`、`rs485_task.c:37-43` | 边界状态:两任务均为空桩(osDelay 循环),`rs485_on_rx` 无覆盖 → E-36/E-44/E-45/E-58 全部休眠;**真实消费者接入之日即触发** | 消费者实现前先修驱动契约(E-36/E-45/E-44) |
| E-60 | `sd2506.c:121-133`(write_enable);手册 L392 vs 实测 | **(2026-09-21 复核新增,待台架确认)**write_enable 实际置 WRTC1=1(CTR2=0x80)、WRTC3=1(CTR1=0x84 D7)、**WRTC2=0**(CTR1=0x84 D2);手册 L392 明写"WRTC1=1、WRTC2=1、WRTC3=1 时写允许"(三者全 1)→ 若手册准确则时间写(00H~06H)应全部无效,但与台架实测(RTC 套件 set==readback PASS,写入确已生效)**矛盾**——二者必有一处不符(手册"三者全 1"可能比实际硬件宽松,或 WRTC2 门控范围与描述不符) | 台架实测:write_enable 后回读 CTR1/CTR2 记录 WRTC 位实际态 + 验证时间写生效;据此订正手册理解或补 write_enable 的 WRTC2 位(暂按"硬件实测为准",不阻断当前功能) |
<!-- 原 E-60 行已移除:经三方复核证伪,见 §7-19 -->
<!-- **(2026-09-21 复核新增,待台架确认)**write_enable 实际置 WRTC1=1(CTR2=0x80)、WRTC3=1(CTR1=0x84 D7)、**WRTC2=0**(CTR1=0x84 D2);手册 L392 明写"WRTC1=1、WRTC2=1、WRTC3=1 时写允许"(三者全 1)→ 若手册准确则时间写(00H~06H)应全部无效,但与台架实测(RTC 套件 set==readback PASS,写入确已生效)**矛盾**——二者必有一处不符(手册"三者全 1"可能比实际硬件宽松,或 WRTC2 门控范围与描述不符) | 台架实测:write_enable 后回读 CTR1/CTR2 记录 WRTC 位实际态 + 验证时间写生效;据此订正手册理解或补 write_enable 的 WRTC2 位(暂按"硬件实测为准",不阻断当前功能) |
-->
---
@@ -350,7 +352,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
| P5 事件语义 | ✓ | E-17/E-18/E-19 | ✓ | — | — | — | — | — | **E-45** | ✓ | ✓ | ✓ | ✓ | — |
| P6 符号/宽度 | — | — | — | — | — | — | E-38 | — | — | — | — | — | — | — |
| P7 跨上下文 | **E-05** | — | **E-09** | E-08 | — | E-36/E-50 | — | — | E-58 | E-06 | — | — | E-23 | — |
| P8 外设/库 | E-26 | — | **E-07** | E-07 | E-33/E-46 | — | E-32/E-60 | E-43/E-54/E-56 | E-44 | — | — | — | — | — |
| P8 外设/库 | E-26 | — | **E-07** | E-07 | E-33/E-46 | — | E-32 | E-43/E-54/E-56 | E-44 | — | — | — | — | — |
| P9 超时/错误 | **E-02** | — | — | — | E-34/E-47 | E-49 | — | **E-31/E-40** | E-44 | E-20/E-22 | E-21 | — | E-23 | — |
---
@@ -361,7 +363,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) | 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 |
| 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 |
@@ -394,7 +396,6 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
| 4 | **E-22** | lftpd/timeSync 向 ui_sink close 规则看齐(EOF 不 close、auto_relisten 常驻、仅代次变化/判死时重建) |
| 5 | **E-23** | 测试套件加代次检查(accept 失败分支);TC704 降并发或测试构建抑制服务任务 |
| 6 | **E-30(部分)** | sim 后端 errno 语义对齐(成功不清)+ 缺陷记录标注 sim 复现盲区 |
| 7 | **E-60** | 台架实测:write_enable 后回读 CTR1/CTR2 记录 WRTC 位实际态并验证时间写生效;若 WRTC2 确门控时间写范围 → 补 write_enable;否则(当前时间写已实证生效)→ 文档化实测结论、订正手册理解、驱动契约加注 |
### 第三档:长期
@@ -444,7 +445,7 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
16. **SD2506 时间写原子性**(7 字节一次写,满足"不可单独写时间寄存器");24h 位/2099 回绕正确;电池电压寄存器 1AH[7]+1BH 9 位与手册一致("读错寄存器"假设被手册证伪)
17. **边界调用方正确**:app_main 对 GD5F 7 码 + TPAFE OK/TIMEOUT 分别映射;sys_clock 全检查 sd2506 返回值
18. **TPAFE 10ms BUSY 超时** ≫ t_CONV(µs 级)无误报;`s_ready/s_buf_sel` volatile 在位
19. **已证伪假设留档**(防重复劳动):SD2506 电池电压读错寄存器(手册证伪);RS485 错误回调杀死并发发送期 RX(HAL 源证伪);ch395f.c "2s×HAL_Delay(1) 忙等"(当前代码不存在);SD2506"上电 18H 写无效 → 充电器终身未使能"(手册 §4.8"出厂均配置成 82H"+18H 非易失证伪,原 E-32 P0 链不成立,降 P2,见 §3.3)
19. **已证伪假设留档**(防重复劳动):SD2506 电池电压读错寄存器(手册证伪);RS485 错误回调杀死并发发送期 RX(HAL 源证伪);ch395f.c "2s×HAL_Delay(1) 忙等"(当前代码不存在);SD2506"上电 18H 写无效 → 充电器终身未使能"(手册 §4.8"出厂均配置成 82H"+18H 非易失证伪,原 E-32 P0 链不成立,降 P2,见 §3.3);SD2506 "write_enable 仅置 WRTC1/WRTC3、WRTC2=0 与手册矛盾"(原 E-60 前提)——0x84=0b1000_0100 本已含 D2=WRTC2(手册 L119 表头 D7~D0 MSB 先、CTR1 D2=WRTC2/D7=WRTC3、CTR2 D7=WRTC1),write_enable 实为三者全 1 且顺序合规(L392 先 WRTC1 后 WRTC2/WRTC3),开源序列同码(DFRobot GravityRtc 官方库与社区代码均 0x10←0x80、0x0F←0x84,注释 "WRTC2=1,WRTC3=1"),实测 RTC set==readback PASS 证明写允许已生效;原台架实测项无需执行,E-60 移除(§3.3 原行已注释存档)
20. **模拟器方向**:`ui_net_sink` 已双模型自适应(单/多连接 accept fd);sim 构建仅编 UI+net_sink+配置日志引擎 → lftpd/timeSync 的 fd 泄漏类缺陷当前未触发(E-30 潜在项)
---
@@ -520,4 +521,4 @@ E-60"write_enable WRTC2 与手册矛盾"经三方复核(手册表头 D7~D0 顺
---
*报告完。60 项发现全部带 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 与手册矛盾,待台架确认)、§6 交叉引用补 P2-2/P2-6。未修改任何代码、未执行构建。*
*报告完。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)。*