Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 685e3b58f5 | |||
| 829c2580bb | |||
| 0f2aec8850 | |||
| 488f6fbf21 | |||
| 84f46b5660 | |||
| c487ce4225 |
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -58,7 +58,7 @@ docs/测试说明/专项验证/模拟器差距清单.md §2.3「开机账本 boo
|
||||
| 顺序 | 工作 | 当前状态 | 开始或切换条件 |
|
||||
|---|---|---|---|
|
||||
| **1** | **UI 补齐** | **清单已清空(2026-10-28)** | 记录 5 页与运行报告页已落地并绑页;余下 5 叶属 §5「当前不做」,重开条件见 docs/任务规划/UI补齐.md §5;上板判据见 docs/任务规划/登记簿.md §7 |
|
||||
| **2** | **net 层跨上下文收口** | **下一顺位(未开工)** | UI 清单已清空,切换条件已满足;**开工需用户点头**——换主线是产品决策,不由本批顺带做掉 |
|
||||
| **2** | **net 层跨上下文收口** | **✅ 2026-11-06 闭环** | 子项 A(裸指针收口为状态查询 API):审计确认收口已完成(`net_listener` 单一登记入口 `net_listener_request` + 单一执行者 `net_listener_tick`、`s_relisten_req` 0 处模块外直接读写;UI 读侧快照 API `ui_data_info`/唯一填充者 `ui_data_feed`);子项 B(突发分片让路):台架重验确认新负载剖面(SNTP 请求/退避 + FTP + 104 + 7003)下 **uiTask ≥800 ms 饿死签名不复现**(`task stall` 0 条、复位 0、NAND `wdev.log` 当日零新增 STALL、7003 最差 759 ms <800 ms 线)——证据见 `网络自愈架构设计.md` 与 `看门狗设计说明.md` 变更记录 2026-11-06 条目 |
|
||||
| **3** | 其余结构与可靠性评估 | 排队 | net 收口后;逐项见 `登记簿.md`,观察项不为了“清清单”而强做 |
|
||||
| **4** | 数据可信(采集数据可信度) | 动态波形验证 **✅ 2026-11-04 闭环(六轮)**;变比确认与两点标定等外部资源 | 信号发生器动态波形验证(不依赖外部资源,✅ 2026-11-04)→ 端子/子板变比确认 → 标准源两点标定;**排序调整(2026-10-29):动态验证让位给故障录波数据面**,段文件落地后判据升级为 PC 独立重算对表(docs/子系统设计/故障录波设计说明.md §11)(已知电压注入已于 2026-10-27 台架闭环并销项);外部资源到位可插入优先处理 |
|
||||
| **5** | 标准源送检与第三方 104 主站验收 | 等待标定完成 | 两点标定完成且保护 VALID 已置位;送检窗口前 2 日冻结特性 |
|
||||
|
||||
+5
-6
@@ -20,8 +20,7 @@
|
||||
|
||||
| # | 事项 | 发现 | 证据与现状 | 出处 |
|
||||
|---|---|---|---|---|
|
||||
| dhara 重试自旋残留 | **dhara 重试自旋残留**——`try_recover()` 的 `DHARA_MAX_RETRIES`(8) 自旋在坏块密集时仍可能长时间占用 defaultTask(喂狗点) | 2026-10-02 | 低优先:现有 `vol_lock` + 喂狗节奏缓解;若台架再出"存储侧喂狗饥饿"再排期 | `Lib/dhara/map.c` |
|
||||
| 可选全序列卷锁 | **可选全序列卷锁**——现卷锁仅覆盖 `syslog` / `cfg` / `lftpd` 三条路径(`vol_lock_wait(0)` try 语义),其它潜在访问点(如 UI 读日志)未纳入。⚠ 原本挂在本题下的「dhara 失败类快照(C4)」待还项**已于 2026-11-04 由问题 #79 还清**(`nand_ftl_fault_get/clear` + 探针按类分流,见 `../架构设计/STM32F4-Base存储架构说明.md` §10.4 已闭环段)——本题现只剩**卷锁覆盖面**本身,不再被 C4 阻塞 | 2026-10-02;C4 拆分 2026-11-04 | 待评估:先确认是否真有第二写者;无则关闭本项 | `App/fs/vol_lock.{c,h}` |
|
||||
| dhara 重试自旋残留 | **dhara 重试自旋残留**——`try_recover()` 的 `DHARA_MAX_RETRIES`(8) 自旋在坏块密集时仍可能长时间占用 defaultTask(喂狗点) | 2026-10-02;2026-11-05 复核未复发 | 低优先:现有 `vol_lock` + 喂狗节奏缓解,自旋另有 FTL 入口直接喂狗兜底(`../架构设计/STM32F4-Base存储架构说明.md` §10.5);若台架再出"存储侧喂狗饥饿"再排期 | `Lib/dhara/map.c` |
|
||||
|
||||
## 3. 硬件(V0.1 缺陷 → V0.2 改版项)
|
||||
|
||||
@@ -51,10 +50,10 @@
|
||||
|
||||
| 顺序 | 条目 | 要做什么 | 完成或关闭判据 |
|
||||
|---|---|---|---|
|
||||
| 1 | **net 层跨上下文收口** | 同批处理两件事:裸指针收口为状态查询 API;对时 reconcile/relisten 突发导致 uiTask 800 ms 以上连续缺席,评估优先级矩阵与突发分片让路 | 同类台架负载下不再出现目标饿死签名;网络与 UI 回归通过;证据写入网络与看门狗模块文档 |
|
||||
| 2 | **网络性能资源建议簇** | 分别评估 PASV 重复建监听、PHY 强制 100M 无回退、`NET_MAX_SOCKETS` 与单连接语义不一致;DE 项随 RS-485,不在本项做。机理见 `../网络/Net层阻塞模型架构设计.md` 与 `Drivers/BSP/NET/README.md` | 每项形成“修改并验证”或“有理由不做”的结论;不为了清清单做无收益重构 |
|
||||
| 3 | **dhara 重试自旋与卷锁评估** | 先确认是否仍出现存储侧喂狗饥饿、是否确有第二写者,再决定是否修改 | 有新证据才排修改;无第二写者则关闭全序列卷锁项 |
|
||||
| 4 | **uvprojx 空 TU 观察** | 201 个 LVGL `.c` 中 127 个在 `.map` 零产出,但当前增量构建仅 4~5 秒;有全量构建耗时痛点时先补计时基线,再用 Keil 原生 `<IncludeInBuild>0</IncludeInBuild>` 可逆排除 | 有实测收益才保留改动;否则继续观察 |
|
||||
| 1 | **网络性能资源建议簇** | 分别评估 PASV 重复建监听、PHY 强制 100M 无回退、`NET_MAX_SOCKETS` 与单连接语义不一致;DE 项随 RS-485,不在本项做。机理见 `../网络/Net层阻塞模型架构设计.md` 与 `Drivers/BSP/NET/README.md` | 每项形成“修改并验证”或“有理由不做”的结论;不为了清清单做无收益重构 |
|
||||
| 2 | **uvprojx 空 TU 观察** | 201 个 LVGL `.c` 中 127 个在 `.map` 零产出,但当前增量构建仅 4~5 秒;有全量构建耗时痛点时先补计时基线,再用 Keil 原生 `<IncludeInBuild>0</IncludeInBuild>` 可逆排除 | 有实测收益才保留改动;否则继续观察 |
|
||||
|
||||
> 原第 1 项「net 层跨上下文收口」已于 2026-11-06 闭环并销项(子项 A 审计确认收口完成、子项 B 台架重验确认新负载下 uiTask ≥800 ms 饿死签名不复现;证据见 `../网络/网络自愈架构设计.md` 与 `../子系统设计/看门狗设计说明.md` 变更记录 2026-11-06 条目)。原「dhara 重试自旋与卷锁评估」项随 #45 复核(卷锁无第二写者)关闭销项。
|
||||
|
||||
> RS-485 白名单随 `暂缓-RS485.md` 整簇处理,不列为 UI 后的独立编码任务。
|
||||
> 并行写域、工作树与合并纪律统一见 `docs/环境与部署/并行任务工作树方案.md`。
|
||||
|
||||
@@ -713,3 +713,4 @@ enter/exit 段还能读出"此刻仍在段内已多久"——**永久阻塞的
|
||||
| 2026-10-12 | **iec104Task / protectTask 纳入监视(IEC 104 上行/保护任务):必需掩码 `0x77`→`0xF7`→`0x1F7`** | 两行合并记录(IEC 104 上行 落地时漏补本文,保护任务 一并纠偏):**IEC 104 上行** 新增 `TASK_WD_IEC104 = 7`(iec104Task 100 ms 服务循环喂位,NET_READY 屏障等待按 100 ms 分片喂位),产品 `0x77`→`0xF7`、HW 层 `0x75`→`0xF5`;**保护任务** 新增 `TASK_WD_PROTECT = 8`(protectTask 20 ms 判据节拍喂位,见 `docs/算法/继电保护功能复现规划.md` §7),产品 `0xF7`→`0x1F7`、HW 层 `0xF5`→`0x1F5`。两任务均**不依赖存储/网络之外的屏障**(protectTask 无任何屏障)→ 任何构建都置位;均不做 NAND I/O → 不登记 FTL 心跳路由。主机侧单测 `beat_all()` 与 `tc_003`/`tc_005`/`tc_011` 掩码断言同步至 `0x1F7`,39 断言全绿。⚠ 注意 `0x1F7` 不含 bit3(testTask 任何构建不入掩码,口径不变) |
|
||||
| 2026-10-25 | **停喂判定按位分账(v1.5,大窗判读 F2)**:stall/停喂唯一判据从「复合连续缺席窗数」改为「**任一必需位的连续缺席窗数**」——同一任务连续 8 窗(800 ms)没跑过才申报停摆并停喂;多任务交替缺席(本窗缺 A、下窗缺 B)各自清零、且缺席窗在容忍线下**照常喂狗**(旧实现自第一个缺席窗起就不喂,800ms 只是申报点)。动因 = 2026-10-25 台架大窗:54 个探针重建窗里 9 条 stall 行中 16:24/16:28 两起为复合误升级(mg=877/918,无任何单位到 800ms 单串),16:39 为真 UI 单串(~1.2 s,受害者面修复另立 F3 票);`MISS start` 降级为复合边沿**诊断行**(不再代表停喂,判读口径 §6.1/§11.1 同步);真停摆到复位的总时长最坏 +约 0.7 s(§2.2 链注)。§0/§2.2/§3.2/§5.3/§6.1/§11.1/§11.6 同步;主机单测 `test/host/watchdog/watchdog_test.c` 断言按新判据改写 + 新增 **TC-WATCHDOG-017**(20 窗交替缺席:零 stall、20 窗持续喂)/ **TC-WATCHDOG-018**(同位 8/9/10 连击必报停 + 停喂;恢复窗喂、账本重启,第二段亚容忍串不误报),47 断言全绿 |
|
||||
| 2026-10-26 | **卷锁 try 失败纳入 ④「只计数」口径 + 修一处会骗人的契约(道G task-17)** | §4.3 场景表新增一行:卷锁 try 失败(defaultTask / uiTask 从不等锁,取不到就跳过本轮)既不需要分片也不需要心跳,缺的是**可观测**。落地形态:`App/fs/vol_lock.c` 记 5 态计数(`acquired` / `try_timeout` / `blk_timeout` / `failopen`,共 16 B 静态、一次自增),`vol_lock_get_stats()` **不取锁**、不关中断、任意上下文可调、NULL 无害。为什么不许在 try 失败处补一条日志:能把事写下来的通道(`/log/wdev.log`、`run.log`)自己也要取这把锁,而卷锁**非递归**,被卷忙挡住时既写不出东西还会自取死锁——所以留痕只能由 syslog 唯一写者按差值 latch 补投(另立 task-40 接在 `syslog_drain()` 的 `s_quiet_drop` 差值块之后)。同时修契约:`App/fs/vol_lock.h` 原写「0 - 超时未获取」、`vol_lock.c` 原 :38 把 fail-open 归给 0,而代码(:46)与 `TC-VOLLOCK-008` 都是**返 1**;现在两处都按代码写实并显式警告「返 1 也可能是零互斥」,`failopen` 计数就是它的证据。**观测时刻刻意不在锁层**:记时刻要读 tick,等于给 defaultTask 取锁链添 callee 与本帧(本档 §11 一贯按字节省的就是这条链),改由消费方观测并自盖 `obs_first_ms` / `obs_last_ms`——那是**被观测到的时刻**,不等于发生时刻,命名与文案都不许写成"首次发生"。机器证据:`test/host/vol_lock` 新增 TC-VOLLOCK-015~019(45 断言全绿:T2/T3 互不冒领、fail-open 计数可累加、读取不消耗证据);另把「喂狗点取锁一律 timeout=0」从注释纪律升级成会 FAIL 的断言——4 套假件加 `s_last_wait_to`,断言落在 TC-SYSLOG-010/012、TC-SOESTORE-016/018、TC-CFGFST-003/016/032/033、TC-LFTPIO-034,并做过红-绿反证(把 `sys_log_mcu.c:318` 的 `0u` 改 `50u` → 135/137 双红;把 `lftpd_io.c:48` 的 `100u` 改 `0u` → 32/33 红;随后按原串改回、SHA-256 逐字节相同) |
|
||||
| 2026-11-06 | **台架重验(#39 子项 B):新负载剖面下 uiTask ≥800 ms 饿死签名不复现** | 新负载剖面一整轮 30 min(00:34–01:04):SNTP 请求/退避(poll_min=1,无可达服务器)+ 持续 FTP 512KB + 周期 104 GI/COV + 7003 拉帧 10Hz。结果:看门狗 `task stall` **0 条**、复位 **0 次**、NAND `/log/wdev.log` **当日零新增 STALL**(独立佐证,最新一条为 2026-11-05 11:24:39);**880** 次瞬时节拍抖动(UI/FTP/IEC104 位)全部 <800 ms 自恢复、均与网络 relisten 瞬间同刻——阈值下抖动,非饿死;7003 最差单轮 **759.1 ms**(<800 ms 线)、18000/18000 零 CRC 零超时;FTP 188/188 全过;104 协议负载正常(16/18 检查项,COV 触发 FAIL = 台架浮空模拟输入已知限制、无 B10 源)。结论:8888 reconcile/relisten 突发源退役(#78,2026-11-04)+ 异步 `net_drop_conn` 收口后,新负载下 **uiTask ≥800 ms 饿死签名无触发源**——子项 B 完成判据(台架负载下不再出现目标饿死签名)本轮达成。网络侧记录见 `网络自愈架构设计.md` 变更记录 2026-11-06 条目 |
|
||||
|
||||
@@ -728,3 +728,44 @@ LPN 与原始码的位置**就地分类并打印(`ftl_err_name()` 给可读名
|
||||
`[CFG] load: file missing, factory template generated`,0 条 flush FAIL。
|
||||
⚠ 动作 A 语义 = 卷内容全失(旧卷随 map clear 作废),本次台架卷为可弃数据。
|
||||
|
||||
### 10.5 卷锁覆盖面审计与 dhara 重试自旋复核(2026-11-05,问题 #45 评估结论)
|
||||
|
||||
**结论先行:卷锁之外没有第二写者,登记簿「可选全序列卷锁」项就此关闭;
|
||||
「存储侧喂狗饥饿」无 2026-10-02 之后的新证据,dhara 重试自旋保留为长期观察。**
|
||||
判据 = 对 master `c487ce4` 的调用点枚举(判据:`App/` 与 `Drivers/BSP/` 下全部带
|
||||
`FA_WRITE` 的 `f_open` 与 `f_unlink`/`f_rename`/`f_mkdir`/`f_opendir` 调用点)
|
||||
+ 2026-11-05 之前的全部台架留档。评估过程与逐条证据见 Gitea 问题 #45。
|
||||
|
||||
**覆盖面清单(生产构建的全部卷访问序列):**
|
||||
|
||||
| 访问道 | 任务上下文 | 串行化纪律 |
|
||||
|---|---|---|
|
||||
| `/log` 七本 + `wdev.log`(追加写 / 清除 / `f_mkdir /log`) | defaultTask | `vol_lock_wait(0)` try,锁跨 open…close 完整序列(`App/log/sys_log_mcu.c`) |
|
||||
| `/log/soe.log` | defaultTask | 同上(`App/log/soe_store.c`) |
|
||||
| `/config.ini` 原子写 tmp+rename / unlink;`/prot_set.bin` 同后端 | defaultTask | 同上,store 后端四函数全覆盖(`App/cfg/cfg_file_store_mcu.c` v1.3;`App/cfg/prot_set_store.c` 走 `cfg_store_read`/`cfg_store_write_atomic`,无独立盘触点) |
|
||||
| `/wave` 录波段(mkdir / 追加写 ≤21×`f_write` / unlink) | defaultTask | 同上,锁跨完整序列(`App/task/default_task.c` 录波段) |
|
||||
| FTP RETR/STOR/LIST/DELE/MKD | ftpTask | 100 ms 分片阻塞 + 每片 `lftpd_task_wd_beat()`,锁跨 open…close / opendir…closedir 全程(`Drivers/BSP/NET/lftpd/lftpd_io.c`) |
|
||||
| 回放页段表/段窗读、UI 记录页读 | uiTask | try(0) 锁跨完整序列(`App/task/ui_task.c`、`App/log/sys_log_mcu.c` 读径) |
|
||||
| 空闲 flush 兜底(`CTRL_SYNC`) | defaultTask | try(0) 闸门,卷忙跳过(§5.5;`App/fs/vol_idle_sync.c`) |
|
||||
| `f_mount`/`f_mkfs`/`/fschk.tmp` 探针/`nand_ftl_format` | defaultTask 启动段 | **就绪屏障门控**:`STORAGE_READY` 在 `storage_bring_up()` 末尾才置位,netTask/ftpTask/uiTask 的卷入口全部等屏障(`App/task/default_task.c` 卷锁创建处注释),启动期卷写无并发使用者 |
|
||||
|
||||
LVGL 的 FatFs 驱动桥(`Lib/lvgl/src/libs/fsdrv/lv_fs_fatfs.c`)`LV_USE_FS_FATFS`
|
||||
默认关闭、本仓未接线,不是卷使用者;`test/board/` 的存储测试任务仅存在于互斥测试
|
||||
构建(`test-suite-switch` 门禁),不在产品镜像。**登记簿原口径「卷锁仅覆盖
|
||||
syslog/cfg/lftpd 三条路径」是 2026-10-02 建档快照,已被本表取代**——SOE、录波段写、
|
||||
`/prot_set.bin`、UI 读径与空闲 sync 随后都进了同一把锁。
|
||||
|
||||
**dhara 重试自旋**:`try_recover()` 的自旋有界——`DHARA_MAX_RETRIES`(8) 次 restart
|
||||
后以 `DHARA_E_TOO_BAD` 定案(`Lib/dhara/map.c:270-306`),journal 层六处重试环同为
|
||||
有界;且 NAND 长操作在驱动入口与 `gd5f_wait_busy` 每 100 ms 经 `nand_ftl_wd_feed()`
|
||||
**直接喂 IWDG**(`Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.c`)——自旋即便落在
|
||||
defaultTask(喂狗点)内也不饿狗,残留形态收敛为「有界时长的存储服务延迟」。
|
||||
真 NAND 卡死 = 持续喂狗、设备存活但存储冻结,属已声明边界
|
||||
(`../子系统设计/看门狗设计说明.md` §9 R4;要改成"NAND 死也复位"需给
|
||||
`nand_ftl_wd_feed()` 加上限,非本单判据)。**复发复核**:「存储侧喂狗饥饿」唯一
|
||||
实证 = 2026-10-02 台架轮(并发 FTL 写 → journal 竞争,另有同日 IWDG 超时被配成
|
||||
复位默认值的 P0 修复,见 `../子系统设计/看门狗设计说明.md` 变更记录),此后
|
||||
2026-10-25 F2/F3 探针轮、2026-11-02 录波枚举台架轮(卷锁 try 超时 0 次)、
|
||||
2026-11-05 PR #82 补验 soak(STOR 密集)均无该签名。重开判据不变:**台架再出
|
||||
存储侧喂狗饥饿才排期**;观察行留登记簿 §2。
|
||||
|
||||
|
||||
+1
-1
@@ -320,7 +320,7 @@ STM32F4-Base/
|
||||
│ │ console_log(UART5 控制台单写者)、soe_rec(64B SOE 纯编解码)+ soe_store(投递/落盘胶水)
|
||||
│ ├── cfg/ 配置引擎:cfg_file(静态态单任务收敛于 defaultTask)、store(MCU=FreeRTOS 堆)、
|
||||
│ │ prot_set_store(/prot_set.bin 原子写,保护定值持久化)
|
||||
│ ├── fs/ 卷锁 vol_lock(syslog / cfg / lftpd 三条路径 try 语义)、vol_idle_sync
|
||||
│ ├── fs/ 卷锁 vol_lock(全卷访问点串行化:写者/读者 try、lftpd 分片阻塞)、vol_idle_sync
|
||||
│ ├── sync/ time_sync(timeSyncTask 载体)、time_sntp(SNTP 校时客户端,UDP)
|
||||
│ └── util/ sys_clock(墙钟)、task_watchdog(IWDG 判定状态机)、boot_stats、sha256、task_prof
|
||||
├── Drivers/BSP/ 纯手工驱动/服务(不受 CubeMX 保护)
|
||||
|
||||
@@ -644,6 +644,7 @@ DISCONNECT 会被 `(void)` 丢掉。但 RECV_OK 是条件位(下轮补回)
|
||||
| **E18** | **负向注入打靶 · 三轮**(注入代码不入库):① 吞掉 DISCONNECT(在 i104 的 200 ms accept 轮询窗内 RST);③ 绕过本层簿记直接 close 芯片空闲监听;⑤ 开盲区吞掉芯片自发的中断 + 等芯片真 CLOSED 再 open+listen | **①③⑤ 全部命中并救回**;①⑤ 的前提会被更快的消费者路径消解 → 常态 0 命中;⑤ 还要先越过芯片 `FIN_WAIT_2`(E15 的 2MSL 长尾,实测 ≈1 s) | §4.1.4 / §4.1.5:**三条均不可降级为只留痕**;⑤ 的**取消挂起 recv/send** 不可省 |
|
||||
| **E19** | **`force open` 反事实 A/B**(本层已收口 CLOSED + 芯片停 `FIN_WAIT_2` `0x05/0x06` + **对端挂住不关** = 队头阻塞场景;A = 现状放行,B = 只留痕不放行) | **放行与不放行的端口恢复时刻同一分布** → 动作在全部可产现场景内无可测收益;真正兜住"监听器永久失效"的是 **D10 预算 + 形态④ 重新登记**。两条实测坑:① 本层直接改 `state` **不会**进沉降窗(窗只由 `net_listener_settle` 开启);② `relisten retry budget exhausted` 在此被稳定复现 = 对端不配合拆链的签名,**非回归** | §4.3:800 ms 上限降级为**只留痕**(`keep waiting` 只留首末、隔离标志不清 → 继续排渣) |
|
||||
| **队头阻塞审计**(非实验编号) | `net_drop_conn` 收口后的时序由台架定案(探针 `e02_probe.py` 已删除,2026-11-04 随 :8888 退役,正文见 git 历史) | 对端配合(收到 FIN 后其内核 close):`TIME_WAIT` ~150 ms → 形态④ relisten,恢复全程 ~500 ms;对端内核存活但不 close:芯片停 `FIN_WAIT_2` 长尾,**监听恢复受限于对端 close** | §4.6 |
|
||||
| **台架重验(#39 子项 B)**(2026-11-06) | 新负载剖面一整轮 30 min:SNTP 请求/退避(poll_min=1,无可达服务器)+ 持续 FTP 512KB + 周期 104 GI/COV + 7003 拉帧 10Hz。看门狗 `task stall` 0 条、复位 0 次、NAND `wdev.log` 当日零新增 STALL(独立佐证);880 次瞬时节拍抖动全部 <800 ms 自恢复、均发生在网络 relisten 瞬间(阈值下抖动,非饿死);7003 最差单轮 759 ms(<800 ms 线)、18000/18000 零错零超时;FTP 188/188 全过 | 8888 reconcile/relisten 突发源退役(#78)+ 异步断连收口后,新负载下 **uiTask ≥800 ms 饿死签名无触发源**——子项 B 完成判据(台架负载下不再出现目标饿死签名)本轮达成 | §4.6;§11.1;看门狗设计说明 §11.4 |
|
||||
|
||||
## 6. 红线(明确不做的事)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user