实机测试实施指南重构为纯执行流程:步骤1~7+状态标记,已完成事项(S7/A1~A4)细节与证据移出至各模块文档,§1改执行流程总览,外部引用同步

This commit is contained in:
2026-10-03 22:45:19 +08:00
parent a7af1c9333
commit aef1d92b3f
8 changed files with 70 additions and 63 deletions
+1 -1
View File
@@ -93,7 +93,7 @@ docs/
| [`测试文档模板规范.md`](测试说明/测试文档模板规范.md) | 测试文档模板与命名规则(TM / TC / DP) |
| [`链路延迟测试说明.md`](测试说明/链路延迟测试说明.md) | 网络链路时延分段定义、判定基线、执行流程 |
| [`模拟器差距清单.md`](测试说明/模拟器差距清单.md) | **PC 模拟器 vs 真机差距登记册**(L3 门禁可信度依据;改动涉及网络/日志/硬件层前必查 §3 决策规则) |
| [`实机测试实施指南.md`](测试说明/实机测试实施指南.md) | **上板(真机)测试执行判据与真机验证状态**(环境预检 → `@test`+自检判定 → IWDG 注入/长跑 → 堆告警 → GD5F 错误通道 → 网络基线 → 工程卫生 → 实测陷阱);每项含判据与精确命令 |
| [`实机测试实施指南.md`](测试说明/实机测试实施指南.md) | **上板(真机)测试执行流程**(按顺序:环境预检 → `@test`+自检判定 → IWDG 注入/长跑 → 堆告警 → GD5F 错误通道 → 网络基线 → 工程卫生;每步含判据/命令/状态);已完成事项证据去向见 §10 |
**主机侧单元测试(L0.5)**
@@ -587,3 +587,4 @@ void adc_cfg_init(void)
| 2026-09-15 | v1.10:**配置引擎属主任务变更** netTask → defaultTask(P1-3 跨任务竞态修复,P1-5 一并落地)——① 上电加载移入 defaultTask 的 STORAGE_READY 屏障之前(屏障语义 = 卷挂载 + 配置就绪);② UI 保存改跨任务交接:`net_cfg_save_request()`("待保存"标志 + `SYS_EVT_CFG_SAVE` 事件唤醒)→ defaultTask `net_cfg_save_run()` 执行写盘、成功触发"立即应用"(`SYS_EVT_NET_RECONFIG` → netTask 重建),保存行随交接状态显示 ENTER/WAIT/OK/ERR(写盘期间的新请求重位置位不丢失);③ 2s poll 收敛 defaultTask——引擎静态状态仅单任务触碰,竞态在结构上消除;④ netTask 只读 RAM 副本、不触碰配置文件引擎;D15-③ 单写者、§5.1~5.4 时序图与并发矩阵同步;双端构建 0/0、UI 五步门禁全绿 |
| 2026-09-18 | v1.11:**P0-1 修复(临时缓冲改走平台堆)**——共享核心 4 处 `malloc`(读缓冲 4,097B / 模板输出 5,120B / 外科保存 Pass1 副本 + 输出 5,120B)此前落在 **MicroLIB C 堆**上,而该堆由 `startup_stm32f407xx.s` 的 `Heap_Size EQU 0x200` 限定为 **512 B**,真机必然分配失败 → 配置加载静默回落工厂默认(模拟器用宿主 CRT 堆,两端不一致,故双端 0 警告 0 错也照不出来)。① `cfg_file_store` 新增 `cfg_store_alloc/cfg_store_free/cfg_store_heap_free` 后端三件套(MCU = `pvPortMalloc/vPortFree`,与 `lftpd_io.c` 同模式;模拟器 = `malloc/free`),共享核心不再出现 C 库分配符号;② 新增编译期堆峰值预算 `CFG_HEAP_BUDGET = 10240B`(typedef 负数组实现,ARMCC 5 C99 无 `_Static_assert`),放大 `CFG_FILE_MAX_LEN`/`CFG_OUT_MAX` 直接编译失败;③ 四条失败路径(load 读失败 / 模板写失败 / 保存分配失败 / 保存写盘失败)增 `syslog_post(SYSLOG_SELFTEST, …)` 上报,不再只留串口行;`load: OK` 行附带 `heap free` 实测值;④ 属主任务注释同步为 defaultTask。map 复核:`malloc.o` 不参与链接、`Removing startup_stm32f407xx.o(HEAP), (512 bytes)`,静态区 126,584 → **126,064 B**(余 4,488 → **5,008 B**);双端 0 错 0 警、`--cfgtest` PASS |
| 2026-09-22 | v1.12:**E-01 超长守卫根治**(错误码传播审计第一档 #3,commit d030cb0)——poll 的"超长=损坏"检查写在截断后读长(`s_load_file` 读长钉死 4096)上**恒假=死码**,超长文件被截断当有效解析 → 界外静默回工厂默认 → 基线粘住 → 用户配置销毁链。① poll 沉降分支判定改用 `cfg_store_stat` 真实 `st.size` 且**先于读取**,超长走"工厂默认 + 重建模板 + `cfg poll oversized` 自检留痕",**刻意不触发段回调**(避免按工厂 IP 重建网络造成静默失联,保留 FTP 修复通道,保存/重启收敛)② `s_surgical` 输出上限 `CFG_OUT_MAX`(5120) 收紧至 `CFG_FILE_MAX_LEN`(4096),超限走溢出中止路径(原文件不动 + `cfg save overflow` 自检)——消除"合法写出 4097~5120B 文件 = 下次开机销毁"的雷 ③ `s_write_doc` 唯一落盘闸口硬拒 >4096B(结构性保证)④ load 超长分支补 `cfg load oversized` 自检;`cfg_file.h` v1.2 契约同步;模拟器 cfgtest 新增两回归锁(4160B 伪造 → poll 判损坏重建;4000B 注释文件 → save 拒写且原文件未动)。**台架验证暴露并修复**:`cfg_store_write_atomic` MCU 后端 `f_rename` 对已存在目标返回 `FR_EXIST` 不覆盖 → 设备端一切"目标存在的覆盖写"(UI 保存/模板重建)静默失败、仅首启建文件成功——v1.9 已为模拟器后端修过同款(MSVC `rename()` C1117),MCU 侧漏了对称修复;修复 = rename 前先 `unlink` 目标(commit 70f1cc8)。双端 0 错 0 警、cfgtest PASS、台架 FTP 5047B 用例 poll/load 双路径自愈 PASS(重建 523B 工厂模板 + selftest 留痕 + 不掉线)、`@test` 默认闭环 PASS、ST-LINK 全片回读一致 |
| 2026-10-03 | v1.13:**真机验证 PASS(A1 闭环)**——v1.11 的 P0-1 堆分配改造在真机上验证通过:`[CFG] load: OK (523B, heap free 8840B)`(**经 FreeRTOS 堆分配**,即 512B C 堆约束的验收点);Forbidden `FAIL`/`[ERR]` 零命中;FTP 改配置 IP→`192.168.1.101` 后**复位即加载生效**(`[NET_CFG] load: OK ip=192.168.1.101` + 芯片 `IP_INF` .101 + 21 端口探测可达),原档恢复后复测回 .100。真机全闭环 `@test` PASS 7/7。**台架步骤与判据见 `测试说明/实机测试实施指南.md` §3 / §10** |
+1 -1
View File
@@ -49,7 +49,7 @@
### 阶段 A:立即执行(改动小、风险高、当周可完)
> **状态(2026-10-03)**:A1~A4 全部**已实施并通过真机验证**——详见 `测试说明/实机测试实施指南.md` §3.2(A1 判定 PASS 含配置持久化;A2/A3/A4 正常路径零回归;芯片级失败分支/短写/拔线负向场景记为待办,待专项台架窗口)。A5 待查手册。
> **状态(2026-10-03)**:A1~A4 全部**已实施并通过真机验证**——A1 判定 PASS(含配置持久化,见 `子系统设计/配置文件设计说明.md` 2026-10-03 记录);A2/A3/A4 正常路径零回归(A2 见 `网络/Net层阻塞模型架构设计.md`,A3/A4 见 `问题记录/错误码传播审计.md` E-34 / E-04);芯片级失败分支/短写/拔线负向场景记为待办(`待处理内容.md` N-16),待专项台架窗口。**执行流程见 `测试说明/实机测试实施指南.md` §3 / §10**。A5 待查手册。
> 目标:清掉"会静默坏事"的产品级风险 + 还清验证债。全部是一档性质,无架构变更。
+1 -1
View File
@@ -29,7 +29,7 @@
| # | 事项 | 说明 | 出处 |
|---|---|---|---|
| N-4 | **pending 机制二期:ACCEPT + SEND 阻塞路径 pending 化**——E-06(accept 轮询计时失真)、E-20(lftpd 控制通道 errno 分类/501)、E-21(timeSync errno 分级)剩余分量共用该机制扩展;届时 L3/L5 基线再重锁、探针族扩充(close/reconfig/EOF/disconnect-during-pending)、看门狗接 selftest 留痕、模拟器差距清单 +1 | 一期(RECV)已落地并入主线:`a45c0cb`(+文档闭环 `7ff2958`);架构现状见 `Net层阻塞模型架构设计.md`,二期设计基线与门禁见 `下一步任务规划.md` §3.1 | 同左 + `错误码传播审计.md` 第二档 #2 |
| N-16 | **A2/A4 专项场景台架验证待办**(正常路径已实测零回归,2026-10-03):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**(拔交换机侧线缆链路仍 UP,CH395 对交换机拓扑),断链后复位验证 `PHY: DISCONNECT` + 自检台账 `comms fault` 降级放行;② A2 芯片级 `net_init` 失败分支(需 SPI 故障注入,验证 `net init fail` 自检 + 30s 重试恢复);③ A4 短写压测(需远显客户端 + UI 推流压力,验证 `remo send short` 告警/阻断/重连恢复) | 2026-10-03(台架;台架拓扑 = CH395↔交换机,拔线操作受限) | `实机测试实施指南.md` §3.2 真机判定表 |
| N-16 | **A2/A4 专项场景台架验证待办**(正常路径已实测零回归,2026-10-03):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**(拔交换机侧线缆链路仍 UP,CH395 对交换机拓扑),断链后复位验证 `PHY: DISCONNECT` + 自检台账 `comms fault` 降级放行;② A2 芯片级 `net_init` 失败分支(需 SPI 故障注入,验证 `net init fail` 自检 + 30s 重试恢复);③ A4 短写压测(需远显客户端 + UI 推流压力,验证 `remo send short` 告警/阻断/重连恢复) | 2026-10-03(台架;台架拓扑 = CH395↔交换机,拔线操作受限) | `实机测试实施指南.md` §10(已完成事项与证据去向) |
## 可靠性与自恢复
+51 -57
View File
@@ -1,7 +1,8 @@
# 实机测试实施指南(On-Board Test Guide)
> 本文档描述项目的**上板(真机)测试执行判据**与**各事项的真机验证状态**:
> 每项给出「现状 → 判据(可观测、量化)→ 执行步骤(含精确命令)→ 风险/回滚」。
> **文档定位**:本文 = 上板(真机)测试的**执行流程**——按顺序执行。
> 每步给出「目的 → 判据(可观测、量化)→ 命令 → 状态(✅ 已闭环 / ⬜ 待执行)」。
> **已完成事项**(S7、A1~A4)的实施细节与证据**不在本文**,见对应模块文档(§10 状态与去向)。
> **前置铁律**:本文所有步骤**均在接上 MCU / 串口 / ST-LINK 之后**执行;
> 无实机时**只读本文,不执行任何烧录**。
> **上游**:`错误码传播审计.md`(E-xx)· `审查记录/测试与架构改进建议.md`(S7/S9/S11/S5/S4)·
@@ -14,26 +15,28 @@
---
## 1. 事项总览
## 1. 执行流程总览
台架窗口就绪后,按 **P0 → P1 → P2 → P3** 批次顺序执行:
台架窗口就绪后,**按下列顺序执行**(P0 → P1 → P2 → P3):
| 批次 | 事项 | 性质 | 章节 |
| 步骤 | 事项 | 状态 | 章节 |
|---|---|---|---|
| **P0-A** | 环境预检(串口/ST-LINK/`@build`/`.map` 基线) | 前置 | §2 |
| **P0-B** | 产品 `@test` 闭环 + 自检结果判定(S7 + A1~A4) | ✅ 已闭环 | §3 |
| **P1-A** | IWDG 故障注入 V2/V4 + 长跑 V5(N-03) | 可靠性 | §4 |
| **P1-B** | 堆低水位告警实测(S11) | 可观测性 | §5 |
| **P2-A** | GD5F 错误通道(S9 = 上游 C2)+ 套件回归 | 结构债 | §6 |
| **P2-B** | 网络重建恢复(P1-8)+ 存量网络项重锁(N-2/N-3) | 稳定性 | §7 |
| **P3** | `test/` 静态检查基线(S5)+ 用例追溯(S4)+ 待核实项 | 工程卫生 | §8 |
| **步骤 1** | 环境预检(P0-A,每次上台架必跑) | 常设 | §2 |
| **步骤 2** | 产品 `@test` 闭环 + 自检结果判定(P0-B) | ✅ 已闭环 | §3 |
| **步骤 3** | IWDG 故障注入 V2/V4 + 长跑 V5(P1-A / N-03) | ⬜ 待执行 | §4 |
| **步骤 4** | 堆低水位告警实测(P1-B / S11) | ⬜ 待执行 | §5 |
| **步骤 5** | GD5F 错误通道回归(P2-A / S9) | ⬜ 待执行 | §6 |
| **步骤 6** | 网络稳定性与基线重锁(P2-B / P1-8 + N-2/N-3) | ⬜ 待执行 | §7 |
| **步骤 7** | 工程卫生(P3 / S5 + S4 + 待核实项) | ⬜ 待执行 | §8 |
> **每批出口**:`@build` 0/0 → 一轮 `@test` PASS → ST-LINK 全片回读 `No difference found` →
> **每步出口**:`@build` 0/0 → 一轮 `@test` PASS → ST-LINK 全片回读 `No difference found` →
> 上游登记销项 + 文末变更记录留痕。
>
> **参考**(非执行步骤):§9 执行注意(实测陷阱)· §10 已完成事项与证据去向 · §11 引用闭环。
---
## 2. 环境预检(P0-A,每次上台架前必跑)
## 2. 步骤 1:环境预检(P0-A,每次上台架前必跑)
> **目的**:避免"改动没问题、台架有问题"的误判(历史上多次把接线/权限问题误判为代码缺陷)。
@@ -56,20 +59,15 @@
---
## 3. 产品 @test 闭环 + 自检结果判定(P0-B)
## 3. 步骤 2:产品 @test 闭环 + 自检结果判定(P0-B) · ✅ 已闭环
### 3.1 自检结果判定(S7,已落地并投用)
> S7 判定已落地并投用;A1~A4 已闭环。**实施细节与真机验证证据见 §10 状态与去向**,本节只给复跑命令与判据。
**现状**:`@test` 闭环除串口标记外,还判定设备侧自检结论(v1 只记故障、不记通过):
### 3.1 执行
- `verify_log.py --require-selftest-pass`(可带路径参数):退出码 0 = PASS / 1 = FAIL;
判定语义 = `selftest.log` **缺失/0 字节 → 无故障 → PASS**;`filesize/64 > 0`(任一 64B 定长记录)
= 有故障 → FAIL,并打印故障条目(时间戳 + 描述)便于定位;
- `run_boot_test.py --require-selftest-pass`:未给本地副本时**自动经 FTP 抓取** `/log/selftest.log`
(设备侧 450"文件不存在"按正常路径处理——"仅故障才写"语义下干净设备本就没有该文件;
2026-10-02 修复:原实现把 450 当异常抛出,会让本该 PASS 的闭环在最后一步崩掉)。
**执行**:
`@test` 闭环除串口标记外,还判定设备侧自检结论(v1 只记故障、不记通过):
`selftest.log` **缺失 / 0 字节 → 无故障 → PASS**;`filesize/64 > 0`(任一 64B 定长记录)
= 有故障 → FAIL,并打印故障条目(时间戳 + 描述)便于定位。
```bash
# 一键闭环(selftest.log 自动 FTP 抓取;无故障记录 = PASS)
@@ -83,30 +81,7 @@
# 判据:退出码 0;输出含 "[OK] selftest: no fault record"
```
### 3.2 A1~A4 实施与真机验证(已闭环)
> 来源:`审查记录/下一步任务规划.md` 阶段 A。四项均已落地并经真机验证(A1 全项通过;A2~A4 正常路径零回归,故障/压测分支见下方判定表):
| 序 | 事项 | 实施内容(已落地) | 验证判据 | 命令/入口 |
|---|---|---|---|---|
| **A1** | **P0-1 `cfg_file` 堆分配改造** | **已落地**(分配收进 `cfg_store_alloc/free` 平台后端;模拟器用宿主堆,**照不出** `Heap_Size=0x200`(512B)约束——真机是最后一道门) | 串口日志出现 `[CFG]` **`load: OK (…B, heap free …B)`**(实测行格式);Forbidden `FAIL`/`[ERR]` 零命中;**保存配置后复位,值持久** | `& '.venv\Scripts\python.exe' test/host/run_boot_test.py` |
| **A2** | **P1-8 网络重建失败恢复** | **已落地**(2026-10-02 补码):首启组网失败 = 自检 `net init fail` + 30s 周期重试(1s 分片喂心跳,**不自驻留**);重建(reconfig)失败 = 自检 `net reinit fail` + 30s 延迟重触发事件位(tick 回绕安全),成功即清零;PHY 链路超时仍走既有 `comms fault`(降级放行,语义不变) | 失败路径写 syslog 自检 + 30s 周期重试;**不自驻留死循环**;恢复后各 TCP 服务据代次号重建监听;`@test` PASS | `@build` → `@test`;UI 网口设置页改 IP(触发重建路径);`test/host/e02_probe.py` |
| **A3** | **E-34 CH395F 字节命令超时** | **已落地**(2026-10-02 补码):3 处字节级 SPI 调用 = 有限超时 100ms + 返回值检查;失败锁存 `ch395f_spi_byte_fault()`(仅首条故障记日志,防刷屏)——SPI 异常不再挂死 netTask | 构建 0/0;**正常通信零回归**(FTP 传输正常、启动无 `SPI byte op fail` 行) | `@build` + `@test` |
| **A4** | **E-04 `remo_send` 返回值** | **已落地**(2026-10-02 补码):`remo_send` 改返回 `int` 校验 `ret == total`;短写/失败 → `DBG_ERROR` + 连续失败计数;连续 3 次 → **阻断推送**(客户端察觉无帧自行重连,芯片侧 DISCONNECT/TIMEOUT 自动重开监听;MCU 单连接模型**不** `net_close` 数据 fd),新连接/网络重建时解除 | 短写可观测(串口 `remo send short` 告警)+ 连续失败阻断 → 重连恢复;**UI 推流压力下无黑屏** | `@build` + UI 远显推流压力回归 |
> **A5(P1-7 MAC 写入顺序)**:**先查手册**(CH395F §9.2.1 INIT 是否锁存 MAC),
> 再决定改或文档化"无需调整"——**属离线可做部分**,不在本文强绑。
**真机判定(2026-10-03,本机 MCU,新固件全闭环 `@test` PASS 7/7)**:
| 项 | 判定 | 证据 |
|---|---|---|
| A1 | ✅ **PASS(含持久化)** | `[CFG] load: OK (523B, heap free 8840B)`(经 FreeRTOS 堆分配——512B C 堆约束的验收点);Forbidden 零命中;FTP 改配置 IP→.101 后复位即加载生效(`[NET_CFG] load: OK ip=192.168.1.101` + 芯片 `IP_INF` .101 + 21 端口探测可达),原档恢复后复测回 .100 |
| A2 | ⚠️ **正常路径零回归**;失败分支待专项窗口 | 开机 `net init: OK` / `PHY: 100M FULL` / `netTask: started`,**无 `init FAIL` / `retry in 30s` 误触发**;芯片级 `net_init` 失败分支需故障注入、UI 重建路径需 UI 操作,台架无自然触发(PHY 链路超时走既有 `comms fault` 降级路径,未改动);拔线负向测试因台架线缆拓扑记待办(N-16) |
| A3 | ⚠️ **正常路径零回归**;故障分支待专项窗口 | 开机全部芯片 SPI 命令正常(MAC/IP_INF 回读正确),**`SPI byte op fail` 零出现**;SPI 异常分支(故障锁存)只能经故障注入验证 |
| A4 | ⚠️ **无误报基线**;推流压测待专项窗口 | 开机 UI 远显服务正常启动(port 7003 监听),无客户端连接时**零 `remo send short` 误报**;短写判定/阻断重连路径需远显客户端 + 推流压力验证 |
### 3.3 自检项清单(S7 判定对象,20 处)
### 3.2 自检项清单(S7 判定覆盖面,20 处)
> 来源:全库 `syslog_post(SYSLOG_SELFTEST, ...)` 调用点。**这是 S7 的判定覆盖面基准**。
@@ -122,7 +97,7 @@
---
## 4. IWDG 故障注入与长跑(P1-A,N-03 收尾)
## 4. 步骤 3:IWDG 故障注入与长跑(P1-A,N-03 收尾) · ⬜ 待执行
> 来源:`子系统设计/看门狗设计说明.md` §10 步骤 7~10;`待处理内容.md` N-03。
> 判定状态机与 IWDG 配置(PR/RLR 按设计值写入)已落地并经真机验证(2026-10-02,`930215f`,
@@ -174,7 +149,7 @@ $cli = if ($env:DTU_STLINK_CLI) { $env:DTU_STLINK_CLI } else { (Get-Command ST-L
---
## 5. 堆低水位告警实测(P1-B,S11)
## 5. 步骤 4:堆低水位告警实测(P1-B,S11) · ⬜ 待执行
**现状证据**:2026-10-03 上板复测 `free=8,688 / min_ever=3,712~4,728 B`
(两次开机,运行间波动 ≈1KB;初始 `configTOTAL_HEAP_SIZE` 48KB)——
@@ -203,7 +178,7 @@ $cli = if ($env:DTU_STLINK_CLI) { $env:DTU_STLINK_CLI } else { (Get-Command ST-L
---
## 6. GD5F 错误通道统一(P2-A,S9 = 上游 C2)
## 6. 步骤 5:GD5F 错误通道统一(P2-A,S9 = 上游 C2) · ⬜ 待执行
> **来源**:`错误码传播审计.md` 第二档 #1(E-10/E-42/E-53/E-54/E-56/E-57);
> `测试与架构改进建议.md` §2.3 / §4.2 四要素骨架。
@@ -249,9 +224,9 @@ $cli = if ($env:DTU_STLINK_CLI) { $env:DTU_STLINK_CLI } else { (Get-Command ST-L
---
## 7. 网络稳定性与基线重锁(P2-B)
## 7. 步骤 6:网络稳定性与基线重锁(P2-B) · ⬜ 待执行
### 7.1 P1-8 网络重建失败恢复(与 §3.2 A2 同一项,此处给网络专项视角;实施内容见 A2 行)
### 7.1 P1-8 网络重建失败恢复(A2;实施细节见 `网络/Net层阻塞模型架构设计.md`,状态见 §10)
**判据**:拔插网线/改 IP 触发重建后——
- 失败路径**写 syslog 自检**(不再零日志);
@@ -284,7 +259,7 @@ $cli = if ($env:DTU_STLINK_CLI) { $env:DTU_STLINK_CLI } else { (Get-Command ST-L
---
## 8. 工程卫生(P3)
## 8. 步骤 7:工程卫生(P3) · ⬜ 待执行
### 8.1 S5:`test/` 代码宽松静态检查
@@ -345,7 +320,7 @@ cppcheck --enable=warning --error-exitcode=1 test/ 2>&1 | tee test_cppcheck_base
---
## 9. 实测陷阱(2026-10-02 台架窗口,照做可少绕一天)
## 9. 执行注意:实测陷阱(2026-10-02 台架窗口,照做可少绕一天)
1. **写入"复位后消失"的两层原因**(窗口最大坑,根因均已修复,详见模块文档):
- **L1 dhara checkpoint 回滚**(`架构设计/STM32F4-Base存储架构说明.md` §5.4.1):环回绕后
@@ -394,7 +369,25 @@ cppcheck --enable=warning --error-exitcode=1 test/ 2>&1 | tee test_cppcheck_base
---
## 10. 与既有文档的引用闭环
## 10. 已完成事项与证据去向
> 已完成事项的**实施细节与真机证据不在本文**,按下列去向查阅;本文只保留其复跑命令与判据。
| 事项 | 状态 | 实施细节 / 证据所在 |
|---|---|---|
| **S7** 自检结果判定 | ✅ 已落地并投用 | `测试说明/自动化测试流程.md`;提交 `4a4cd29` |
| **A1** P0-1 `cfg_file` 堆分配改造 | ✅ 已闭环(含真机持久化) | `子系统设计/配置文件设计说明.md`(实施 v1.11 + 2026-10-03 真机验证记录) |
| **A2** P1-8 网络重建失败恢复 | ✅ 已闭环(正常路径零回归;故障分支见 N-16) | `网络/Net层阻塞模型架构设计.md` |
| **A3** E-34 CH395F 字节命令超时 | ✅ 已闭环(正常路径零回归;故障分支待专项窗口) | `问题记录/错误码传播审计.md` E-34 |
| **A4** E-04 `remo_send` 返回值 | ✅ 已闭环(正常路径零回归;推流压测待专项窗口) | `问题记录/错误码传播审计.md` E-04 |
| 2026-10-02 台架取证链(IWDG PR/RLR 错配 / dhara resume 回滚 / ORE 僵尸通道) | ✅ 已修 | `子系统设计/看门狗设计说明.md` 2026-10-02 变更记录 · `架构设计/STM32F4-Base存储架构说明.md` §5.4.1 · `子系统设计/控制台单写者日志设计说明.md` §12;提交 `930215f` |
> **真机判定汇总**(2026-10-03,本机 MCU,新固件全闭环 `@test` PASS 7/7):A1 ✅ PASS(含配置持久化);
> A2/A3/A4 正常路径零回归;芯片级失败分支 / 短写 / 拔线负向场景记 `待处理内容.md` N-16,待专项台架窗口。
---
## 11. 与既有文档的引用闭环
| 本文项 | 上游文档 | 下游落地文档 |
|---|---|---|
@@ -417,6 +410,7 @@ cppcheck --enable=warning --error-exitcode=1 test/ 2>&1 | tee test_cppcheck_base
| 日期 | 变更 |
|---|---|
| 2026-10-03 | **重构为纯执行流程**:确立单一组织逻辑——本文 = **按顺序执行**的上板测试流程(步骤 1~7 + 状态标记),参考内容(§9 执行注意 / §10 已完成事项去向 / §11 引用闭环)后置。已完成事项(S7、A1~A4)的实施细节与真机证据**移出本文**,§10 只留「事项 → 去向」指针;§3 只留复跑命令与判据;§1「事项总览」改「执行流程总览」(步骤/状态列) |
| 2026-10-03 | **§3.2 去"待上板"框架**:A1~A4 均已落地并(A1 全项 / A2~A4 正常路径)经真机验证,删除"待上板事项(代码状态 2026-10-02 核对)"表述,改写为**客观事实记录**(列名改为「实施内容(已落地)」+「验证判据」);§1 总览 P0-B 状态由「待上板」改「✅ 已闭环」;抬头与 `docs/README.md` 索引同步为「真机验证状态」。残留事实(A2/A3/A4 故障分支 + A4 推流压测需专项窗口、N-16 拔线负向测试)仍如实保留 |
| 2026-10-02 | **更名**:`实机测试规划.md` → `实机测试实施指南.md`(与文档性质对齐——常设执行判据,非规划;引用面改造后仅剩 `docs/README.md` 索引 1 处,同步更新) |
| 2026-10-03 | **A2/A3/A4 实施 + 真机验证**:A2 = `net_task.c` 初始组网失败/重建失败 → 自检留痕 + 30s 周期重试(分片喂心跳,不自驻留);A3 = `ch395f.c` 3 处字节级 SPI 调用 `HAL_MAX_DELAY` → 100ms 有限超时 + 返回值检查 + 故障锁存 `ch395f_spi_byte_fault()`(首条记日志);A4 = `ui_net_sink.c` `remo_send` 校验 `net_send` 返回值,短写告警、连续 3 次失败阻断推送、新连接/网络重建解除(单连接模型不 `net_close` 数据 fd)。`@build` 0/0 + L0/L0.5 全绿 + 模拟器构建通过;上板 `@test` PASS 7/7:A1 判定 PASS(含 IP 改→复位→持久→可达闭环,原档已恢复)、A2/A3/A4 正常路径零回归;自检清单 18→20 处(`net init fail` / `net reinit fail`);上板新数据:min_ever 下限 3,712 B(S11 阈值建议改 3,072 B)、开机良性 `MISS start` 行新增陷阱 §9.8;拔线负向/短写压测记 `待处理内容.md` N-16 |
@@ -36,6 +36,14 @@
- `1` = FAIL:存在缺失标记(`[MISS]`)或违规模式(`[HIT]`)
- `2` = 日志文件不可读
### 自检结果判定(S7,`--require-selftest-pass`)
`run_boot_test.py` / `verify_log.py` 支持 `--require-selftest-pass`:除串口标记外,还判定设备侧自检结论
(v1 只记故障、不记通过)——`selftest.log` **缺失 / 0 字节 → 无故障 → PASS**;任一 64B 定长记录
(`filesize/64 > 0`)→ FAIL,并打印故障条目(时间戳 + 描述)便于定位。`run_boot_test.py` 未给本地副本时
**自动经 FTP 抓取** `/log/selftest.log`(设备侧 450"文件不存在"按正常路径处理——"仅故障才写"语义下
干净设备本就没有该文件)。判定对象(20 处自检描述串)见 `实机测试实施指南.md` §3.2。
### 默认开机标记(来自固件)
| 标记 | 来源 |
@@ -217,3 +217,4 @@ CONNECT → ESTABLISHED 是合法迁移,推断取消会误杀正在建链的
| 2026-09-22 | 一期落地并全量台架验证(原《Net 层阻塞模型业界对照与演进方案》实施记录) |
| 2026-09-26 | 调研文档退役,客观实施记录独立成文 |
| 2026-09-29 | **改写为架构设计文档**:以"当前如何设计/为何如此"为主线重组织;历史演进与门禁实测降级为附录 A;迁入 `docs/网络/` |
| 2026-10-03 | **网络重建失败恢复(P1-8 / A2)落地并真机验证**:首启组网失败 = 自检 `net init fail` + 30s 周期重试(1s 分片喂心跳,**不自驻留**);重建(reconfig)失败 = 自检 `net reinit fail` + 30s 延迟重触发事件位(tick 回绕安全),成功即清零;PHY 链路超时仍走既有 `comms fault` 降级(语义不变)。真机:开机 `net init: OK` / `PHY: 100M FULL` / `netTask: started`,无 `init FAIL` / `retry in 30s` 误触发(**正常路径零回归**);芯片级 `net_init` 失败分支 / 拔线负向场景待专项窗口(`待处理内容.md` N-16)。**执行判据见 `测试说明/实机测试实施指南.md` §7.1 / §10** |
+6 -3
View File
@@ -44,6 +44,9 @@
> **2026-09-25 变更**:**E-03 已修复**(错误码改按任务隔离,见 §3.1)。
> 它是本次审计中唯一"并发条件下会说谎"的通道,且 pending 二期不覆盖它,故独立小修先行。
>
> **2026-10-03 变更**:**E-34 / E-04 已修复并通过真机验证**(CH395F 字节命令有限超时 + `remo_send` 返回值校验;见 §5 第一档)。
> 真机全闭环 `@test` PASS 7/7;执行判据见 `测试说明/实机测试实施指南.md` §3 / §10。
---
@@ -178,7 +181,7 @@ E-57(`int` / `int32_t` 混用)。
`net_send` 在弱网 / 对端停滞时的合法返回是**短写**(已发字节数 < 请求),不是 -1。
- **后果**:应答帧静默截断 → 客户端 CRC 校验失败 → 断开重连 → 用户观感是
"画面卡住然后黑屏 / 一直卡"。这是**最难定位的一类故障**:设备侧一切日志正常。
- **当前状态(复核)**:**仍然存在**。已确认 `ui_net_sink.c` 全文件无 `net_send` 返回值检查,
- **当前状态**:✅ **已修复并通过真机验证(2026-10-03)**——`remo_send` 改返回 `int` + 校验 `ret == total` + 短写告警 / 连续失败阻断推送;真机无误报基线。以下为**修复前**复核记录(保留作背景):`ui_net_sink.c` 全文件无 `net_send` 返回值检查,
且 `remo_send` 的整帧(3204B)**远超过**单次可发送上限
`NET_SEND_CHUNK_MAX`(= 芯片发送缓冲 1KB,`net_socket.c:1394`),
所以"单次调用的返回值即全量"这一假设**在整帧路径上必然不成立**;
@@ -473,8 +476,8 @@ E-57(`int` / `int32_t` 混用)。
| # | 项 | 内容 | 级别 |
|---|---|---|---|
| 1 | **E-34** | CH395F 位命令路径:`HAL_MAX_DELAY` → 有限超时(100~500ms)+ 返回值检查。**一行级改动,消除 netTask 永久挂死风险** | P1 |
| 2 | **E-04** | `remo_send` 改为返回 `int` 并校验 `ret == len`;短写 → `DBG_ERROR` + 统计;连续失败 → `net_close` 强制重连补帧 | P1 |
| 1 | ~~**E-34**~~ | **已修复并通过真机验证(2026-10-03)**:CH395F 3 处字节级 SPI 调用 `HAL_MAX_DELAY` → 有限超时 100ms + 返回值检查 + 故障锁存 `ch395f_spi_byte_fault()`(仅首条故障记日志,防刷屏)——SPI 异常不再挂死 netTask;真机正常路径零回归 | ✅ |
| 2 | ~~**E-04**~~ | **已修复并通过真机验证(2026-10-03)**:`remo_send` 改返回 `int` 校验 `ret == total`;短写 → `DBG_ERROR` + 连续失败计数;连续 3 次 → 阻断推送(客户端无帧自行重连,芯片侧 DISCONNECT/TIMEOUT 自动重开监听;MCU 单连接模型不 `net_close` 数据 fd),新连接/网络重建解除;真机无误报基线 | ✅ |
| 3 | ~~**E-03 / N-5**~~ | **已修复(2026-09-25)**:错误码改按任务隔离,删除全局 `s_net_errno`(见 §3.1) | ✅ |
| 4 | **E-49** | RS485 TX 超时路径:等 TC / 短延时后再拉低 DE | P2 |
| 5 | **E-15** | `ringbuf` 定去留:修复后启用,或删除(零调用者模块不值得维护) | P2 |