diff --git a/.dsh/skills/stale-doc-count-sweep/reference/steps.md b/.dsh/skills/stale-doc-count-sweep/reference/steps.md index f9a8d221..6a1c06db 100644 --- a/.dsh/skills/stale-doc-count-sweep/reference/steps.md +++ b/.dsh/skills/stale-doc-count-sweep/reference/steps.md @@ -68,7 +68,7 @@ 5. **一笔只装一类事**。数字同步一笔(`cbb4fdb8`:11 处 + 变更记录一行);口径更正另起一笔(`6daa01ae`);提交后复扫逮到的漏网当前态再补独立一笔(`11d60057`)。钩子一增一减写成一个当日行的两个阶段(51 → 52 加 `id-check-new`、随即 52 → 51 摘 `id-check`),别写两行互相打脸。提交说明如实写(「先认一笔自己的错:上一笔的未绑 21 叶是探针错」),别把口径修正包装成「补充说明」。 -6. **被改文件全文通读,核对其余小节**——不是只看 diff。同一文档内互相引用的小节必须一致(本窗产品需求:§2.4 立项未排、§5.14 FR-SOE-3、§8.2 绑定现状、§8.3 已绑分页表、§9.1 差距表、§9.2 顺序表六处同时引用这四个数;`docs/任务规划/README.md` §1 当前执行表 vs §2 全项目顺序表)。若发现上一笔自己写进文档的数**口径就错了**,明确认错并改正,同时把**可复核的重算方法**写进文档(「按缩进判叶子:有更深缩进后继者即非叶子」),防止再错。 +6. **被改文件全文通读,核对其余小节**——不是只看 diff。同一文档内互相引用的小节必须一致(本窗产品需求:§2.4 立项未排、§5.14 FR-SOE-3、§8.2 绑定现状、§8.3 已绑分页表、§9.1 差距表、§9.2 顺序表六处同时引用这四个数;当窗口的 `docs/任务规划/README.md` 就同时有两处表引用同一批数,后来合成一张)。若发现上一笔自己写进文档的数**口径就错了**,明确认错并改正,同时把**可复核的重算方法**写进文档(「按缩进判叶子:有更深缩进后继者即非叶子」),防止再错。 7. **提交后再复扫一遍**(收尾硬步骤,不许省,也不许只在提交前扫)。按第 2 步的**全部**旧形态整仓再扫一次,逐条分类为 当前态 / 历史行 / 同数不同义:本窗 `cbb4fdb8` 提交后复扫得 14 条命中,12 条以上都在变更记录历史行(`47 → 53`、`53 → 60`、`122/217` 冻结),**唯一残留的当前态命中**是 `docs/架构设计/项目架构总览.md` §3「界面层」那行 → 单独补一笔 `11d60057`。说不出归属的就是漏改。 diff --git a/.dsh/skills/task-worktree/reference/pitfalls.md b/.dsh/skills/task-worktree/reference/pitfalls.md index a53bea4f..6ab6275f 100644 --- a/.dsh/skills/task-worktree/reference/pitfalls.md +++ b/.dsh/skills/task-worktree/reference/pitfalls.md @@ -41,7 +41,7 @@ → 主树 `merge --no-ff -F` → 合并前后 blob id 与 `diff --stat` 对账。**「它看着像废弃的」不是丢弃判据**。 - **⚠ `done` 的门禁跑在 `/keil-build` 之前 → 依赖 `.map` 的钩子会误报**(2026-10-12 实测): `done` 的顺序是「合并 → 重生成 → **门禁(ci_local)** → `/keil-build`」,而 - `mem-budget`(登记簿条目「缩堆迁 CCM 后半(暂缓)」)/ `mem-numbers` 是拿**文档快照 vs `.map`** 比对 —— 门禁跑时 + `mem-budget`(内存治理三件套)/ `mem-numbers` 是拿**文档快照 vs `.map`** 比对 —— 门禁跑时 `.map` 还是**主工作树合并前**的旧产物,与刚合并进来的新台账**必然不一致** → 误报 `[FAIL] 台账受管区与 .map 不一致`。`/keil-build` 跑完后 `.map` 才是新的。 **处置(2026-10-25 补全)**:按 C 节第 5 步的完整链补——`check_mem_numbers.py --write` → diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ae298065..288e3d25 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -564,7 +564,7 @@ repos: # TEST_SUITE_CH395F 就是开启状态(.map 含 34 处 test 代码),即仓库里 # 躺着的是测试固件。本钩子抓这个静默漏网:默认要求产品构建,跑套件回归 # 确需提交测试构建时用 `--allow-test-build` / ALLOW_TEST_BUILD=1 显式放行。 - # 详见 docs/任务规划/登记簿.md + # 判据与背景见 docs/门禁说明/test-suite-switch.md - id: test-suite-switch name: 测试套件开关=产品构建 entry: python scripts/check_test_suite.py @@ -572,7 +572,7 @@ repos: files: ^test/board/test_config\.h$ pass_filenames: false - # 9) 双端注册反向校验(2026-10-12 加,登记簿条目「rs485_task 白名单缺口」) + # 9) 双端注册反向校验(2026-10-12 加,rs485_task 白名单缺口) # 背景:新 .c 必须手动注册两处(`MDK-ARM/*.uvprojx` + `simulator/CMakeLists.txt`) # 才会被编译;历史上 `App/task/rs485_task.c`、`Drivers/BSP/NET/lftpd/lftpd_log.c` # **两处都没注册** = 写了却从不参与任何一端编译的**死代码**,误导读者以为功能已生效。 @@ -589,7 +589,7 @@ repos: language: system files: (\.c$|\.uvprojx$|CMakeLists\.txt$|^scripts/check_registration\.py$) pass_filenames: false - # 10) RAM 预算 92% 阈值门禁(2026-10-12 加,登记簿条目「缩堆迁 CCM 后半(暂缓)」的台账/门禁那半 / 审查报告 §5.5 三件套) + # 10) RAM 预算 92% 阈值门禁(2026-10-12 加,内存治理三件套的台账/门禁那半) # 背景:报告 §5.5 第 1 条要求"超阈值即失败 + Top-10 附表"——此前 mem-numbers 只防 # "文档数字漂移",**没有任何机械检查拦"占用超阈值"**;台账三件套(ram_baseline.py + # ram_baseline.tsv + docs/内存管理/RAM预算台账.md)落地后,本钩子把 92% 红线机械化。 diff --git a/AGENTS.md b/AGENTS.md index 01f4e0b7..075823a8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -10,7 +10,7 @@ ## 项目概况 -**现状一句话**:平台能力(网络 / 存储 / 时间 / UI / 日志 / 看门狗 / FTP / 配置)**已实现并台架验收**;采集主线已闭环到业务消费者(语义取数与有效性→全周傅氏相量→测频与遥测快照→保护判据 protectTask→104 遥信/遥测+UI);⚠ **保护判据现处于「未标定闭锁」态**——产品构建下 `adc_cal_flags()` 的 `ADC_CAL_F_VALID` 未置位,`App/task/protect_task.c:268` 判停(判定本体 = `adc_cal_prot_blocked()`,本任务只是消费者),等两点标定写入 `[adc_cal] valid` 后自动解卡(用户裁定 2026-10-25:保持闭锁,不用万用表走捷径);**RS-485 采集尚未接线**(按用户决策冻结,见 `docs/任务规划/暂缓-RS485.md`)——当前最大功能缺口,接线节奏受 **RS-485 接线门禁**约束(见「平台约束」)。 +**现状一句话**:平台能力(网络 / 存储 / 时间 / UI / 日志 / 看门狗 / FTP / 配置)**已实现并台架验收**;采集主线已闭环到业务消费者(语义取数与有效性→全周傅氏相量→测频与遥测快照→保护判据 protectTask→104 遥信/遥测+UI);⚠ **保护判据现处于「未标定闭锁」态**——产品构建下 `adc_cal_flags()` 的 `ADC_CAL_F_VALID` 未置位,`App/task/protect_task.c:268` 判停(判定本体 = `adc_cal_prot_blocked()`,本任务只是消费者),等两点标定写入 `[adc_cal] valid` 后自动解卡(用户裁定 2026-10-25:保持闭锁,不用万用表走捷径);**RS-485 采集尚未接线**(按用户决策冻结,见 `docs/产品需求/产品需求设计文档.md` §5.10)——当前最大功能缺口,接线节奏受 **RS-485 接线门禁**约束(见「平台约束」)。 **数据主线**(能力视角;分层图与跨层依赖表 → `docs/架构设计/项目架构总览.md`): @@ -94,7 +94,7 @@ ## 提交门禁(pre-commit) -- 任一失败即拦截,共 **52 个钩子**(**口径 = YAML 解析后的 hook 条目数**:自查命令与「声明 / 文档 / 实跑」三数同源核对见 `docs/门禁说明/README.md` §2 首条——⚠ 直接 grep 配置里的声明行会多算一条**注释掉的**候选钩子(比口径多 1),不是口径;**配置注释里也别复述那个 grep 字面量**,它会让文本计数再虚高 1(2026-10-27 实测踩过);加一条钩子就同批改 AGENTS 与门禁索引两处计数。2026-10-25 道E 连加 `bom-guard` / `setview-check` / `uinav-selftest` 三条,2026-10-26 加 `generated-fresh` 一条,2026-10-27 加 `nested-comment` 一条;2026-10-28 加 `id-check-new` 一条并同批退役 `id-check`(口径 52 → 51:编号门禁换牙——新的只查新增行、零语料,旧的八项全库校验连语料一起移入 `scripts/archive/id_gate/`,手工普查与恢复机器面见 `scripts/archive/id_gate/README.md`);2026-10-29 加 `skill-size` 一条(51 → 52),同日按用户裁定**退役 `id-check-new`**(52 → **51**:只查新增行的编号门禁整体退场,脚本与白名单一起移入 `scripts/archive/id_gate/`,编号形态此后无机器面,留档 `docs/门禁说明/id-check-new.md`);2026-10-30 加 `mermaid-syntax` 一条(51 → **52**:mermaid 围栏内确定性语法——坏图此前只能靠肉眼在渲染端发现,实证见专篇);**每种门禁一篇详解(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径)→ `docs/门禁说明/README.md` 索引**;通用机制与整体口径 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + `bom-guard` / `setview-check` / `uinav-selftest`(2026-10-25 道E 那三条:前半句的加钩流水里有它们、逐项枚举里漏了,补上后本行各项相加才等于 51;2026-10-30 又加 `mermaid-syntax` 后此句的"等于"目标数为 52)+ 主机侧单测 **22 根专属钩子**(`-unit-test` 后缀 = 有独立 `files:` 触发面、需要秒级归因的那个子集;2026-10-25 增补 adc-cal / prot-dim / vol-idle-sync / ui-data / meas / run-par 六根)——**这是口径不是缺口**:`test/host/` 实测 47 套带 `run_unit_test.py`(48 个一级目录除 `common`),其余 **25 套**(含 `test/host/ui_sink`、录波三套与屏板链路三套)没有专属钩子,但每次 CI / `scripts/ci_local.py` 都被 `test-coverage` 总闸全量真跑并守基线回退,**失败照样拦**,只是归因落在总闸输出上;**没有专属钩子 ≠ 没被跑**,22 套台账与补钩子的判据 → `docs/门禁说明/host-unit-tests.md` §6 第 4 条。**Lead 裁定 2026-10-27:不补第 23 根**——读「这套跑没跑」去看总闸输出,别数钩子(原写「23 个 / 含 ui-sink 七个」是双重错:既把 22 说成 23,又宣称 ui-sink 有钩子——配置历史里 `ui-sink-unit-test` 从未存在)+ `test-coverage`(**覆盖率总闸**:跑全部 47 套并守基线回退;缺 mscoverage 组件时按用户裁定 **FAIL**、不 skip,2026-10-24)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,登记簿条目「rs485_task 白名单缺口」)+ `generated-fresh`(**生成器幂等性**:把 `tools/menu_gen/gen_menu.py`、中文字库链、`tools/arch_diagram/gen_*.py` 拷进**系统临时目录**重跑,与工作区**逐字节**必须一致——钩子只读、不写仓库也不 stash 别人在飞的改动;实证 `0f7b5a87` 改了模板文字没重跑生成物,接线前实测另有 5 张 `docs/images/` 配图已漂 → 钉成只减不增基线,**业务生成物零豁免面** → `docs/门禁说明/generated-fresh.md`)+ `nested-comment`(**块注释嵌套**:注释体内再出现 /* 会被 ARMCC 报 9-D,且**按包含者数量刷屏**、只在重编译该 TU 时才暴露;本仓诱因就是「在注释里写作用域/通配路径」,改法是写全目录或用尖括号 ;接线当日实扫 403 个 .c/.h,新发 0、存量 2 处(`test/host/common/` 两份假件头)钉只减不增基线 → `docs/门禁说明/nested-comment.md`)+ `skill-size`(**SKILL.md 不超插件写侧上限 65536 字节**:dsh-mnemon 只在写侧校验、加载侧不查,超限技能照常可读却每次「生成草案」被拒、永久卡在「生成中」;另查 `reference/` 指针悬空与 BOM → `docs/门禁说明/skill-size.md`)+ `mermaid-syntax`(**mermaid 围栏语法预检**:` ```mermaid ` 块里只查「错了必渲染失败」三条——图类型头 / `-.` 后直接跟管道(本坑:屏板链路设计说明 §1 坏图靠肉眼在渲染端发现,期间各文档门禁全绿)/ subgraph 与 sequence 块的 `end` 计数配对;零语料空基线、`docs/芯片手册/` 与 doc-links 同排除面 → `docs/门禁说明/mermaid-syntax.md`)+ `mem-budget`(RAM 92% 预算门禁,登记簿条目「缩堆迁 CCM 后半(暂缓)」)+ `font-charset`(UI 字符集差集检查,防缺字白框)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 66 张黄金参考)+ `layer-deps`(**分层方向**:`Drivers/BSP/**` 不得 include `App/**` 的头;存量 3 条基线只减不增(2026-10-25 记录 reader 注入削掉 UI 记录 3 条边,6→3))+ `bsp-err`(**BSP 错误码与超时命名约定**:公开 API 不得拿 `HAL_StatusTypeDef`/`bool` 当错误通道、`*_TIMEOUT` 宏不得取负值、非 void 须写「返回值:」、**返回错误码的函数不得裸丢弃返回值**(须接住或显式 `(void)`;实测编译器与 cppcheck 都不报这类,只有这条会响);约定正文 `Drivers/BSP/bsp_err.h`,存量基线只减不增(2026-10-23 首清点 19 条 → 已还 18;`consume-result` 上线又暴露 37 条存量丢弃 → **现 38 条**))。**提交期实跑 49 根**(2026-10-30 起,前值是 48;三根慢钩子让位的裁定 2026-10-28):`cppcheck` / `test-cppcheck` / `test-coverage` 三根带 `stages: [manual]`——实测合计 ~165 s = 一次带代码提交耗时的三分之二,提交期只跑快的那些;这三根由**远端 CI** 强制(`.gitea/workflows/ci.yml` 的「手动阶段门禁」步,逐根 `--hook-stage manual`)与 `scripts/ci_local.py` 的 manual 段,本地手工复跑 `python -m pre_commit run --all-files --hook-stage manual `(一次只能一个 id) +- 任一失败即拦截,共 **52 个钩子**(**口径 = YAML 解析后的 hook 条目数**:自查命令与「声明 / 文档 / 实跑」三数同源核对见 `docs/门禁说明/README.md` §2 首条——⚠ 直接 grep 配置里的声明行会多算一条**注释掉的**候选钩子(比口径多 1),不是口径;**配置注释里也别复述那个 grep 字面量**,它会让文本计数再虚高 1(2026-10-27 实测踩过);加一条钩子就同批改 AGENTS 与门禁索引两处计数。2026-10-25 道E 连加 `bom-guard` / `setview-check` / `uinav-selftest` 三条,2026-10-26 加 `generated-fresh` 一条,2026-10-27 加 `nested-comment` 一条;2026-10-28 加 `id-check-new` 一条并同批退役 `id-check`(口径 52 → 51:编号门禁换牙——新的只查新增行、零语料,旧的八项全库校验连语料一起移入 `scripts/archive/id_gate/`,手工普查与恢复机器面见 `scripts/archive/id_gate/README.md`);2026-10-29 加 `skill-size` 一条(51 → 52),同日按用户裁定**退役 `id-check-new`**(52 → **51**:只查新增行的编号门禁整体退场,脚本与白名单一起移入 `scripts/archive/id_gate/`,编号形态此后无机器面,留档 `docs/门禁说明/id-check-new.md`);2026-10-30 加 `mermaid-syntax` 一条(51 → **52**:mermaid 围栏内确定性语法——坏图此前只能靠肉眼在渲染端发现,实证见专篇);**每种门禁一篇详解(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径)→ `docs/门禁说明/README.md` 索引**;通用机制与整体口径 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + `bom-guard` / `setview-check` / `uinav-selftest`(2026-10-25 道E 那三条:前半句的加钩流水里有它们、逐项枚举里漏了,补上后本行各项相加才等于 51;2026-10-30 又加 `mermaid-syntax` 后此句的"等于"目标数为 52)+ 主机侧单测 **22 根专属钩子**(`-unit-test` 后缀 = 有独立 `files:` 触发面、需要秒级归因的那个子集;2026-10-25 增补 adc-cal / prot-dim / vol-idle-sync / ui-data / meas / run-par 六根)——**这是口径不是缺口**:`test/host/` 实测 47 套带 `run_unit_test.py`(48 个一级目录除 `common`),其余 **25 套**(含 `test/host/ui_sink`、录波三套与屏板链路三套)没有专属钩子,但每次 CI / `scripts/ci_local.py` 都被 `test-coverage` 总闸全量真跑并守基线回退,**失败照样拦**,只是归因落在总闸输出上;**没有专属钩子 ≠ 没被跑**,22 套台账与补钩子的判据 → `docs/门禁说明/host-unit-tests.md` §6 第 4 条。**Lead 裁定 2026-10-27:不补第 23 根**——读「这套跑没跑」去看总闸输出,别数钩子(原写「23 个 / 含 ui-sink 七个」是双重错:既把 22 说成 23,又宣称 ui-sink 有钩子——配置历史里 `ui-sink-unit-test` 从未存在)+ `test-coverage`(**覆盖率总闸**:跑全部 47 套并守基线回退;缺 mscoverage 组件时按用户裁定 **FAIL**、不 skip,2026-10-24)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,`rs485_task` 白名单缺口)+ `generated-fresh`(**生成器幂等性**:把 `tools/menu_gen/gen_menu.py`、中文字库链、`tools/arch_diagram/gen_*.py` 拷进**系统临时目录**重跑,与工作区**逐字节**必须一致——钩子只读、不写仓库也不 stash 别人在飞的改动;实证 `0f7b5a87` 改了模板文字没重跑生成物,接线前实测另有 5 张 `docs/images/` 配图已漂 → 钉成只减不增基线,**业务生成物零豁免面** → `docs/门禁说明/generated-fresh.md`)+ `nested-comment`(**块注释嵌套**:注释体内再出现 /* 会被 ARMCC 报 9-D,且**按包含者数量刷屏**、只在重编译该 TU 时才暴露;本仓诱因就是「在注释里写作用域/通配路径」,改法是写全目录或用尖括号 ;接线当日实扫 403 个 .c/.h,新发 0、存量 2 处(`test/host/common/` 两份假件头)钉只减不增基线 → `docs/门禁说明/nested-comment.md`)+ `skill-size`(**SKILL.md 不超插件写侧上限 65536 字节**:dsh-mnemon 只在写侧校验、加载侧不查,超限技能照常可读却每次「生成草案」被拒、永久卡在「生成中」;另查 `reference/` 指针悬空与 BOM → `docs/门禁说明/skill-size.md`)+ `mermaid-syntax`(**mermaid 围栏语法预检**:` ```mermaid ` 块里只查「错了必渲染失败」三条——图类型头 / `-.` 后直接跟管道(本坑:屏板链路设计说明 §1 坏图靠肉眼在渲染端发现,期间各文档门禁全绿)/ subgraph 与 sequence 块的 `end` 计数配对;零语料空基线、`docs/芯片手册/` 与 doc-links 同排除面 → `docs/门禁说明/mermaid-syntax.md`)+ `mem-budget`(RAM 92% 预算门禁,内存治理三件套)+ `font-charset`(UI 字符集差集检查,防缺字白框)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 66 张黄金参考)+ `layer-deps`(**分层方向**:`Drivers/BSP/**` 不得 include `App/**` 的头;存量 3 条基线只减不增(2026-10-25 记录 reader 注入削掉 UI 记录 3 条边,6→3))+ `bsp-err`(**BSP 错误码与超时命名约定**:公开 API 不得拿 `HAL_StatusTypeDef`/`bool` 当错误通道、`*_TIMEOUT` 宏不得取负值、非 void 须写「返回值:」、**返回错误码的函数不得裸丢弃返回值**(须接住或显式 `(void)`;实测编译器与 cppcheck 都不报这类,只有这条会响);约定正文 `Drivers/BSP/bsp_err.h`,存量基线只减不增(2026-10-23 首清点 19 条 → 已还 18;`consume-result` 上线又暴露 37 条存量丢弃 → **现 38 条**))。**提交期实跑 49 根**(2026-10-30 起,前值是 48;三根慢钩子让位的裁定 2026-10-28):`cppcheck` / `test-cppcheck` / `test-coverage` 三根带 `stages: [manual]`——实测合计 ~165 s = 一次带代码提交耗时的三分之二,提交期只跑快的那些;这三根由**远端 CI** 强制(`.gitea/workflows/ci.yml` 的「手动阶段门禁」步,逐根 `--hook-stage manual`)与 `scripts/ci_local.py` 的 manual 段,本地手工复跑 `python -m pre_commit run --all-files --hook-stage manual `(一次只能一个 id) - **范围 = 项目代码**:第三方(`Lib/`、`Middlewares/`、CMSIS、HAL、`lftpd`、`dhara`、`MDK-ARM`)排除;`cppcheck`/`coding-standard` 另排除 `test/`,规范检查再排除 CubeMX 生成的 `Src/`/`Inc/`。**`simulator/` 已纳入全部钩子**(2026-10-11)——生成物只靠 `.gitignore` 挡,**不在 `exclude` 里写目录名**(教训见 `docs/代码规范/pre-commit使用说明.md` §5.5) - ⚠ **pre-commit 4.x 已移除 `always: true`**(实测对 `local` 钩子只告警 `Unexpected key(s)` 并跳过)→ 想"总是跑"的钩子**必须让 `files:` 覆盖到所有会触发它的文件**,没有兜底开关 - **改写型钩子(`trailing-whitespace` + `end-of-file-fixer`)豁免 CubeMX/Keil 生成文件**(配置里 YAML 锚点 `&cubemx-generated`);⚠ **只读检查不受影响**:`cppcheck` / 乱码 / `cubemx-survival` / `task-table` / `mem-numbers` 仍覆盖 `Src/`、`Inc/` @@ -139,7 +139,7 @@ - **完整引脚表(含 SD2506 I2C1、SWD、调试口)→ `docs/架构设计/硬件规格与能力边界.md` §2**(权威,V0.1 口径;勿在本文重复抄表) - ⚠ **网名 `AINn` ≠ 板级 `ADCn` ≠ 转换器通道号**(17 路里 13 路置换)→ 取数**必须查** `docs/硬件平台/ADC通道映射说明.md`(TPAFE `buf[2]=IA`/`buf[5]=UN`/`buf[6]=UA`;网名 ADC17=PC4 用 `ADC_CHANNEL_14`,**不是** `ADC_CHANNEL_12`) -- ⚠ **8 路电气量被分给两片转换器是 V0.1 硬件缺陷,不是有意分配**(跨转换器无共同采样触发 → 无同一时刻性、相位不确定)→ V0.1 上**禁止**跨转换器做相位/功率/功率因数/矢量运算;**V0.2 须把 8 路全接 TPAFE**(登记簿条目「双转换器无共同采样触发」) +- ⚠ **8 路电气量被分给两片转换器是 V0.1 硬件缺陷,不是有意分配**(跨转换器无共同采样触发 → 无同一时刻性、相位不确定)→ V0.1 上**禁止**跨转换器做相位/功率/功率因数/矢量运算;**V0.2 须把 8 路全接 TPAFE**(缺陷登记在 `docs/任务规划/登记簿.md` §1) ## 模块约定 @@ -155,14 +155,14 @@ ## 文档与图形 -- **登记簿类文档「完成即销项」**:`docs/任务规划/README.md` 这类待办登记簿,事项修复/关闭后**直接从表中删除该行**(不保留"已消化"行)——结论与证据应已沉淀进对应模块文档/问题记录。销项时必须:① 先核对目标文档确已含完整记录 ② 同步清理其他文档对该编号的引用 ③ 改完跑 `check_doc_links.py --all` + pre-commit。**新条目标识(用户裁定 2026-10-14;2026-10-29 收口为一律不再发号)**:`#` 列填**语义短语**(如 `沉降窗 800ms 上限只留痕`),**不再新增字母+数字编号**——"编号不回收"只写规则却不留痕迹就不可执行(销项删行后仓库里毫无痕迹,2026-10-14 实测就发生过「销项号被重新取走」的撞号事故),语义标识自带唯一性;**存量编号(登记簿 N-x / S-x / T-x 与专项 A-x)已于 2026-10-26 全部转成语义短语**,旧号进 `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`、不得再指;**「数据可信」任务卡号(中文前缀「卡」+ 数字,14 个)已于 2026-10-27 随卡销项整族清退**,换算表 `scripts/archive/id_gate/编号治理历史.md` §9.3——这一族**刻意不进 `id_aliases.json`**:中文前缀不进 check_ids 语料,登记了机器也看不见,**没有机器识别面**,停发只靠规范与评审;**已随销项消失的号永久作废**、不得复用 → `docs/任务规划/README.md` §0 +- **待办「完成即销项」**:任何待办表(`docs/任务规划/登记簿.md` 等)里的事项修复/关闭后**直接从表中删除该行**(不保留"已消化"行)——结论与证据应已沉淀进对应模块文档/问题记录。销项时必须:① 先核对目标文档确已含完整记录 ② 同步清理其他文档对该编号的引用 ③ 改完跑 `check_doc_links.py --all` + pre-commit。**新条目标识(用户裁定 2026-10-14;2026-10-29 收口为一律不再发号)**:`#` 列填**语义短语**(如 `沉降窗 800ms 上限只留痕`),**不再新增字母+数字编号**——"编号不回收"只写规则却不留痕迹就不可执行(销项删行后仓库里毫无痕迹,2026-10-14 实测就发生过「销项号被重新取走」的撞号事故),语义标识自带唯一性;**存量编号(登记簿 N-x / S-x / T-x 与专项 A-x)已于 2026-10-26 全部转成语义短语**,旧号进 `scripts/archive/id_gate/id_aliases.json` 标 `retired-to-phrase`、不得再指;**「数据可信」任务卡号(中文前缀「卡」+ 数字,14 个)已于 2026-10-27 随卡销项整族清退**,换算表 `scripts/archive/id_gate/编号治理历史.md` §9.3——这一族**刻意不进 `id_aliases.json`**:中文前缀不进 check_ids 语料,登记了机器也看不见,**没有机器识别面**,停发只靠规范与评审;**已随销项消失的号永久作废**、不得复用 → `docs/任务规划/README.md` §0 - 图形走 **`draw-diagram` skill**:精确布局图用 `tools/arch_diagram/gen_*.py` 生成器(产物放 `docs/images/`,**脚本与产物同一笔提交**:改生成器没重跑,下一个碰巧重跑的人会看到一段「不是我改的」diff——已机械化 `generated-fresh`,重跑到临时目录逐字节比对 → `docs/文档规范.md` §4.4);拓扑图用 Mermaid;**勿手绘 ASCII 框图**。文件引用关系图走 `tools/refgraph`(`& 'tools\refgraph\gen_refgraph.bat'`) - **改名 / 挪目录一律走 `scripts/rename_ref.py`(先 dry-run,确认后 `--apply`)**:`git mv` + 自动改写全库引用(反引号引用 / Markdown 链接 / 图片 `../` 层级换算 / `#include` / `uvprojx` `` / `CMakeLists.txt`),落盘后自动跑 `check_doc_links --all` 复核——手工扫引用既慢又漏(一次改名历史上波及 10~30 文件)。引用章节用「`路径.md` §N.M」**紧邻写法**(`doc-links` 校验编号是否还在:紧邻/裸名/前缀/别名/自引用**全部拦提交**(钩子带 `--sections-strict`);每次跑打印「可判定比例」,`--section-todo` 出待改清单,昵称歧义就登记 `scripts/section_aliases.json` 或写清楚)→ `docs/文档规范.md` §3.5 / §3.6。**编号改名走 `scripts/rename_ids.py`**(映射表驱动、**显式 scope**、干跑默认、自动写 `scripts/archive/id_gate/id_aliases.json` 的 scoped 旧号→新号条目;`[示例]`/`[计划]` 行与变更记录表不改写;**绝不全局查找替换**——同一裸形字面量可能同时属多个族,全局替换等于造新撞号,实测 `S3` 三义) - 文档写作规范(编码/BOM/链接/表格/一致性钩子)→ `docs/文档规范.md`;全量索引与推荐阅读顺序 → `docs/README.md` ## 边界(Ask first / Never) -**Ask first**(须用户明确指示才做,均不是任何任务的隐含步骤):`git commit` / `git push`(构建与测试通过后停下等指令)· 开 `ENABLE_DESTRUCTIVE_TESTS` 跑破坏性套件(持久代价 → 模块约定)· CubeMX 重生成(→ `cubemx-regen` skill)· 登记簿删行销项(→ 文档与图形)· 建任务/抬栈/加大缓冲(先跑预算脚本 → 平台约束) +**Ask first**(须用户明确指示才做,均不是任何任务的隐含步骤):`git commit` / `git push`(构建与测试通过后停下等指令)· 开 `ENABLE_DESTRUCTIVE_TESTS` 跑破坏性套件(持久代价 → 模块约定)· CubeMX 重生成(→ `cubemx-regen` skill)· 待办表删行销项(→ 文档与图形)· 建任务/抬栈/加大缓冲(先跑预算脚本 → 平台约束) **Never**(任何任务):用 `Get-Content`/`Set-Content`/`cmd` 重写含中文文件、用 `git checkout`/`reset --hard` 丢弃未提交工作(→ 铁律)· 在 `USER CODE` 区之外写定制代码、自研代码写 C 库堆分配(→ 平台约束)· 非 defaultTask 直接触碰配置引擎、非 netTask 直接碰 CH395F 驱动(→ 模块约定)· 提交 UV4 抖动的 `*.uvprojx`、提交 `.mnemon/`(记忆工具本地状态,已 `.gitignore`) @@ -186,7 +186,7 @@ | 串口助手 | **`serial-assistant` skill**(命令/判据/陷阱,用到自动加载)、`docs/测试说明/测试工具/串口助手使用指南.md`、`串口助手设计说明.md` | | UI 架构 / 模拟器 / UI 自动化回归 | **`lvgl-simulator` skill**(构建/自检/报错速查,用到自动加载)、`docs/UI设计/UI_设计架构.md`、`LVGL模拟器部署与使用说明.md`、`UI_自动化测试流程.md`;UI 改动回归走 **`ui-verify` skill** | | 板端进页看图 / 注键 / 认屏 / 直开页(真机 UI 交互) | **`board-ui-nav` skill**(唯一入口,**写任何注键脚本之前先读**)、`scripts/board_ui_nav.py`(STATUS 身份回读 + `--where`/`--goto`),`UI_自动化测试流程.md` §7 | -| 待办与审计发现登记簿 | `docs/任务规划/README.md` | +| 待办与推进顺序 | `docs/任务规划/README.md` | | 多任务并行开发(开空间 / 合并回收 / 台架与构建排队);**DSH worktree 插件的仓内树怎么接上**(`.dsh-worktrees/` 缺 `.venv`、`plugin adopt`、锁归属 `pw:`) | **`task-worktree` skill**(`@task` 仅为文档别名非可执行命令,显式调用 `/task-worktree`,用到自动加载;插件桥 → 其 F 节)、`docs/环境与部署/并行任务工作树方案.md` §3.4 | | 换机 / 工具路径环境变量 | `docs/环境与部署/` | | 远程 CI(Gitea Actions,**只跑本机一台 runner**) | [`docs/CI/README.md`](docs/CI/README.md) | diff --git a/App/algo/README.md b/App/algo/README.md index 25b2524a..12215a57 100644 --- a/App/algo/README.md +++ b/App/algo/README.md @@ -194,7 +194,7 @@ ADC 引脚电压 V)+ `adc_health_rail_watch()` ×9(「采样通道自检」 - 模拟器侧分两类(Lead 裁定 2026-10-29):`wave_ring.c` 与 `wave_store.c` **真实参与** `simulator/CMakeLists.txt`——回放页要在模拟器里出真波形,两份又零平台依赖,与「双端共享核心、不造 第二真相」同一条口径,故**不进** `SIM_EXEMPT`;其余九个采集链文件(UI 模拟器不跑采集链路)仍登记在 - `scripts/check_registration.py` 的 `SIM_EXEMPT`(附理由),`registration-check` 钩子反向校验(登记簿条目「rs485_task 白名单缺口」)。 + `scripts/check_registration.py` 的 `SIM_EXEMPT`(附理由),`registration-check` 钩子反向校验(`rs485_task` 白名单缺口)。 ### 4.2 主机侧纯逻辑单测——生产源文件以 `#include` 原样纳入 diff --git a/App/app/app_cfg.h b/App/app/app_cfg.h index 58e6540f..524c0a95 100644 --- a/App/app/app_cfg.h +++ b/App/app/app_cfg.h @@ -7,7 +7,7 @@ * 修改记录: * v1.0 2026-07-19 王建锋 创建初始版本 * v1.1 2026-10-04 王建锋 如实标注三个 APP_*_ENABLE 为"未接线占位"(全库零消费点) - * v1.2 2026-10-22 王建锋 收口(登记簿 C5):删除 4 个零消费点的宏 + * v1.2 2026-10-22 王建锋 收口:删除 4 个零消费点的宏 * (APP_NET_ENABLE / APP_ADC_ENABLE / APP_RS485_ENABLE / * APP_SYS_TIME_SRC)。留"看起来能裁剪、其实不生效"的宏比不留更糟: * 评审者会误信模块可裁剪,而关掉它们不会产生任何编译期效果。 diff --git a/App/protocol/iec104/iec104_asdu.h b/App/protocol/iec104/iec104_asdu.h index b51c3b4e..57a6b620 100644 --- a/App/protocol/iec104/iec104_asdu.h +++ b/App/protocol/iec104/iec104_asdu.h @@ -10,7 +10,7 @@ * 帧结构(本层只管 ASDU,APCI 6 字节头归 iec104_link): * [type 1B][vsq 1B][cot 2B][ca 2B]( [ioa 3B][元素...] )*n * 多信息体地址对象(SQ=0)每对象带独立 IOA;顺序对象(SQ=1)单 IOA + n 元素。 - * 创建日期:2026-10-12(B4,W1 功能主线,登记簿见 docs/任务规划/) + * 创建日期:2026-10-12(B4,W1 功能主线) */ #ifndef IEC104_ASDU_H #define IEC104_ASDU_H diff --git a/App/protocol/iec104/iec104_comm.h b/App/protocol/iec104/iec104_comm.h index bf3c0a58..f073eaee 100644 --- a/App/protocol/iec104/iec104_comm.h +++ b/App/protocol/iec104/iec104_comm.h @@ -15,7 +15,7 @@ * netTask/uiTask 不得直接触碰引擎);getter = 任意消费上下文(u16 * 半字对齐读天然原子,重载瞬间最坏 = 单字段新旧值之一);setter = * UI 保存交接路(task-9,net_cfg_set_* 先例)。 - * 生效语义:**改后重启生效**(通讯设置页验收口径,见 `docs/任务规划/登记簿.md` §7)—— + * 生效语义:**改后重启生效**(口径见 `docs/子系统设计/网络配置说明.md` §3.6)—— * iec104Task 启动时取一次 getter 填 link cfg;端口另在下次重 bind * (拆链/网络代次重建)自然生效,不必整机重启。不挂段回调、不新增 * 事件位、不走 SYS_EVT_NET_RECONFIG(网络代次链语义不同;且 CH395F diff --git a/App/task/rs485_task.c b/App/task/rs485_task.c index 8572aed6..a8153958 100644 --- a/App/task/rs485_task.c +++ b/App/task/rs485_task.c @@ -2,7 +2,7 @@ * 模块名称:RS485 Communication Task * 模块功能:RS-485 轮询收发、协议帧解析与响应 * 状态说明:**预留桩(未启用)**——采集/协议链路尚未实现,产品定义未定 - * (见 docs/任务规划/暂缓-RS485.md,B2 暂缓)。当前 init/func 为空实现, + * (整簇冻结与重启门禁见 docs/产品需求/产品需求设计文档.md §5.10)。当前 init/func 为空实现, * 不收发、不解析。 * 适用平台:STM32F407ZGTx * 作者:王建锋 diff --git a/App/task/ui_task.c b/App/task/ui_task.c index 1909a739..76861d41 100644 --- a/App/task/ui_task.c +++ b/App/task/ui_task.c @@ -25,15 +25,16 @@ * (2026-10-25 实测 bit4 8 连击、uisn=154ms 仍在段内; * 按位连击判据 = docs/子系统设计/看门狗设计说明.md §5.3)。 * 单个往返自身仍无上界——该上界与彻底解耦(事件驱动 - * accept)归登记簿「net 层跨上下文收口」(批 3),本票只做心跳续命。 + * accept)随「net 层跨上下文收口」后续评估(该波已于 2026-11-06 闭环), + * 本票只做心跳续命。 * v1.5 2026-10-26 DTU 项目组 道F task-3 装置维护三页的执行侧:新增 * ui_data_maint_ops_t 六件适配(时钟=写+回读 RTC、 * 复归=prot_elm_request_reset、清除=syslog_request_clear * /clear_state 直通)并在 ui_menu_init 之前注入;记录 * reader 的 2 条 if 链改成 7 条映射表 s_log_map,并加 * 编译期守卫把 UI_W_REC_LOG_* == syslog_id_t 枚举序钉死 - * v1.6 2026-11-02 DTU 项目组 修复「回放页段表枚举恒空」第一幕(登记簿同名 - * 条目 + docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3): + * v1.6 2026-11-02 DTU 项目组 修复「回放页段表枚举恒空」第一幕(docs/子系统设计/故障录波设计说明.md §10 + + * docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3): * ui_task_wave_scan 失败不再无条件钉 s_wave_scanned—— * opendir/readdir 失败本轮返 -1(卷忙语义),下一次进页/ * 按键自然重试;失败分支与「FR_OK 零条目」补带 FR 码留痕 @@ -457,8 +458,8 @@ static uint8_t s_wave_buf[256u]; /* 读窗:数据区流式 256B/次 * 函数说明:目录不存在(FR_NO_PATH,从未录过波)与目录空都归「0 段」并钉表, * 不是错误(设计原口径);其余 f_opendir/f_readdir 失败一律不钉表 * (v1.6:原实现失败也无条件置 s_wave_scanned=1,卷忙 / FR_DENIED - * 一类失败被钉成「0 段」假空态直到下一次 manual_req,登记簿 - * 「回放页段表枚举恒空」处置方向 = 失败不钉表、下键重试,与 + * 一类失败被钉成「0 段」假空态直到下一次 manual_req,故障录波设计说明 §10 + * 的处置方向 = 失败不钉表、下键重试,与 * soe_store 读者同纪律)。失败留痕带 FR 码,板级判读表(FR_DENIED * → 锁纪律;FR_NOT_READY → 挂载;FR_OK 但零条目 → readdir 与卷状态 * 交互)见 docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3。 diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index d06ff055..4b55723d 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -1117,7 +1117,7 @@ int net_bind(int sockfd, const struct net_sockaddr *addr, int addrlen) { * 函数说明:原逻辑内联在 net_bind 的 port==0 分支;UDP 队列化后绑定动作挪进 * netTask 执行,两处都要用同一游标,故抽成函数(同一事实只在一处)。 * 与抽取前一致:**不做**"是否已被其他 Socket 占用"检查(8 条 fd 的 - * 并发绑定组合由调用方保证,登记簿无此项待办)。 + * 并发绑定组合由调用方保证,不另做占用检查)。 */ uint16_t net_dynamic_port_next(void) { /* 本次分配值 */ diff --git a/Drivers/BSP/TPAFE5160/README.md b/Drivers/BSP/TPAFE5160/README.md index f56081b8..afea06a9 100644 --- a/Drivers/BSP/TPAFE5160/README.md +++ b/Drivers/BSP/TPAFE5160/README.md @@ -23,7 +23,7 @@ - 采样数据的消费者 `App/task/adc_task.c` **已实现**(ADC 采集链路,2026-10-10:`tpafe5160_snapshot()` 原子取数 + 帧统计;`adcTask` 在 `Src/freertos.c` 的 `USER CODE` 区创建)。**v2.2(2026-10-10)**:采样节拍改由定时器更新中断硬件触发,本任务退化为纯消费者;**v2.8(2026-10-10)**:节拍源改 TIM3(同时经 TRGO 触发 ADC1 + DMA),STM32 侧改为消费 DMA 乒乓缓冲,单拍耗时 122 µs → **8 µs** - CONVST→BUSY→RD 三段时序对**建立/保持时间敏感**,改动需对照芯片手册 - ⚠️ 本项目 ADC 相关功能**新增任务/缓冲前须核算 RAM**(见 `docs/内存管理/`);接消费者前的强制门禁见根 `AGENTS.md`「接 ADC / RS-485 消费者前的强制门禁」 -- ⚠️ **通道语义不是通道号**:`buf[i]` 对应哪个电气量必须查 `docs/硬件平台/ADC通道映射说明.md`(`buf[2]=IA`、`buf[5]=UN`、`buf[6]=UA`);V0.1 上 8 路电气量分属两片转换器属硬件缺陷(登记簿条目「双转换器无共同采样触发」)→ **禁止**跨转换器做相位/功率/功率因数类运算 +- ⚠️ **通道语义不是通道号**:`buf[i]` 对应哪个电气量必须查 `docs/硬件平台/ADC通道映射说明.md`(`buf[2]=IA`、`buf[5]=UN`、`buf[6]=UA`);V0.1 上 8 路电气量分属两片转换器属硬件缺陷(`docs/任务规划/登记簿.md` §1)→ **禁止**跨转换器做相位/功率/功率因数类运算 ## 已知问题 diff --git a/Drivers/BSP/UI/ui_net_sink.c b/Drivers/BSP/UI/ui_net_sink.c index 72ca5d33..cc9b8e8f 100644 --- a/Drivers/BSP/UI/ui_net_sink.c +++ b/Drivers/BSP/UI/ui_net_sink.c @@ -35,7 +35,7 @@ * (accept / recv_nb / send / close / 重建三件套)返回点 * 调用——风暴期单轮多往返串成 UI 心跳缺口(实测 bit4 * 8 连击、uisn=154ms 仍在段内样本),往返本身不动 - * (语义不变,上界收口为登记簿批 3 事项),心跳 + * (语义不变),心跳 * 在往返边界续命。钩子未注册 = 零行为变化(模拟器/黄金 * 回归不注册)。判读与设计口径见 * docs/UI设计/UI_设计架构.md §5.8 diff --git a/Drivers/BSP/UI/ui_net_sink.h b/Drivers/BSP/UI/ui_net_sink.h index 4520c738..bd9c9dd0 100644 --- a/Drivers/BSP/UI/ui_net_sink.h +++ b/Drivers/BSP/UI/ui_net_sink.h @@ -95,7 +95,7 @@ void ui_net_sink_poll(void); * 重建三件套)返回处调用钩子。动因:netTask 重建风暴期,单轮内多个 * 往返串行排队,把宿主(uiTask,IWDG 必需位)的心跳间隔拖过 800ms * (2026-10-25 台架实测 bit4 单任务 8 连击窗、uisn=154ms 仍在段内); - * 往返时长本身不改(上界收口为登记簿批 3 事项),但心跳在每个 + * 往返时长本身不改,但心跳在每个 * 往返边界续命——单任务停摆判据(按位连击,docs/子系统设计/看门狗设计说明.md * §5.3)只应 * 抓真挂死,不该抓「多个都回来了但各自偏慢的往返之和」。 diff --git a/Drivers/BSP/UI/ui_page_comm.c b/Drivers/BSP/UI/ui_page_comm.c index 2bb76631..31e51ed2 100644 --- a/Drivers/BSP/UI/ui_page_comm.c +++ b/Drivers/BSP/UI/ui_page_comm.c @@ -23,7 +23,7 @@ * 修改记录: * v1.0 2026-10-27 DTU 项目组 创建(道G task-9;验收口径 = 本页须 * 「重启即生效 + 104 侧读回真值 + 段数键数上限核对」, - * 台架判据见 docs/任务规划/登记簿.md §7「通讯设置页真机判据」与 + * 台架判据见 docs/子系统设计/网络配置说明.md §3.6 与 * IEC104上行设计说明.md §8) */ /* 头文件包含区 */ diff --git a/README.md b/README.md index 4d9c7e1f..d1ba4b0f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ | USART1 | 串口 | PA9 TX, PA10 RX | 115200bps 调试串口 | | SD2506 RTC | I2C1 | PB6 SCL, PB7 SDA | 墙钟基准与日志时间戳 | | 6x LED | GPIO | PC5, PB0, PB1, PB2, PF11, PF12 | 低电平点亮 | -| RS-485 | UART4 | PC10 TX, PC11 RX, PA15 DE | 半双工通信(暂缓,见 `docs/任务规划/暂缓-RS485.md`) | +| RS-485 | UART4 | PC10 TX, PC11 RX, PA15 DE | 半双工通信(暂缓,见 `docs/产品需求/产品需求设计文档.md` §5.10) | | SWD | — | PA13 SWDIO, PA14 SWCLK | 调试口 CN2(XH-3A) | ## 项目架构 @@ -178,7 +178,7 @@ STM32F4-Base/ │ └── latency_peer.py # 链路时延 PC 对端 ├── docs/ # 项目文档(全量索引见 docs/README.md) │ ├── README.md # 文档索引:目录结构 + 推荐阅读顺序 + 全量清单 -│ ├── 任务规划/ # 统一待办登记簿(README 排序权威 + 拆分文件) +│ ├── 任务规划/ # 全项目推进顺序 + 硬件缺陷登记簿 │ ├── 架构设计/ # 项目架构总览 / 存储架构 / 启动顺序 / 配图流程 / 引用关系图 │ ├── 子系统设计/ # 配置 / 网络 / 墙钟 / 日志 / 运行自检记录 设计说明 │ ├── 网络/ # BSD Socket API 使用指南 + 内部函数调用关系 diff --git a/docs/CI/远程CI完整指南.md b/docs/CI/远程CI完整指南.md index c753b537..905201b2 100644 --- a/docs/CI/远程CI完整指南.md +++ b/docs/CI/远程CI完整指南.md @@ -1213,7 +1213,7 @@ runner 的日志走 **stderr**,于是上面两个日志文件都栽在这两 该步的 `$hooks` 列表,否则只声明不执行); - **`/keil-build` / 板端测试套件 / 主机侧回归**:永远留在本地,不要往 CI 加(需 Keil 授权与真机); - **runner 长时间不可用**时:CI 只是"多一道网",**提交前的本地 `ci_local.py` 仍是 静态门禁的唯一保障**, - 不能因"已经配了 CI"放宽(见 [docs/任务规划/登记簿.md](../任务规划/登记簿.md) 的条目「CI 远端闭环未验证」)。 + 不能因"已经配了 CI"放宽(理由见本文 §0 仓库状态行)。 --- diff --git a/docs/README.md b/docs/README.md index 482edc23..c8e4ae34 100644 --- a/docs/README.md +++ b/docs/README.md @@ -11,7 +11,7 @@ ``` docs/ ├── README.md 本索引(阅读顺序 + 全量清单) -├── 任务规划/ 统一待办(README 单一入口 + 2 个职责文件) +├── 任务规划/ 全项目顺序 + 硬件缺陷登记簿 ├── 产品需求/ 产品需求设计文档(需求基线)+ 参考产品复刻明细(逐项差额) ├── 架构设计/ 全局架构与设计方法论(含 软件架构与运行时规格 / 硬件规格与能力边界:位表与引脚权威) ├── 子系统设计/ 各功能子系统的设计说明 @@ -31,7 +31,7 @@ docs/ ``` > ⚠️ `docs/芯片手册/`(约 120 MB / 1754 张图)为**只读外部输入资料**,与代码演进无关; -> 后续拆分独立仓库或降采样(登记簿条目「仓库体积膨胀观察」,已决策暂不处理)。 +> 后续拆分独立仓库或降采样(仓库膨胀观察项,已决策暂不处理)。 --- @@ -54,7 +54,7 @@ docs/ - **应用/驱动开发** → §4 架构设计 → §5 子系统设计 → §7 问题记录(**改驱动前必读对应 Trap Records**) - **测试/验证** → §6 测试说明 → §9.2 环境与部署 - **UI 开发** → §8 UI 设计 → §6 测试说明(串口助手、UI 自动化测试流程) -- **接手/评审** → §9.1 评审报告 → §9.3 任务规划(统一待办登记簿,见 `任务规划/README.md`) +- **接手/评审** → §9.1 评审报告 → §9.3 任务规划(全项目顺序,见 `任务规划/README.md`) --- @@ -207,7 +207,7 @@ docs/ | [`RAM使用分析与优化方案.md`](内存管理/RAM使用分析与优化方案.md) | **内存主文档**:占用分析、优化方案、定栈规则 | | [`内存内容分配策略.md`](内存管理/内存内容分配策略.md) | 各内存区(SRAM/CCM)的分配策略 | | [`存储栈RAM优化调研.md`](内存管理/存储栈RAM优化调研.md) | 存储栈 RAM 优化调研与结论 | -| [`RAM预算台账.md`](内存管理/RAM预算台账.md) | **预算台账**:子系统配额、CCM 分配、趋势基线与 92% 门禁(登记簿条目「缩堆迁 CCM 后半(暂缓)」,2026-10-12) | +| [`RAM预算台账.md`](内存管理/RAM预算台账.md) | **预算台账**:子系统配额、CCM 分配、趋势基线与 92% 门禁(内存治理三件套,2026-10-12) | | `data/` | `ram_report_*.md` / `stack_report_*.md` 快照数据(由 `scripts/` 生成) | ### 7.3 问题记录(**改驱动前必读**) @@ -247,7 +247,7 @@ docs/ > 体系层评审报告《项目审查与优化建议报告》(原在 `问题记录/`)已于 **2026-10-25 删除**—— > 大部分内容已闭环,留着的只有历史快照与重复清单。结论的去处: -> 未闭环项 → [`任务规划/登记簿.md`](任务规划/登记簿.md);内存与 Flash 结论(含整簇暂缓的**重开条件**) +> 未闭环的设计约束 → 各模块文档「已知限制/重开条件」节;内存与 Flash 结论(含整簇暂缓的**重开条件**) > → [`内存管理/RAM使用分析与优化方案.md`](内存管理/RAM使用分析与优化方案.md) §2.5 / §2.6.4 / §4; > UI 侧硬约束 → [`UI设计/UI_设计架构.md`](UI设计/UI_设计架构.md) §1.4; > 六个自有编号族(属主文档已删的那批)→ `scripts/archive/id_gate/编号治理历史.md` §4.5(只能删号留事实,别再引用那些号)。 @@ -263,7 +263,7 @@ docs/ | 位置 | 内容 | |---|---| -| [`任务规划/`](任务规划/README.md) | **统一待办入口(3 个文件)**:`README.md` = 现在做什么与全项目顺序;`登记簿.md` = 全部待办、外部窗口与长期观察(UI 补齐已于 2026-11-06 整体销项,页面口径归 `docs/UI设计/内容页架构.md` §7.1 与 `菜单页面设计.md` §3.9,原执行清单文件已删除;采集数据可信度的设计口径与台阶图归 `docs/硬件平台/ADC通道映射说明.md` §9 与 `docs/算法/采集与算法层设计说明.md` §13);`暂缓-RS485.md` = 暂缓专项(`测试与架构专项.md` 已删除 2026-10-28,未闭环约束并入 `暂缓-RS485.md`;`屏板链路.md` 已完成,转为 `子系统设计/屏板链路设计说明.md` 后删除)。完成即删,重复内容只保留一个归属 | +| [`任务规划/`](任务规划/README.md) | **两个文件**:`README.md` = 全项目推进顺序(唯一权威);`登记簿.md` = V0.1 硬件缺陷 → V0.2 改版要求。其余待办跟着所属模块走(各文档「已知限制 / 重开条件」节):采集数据可信度 → `docs/算法/采集与算法层设计说明.md` §13、台阶图 → `docs/硬件平台/ADC通道映射说明.md` §9、RS-485 → `docs/产品需求/产品需求设计文档.md` §5.10 | | `硬件平台/` | 网表详细分析报告与语义图(V0.0 / V0.1);**[`ADC通道映射说明.md`](硬件平台/ADC通道映射说明.md)——V0.1 十七路 ADC 语义/网名/通道号权威映射表(固件取数、UI 显示、自检注入以此为准),含 §7 链路四段口径、§8 注入实测记录与 §9 数据可信五级台阶/波次退出判据** | | `芯片手册/` | 外部芯片数据手册转录(CH395F / GD5F2GQ5UE / SD2506 / TPAFE5160 / RTL8305NBI 等) | | `images/` | 文档技术配图(`.svg` 产物,由 `tools/arch_diagram/`、`tools/refgraph/` 生成) | @@ -298,4 +298,4 @@ docs/ | ~~缺一致性门禁~~ | — | ✅ 已落地(2026-09-25/26,文档门禁三档齐):`scripts/check_doc_links.py`(存在性)+ `scripts/gen_task_table.py`(数值)+ `scripts/check_mem_numbers.py`(体积),接入 pre-commit `doc-links` / `task-table` / `mem-numbers` 钩子 | | ~~`docs/文档规范.md` 未创建~~ | — | ✅ 已创建(2026-09-25):[`文档规范.md`](文档规范.md) | -> 未闭环的文档类问题**只剩仓库膨胀**(登记簿条目「仓库体积膨胀观察」,已决策暂不处理)。 +> 未闭环的文档类问题**只剩仓库膨胀**(仓库膨胀观察项,已决策暂不处理)。 diff --git a/docs/UI设计/UI_设计架构.md b/docs/UI设计/UI_设计架构.md index 2d5e4f8a..701bcf32 100644 --- a/docs/UI设计/UI_设计架构.md +++ b/docs/UI设计/UI_设计架构.md @@ -276,8 +276,7 @@ ENTER/→ 进子框: - **处置(本票 = 心跳面)**:`ui_net_sink_set_beat_cb()` 回调注入——sink 在每次 accept / recv_nb / send / close / 重建三件套的**返回处**调用钩子,uiTask 注册 `task_wd_beat(TASK_WD_UI)`。效果 = 心跳间隔从「整轮往返之和」收敛到「单个往返」; - 只要每次往返都会回来,UI 就不该被记停摆。往返本身**不改**(有界化/请求序号 = - `docs/任务规划/README.md` 的跨上下文收口条目,批 3;§11.6 否决过的 + 只要每次往返都会回来,UI 就不该被记停摆。往返本身**不改**(有界化/请求序号 = 已闭环的 net 层跨上下文收口项;§11.6 否决过的 「给 net_* 裸加超时」不重演)。 - **分层**:Drivers/BSP 不得 include App 头(layer-deps),故心跳经回调注入而非直调; 钩子内只做置位类动作、不阻塞(契约写在 `Drivers/BSP/UI/ui_net_sink.h`)。 diff --git a/docs/UI设计/菜单页面设计.md b/docs/UI设计/菜单页面设计.md index bb3d4204..42ff496d 100644 --- a/docs/UI设计/菜单页面设计.md +++ b/docs/UI设计/菜单页面设计.md @@ -432,7 +432,7 @@ python tools/menu_gen/gen_menu.py ### 3.9 节点数与已绑叶数口径(复核命令) -改菜单树前先能自己数清四个数,别凭印象:**当前 43 节点行 / 34 叶 / 已绑 31 叶 / 未绑 3 叶**(未绑 = 遥信类型、遥信防抖、双点遥信,V0.1 无开入硬件,重开条件见 `docs/任务规划/登记簿.md` §8)。 +改菜单树前先能自己数清四个数,别凭印象:**当前 43 节点行 / 34 叶 / 已绑 31 叶 / 未绑 3 叶**(未绑 = 遥信类型、遥信防抖、双点遥信,V0.1 无开入硬件,重开条件 = 开入开出独立立项,见 `docs/架构设计/硬件规格与能力边界.md` H3)。 1. **节点行** = `ui_menu_tree.txt` 里非空、非 `#` 开头的行(含根「主界面」)。 2. **叶** = 其后不再出现更深缩进的后继行(缩进即层级,每级 2 空格);等价于生成物 `ui_menu_tab_has_children(node) == false`。菜单节点 = 有更深缩进后继者。 diff --git a/docs/UI设计/页面补齐规划.md b/docs/UI设计/页面补齐规划.md index c193881e..3edfbd0b 100644 --- a/docs/UI设计/页面补齐规划.md +++ b/docs/UI设计/页面补齐规划.md @@ -3,7 +3,7 @@ > **定位**:盘清当时 42 节点菜单里**还没有内容页的 27 个叶子**(节点数现值 43 = 9 菜单 + 34 叶, > 2026-10-29 录波道加「录波回放」叶后升级;本文其余数字是 2026-10-23 立项快照,按 §1 的「完成即冻结」不回改),按"数据是否就绪 + 页面形态"归并成可施工的包,给出分批顺序与每页规格。 > **前置阅读**:`docs/UI设计/内容页架构.md`(框架机制与新增页面六步)、`docs/UI设计/菜单页面设计.md`(菜单树与几何)、`docs/UI设计/UI_自动化测试流程.md`(像素回归门禁)。 -> **不重复登记**:页面级待办落地时按语义标识进 `docs/任务规划/登记簿.md`;本文只出规划与规格。 +> **不重复登记**:页面级规格写进本文与 `docs/UI设计/内容页架构.md`;顺序归 `docs/任务规划/README.md` §2。 > **逐页细化**:每页显示哪些行、数据从哪来、要改哪些代码,见 `docs/UI设计/页面扩充详细方案.md`(本文的落地细化版)。 --- @@ -92,7 +92,7 @@ **统计(2026-10-25 复核)**:本表 27 叶中 **6 叶已落地**(遥信量 / 查看 4 页 / SOE),剩 21 叶 = 数据现成 **8** 项(整定 4 + 时钟 + 复归 + 死区 + 系数)· 需新数据层 **2** 项(清除记录 / 通讯设置)· 数据源不存在 **11** 项(遥信 3 + 手动录波 + SNTP + 记录 5 + 运行报告)。**逐页形态与数据源只看本表,排期不进本文**——当时的执行清单文件已于 2026-11-09 随 UI 补齐整体销项删除,页面口径现归 `docs/UI设计/内容页架构.md` §7.1。 -**2026-10-28 复核**:本表 27 叶中 **22 叶已落地**(本批 +6:记录 5 页与运行报告,见 `docs/任务规划/登记簿.md` §7);未落地的 5 叶 = 遥信类型 / 遥信防抖 / 双点遥信(无开入硬件)+ 手动录波(无录波模块)+ SNTP设置(产品口径未定),取舍与重开条件见 `docs/任务规划/登记簿.md` §8。口径闭合:本表 22 叶 + 立项前就已绑定、不在本表内的 6 叶(装置信息 / 交流量 / 直流量 / 网口设置 / 自检记录 / 运行记录)= 现值已绑 28 叶(= UI_PAGE_MAP_COUNT);本表未落地 5 叶 = 菜单树未绑 5 叶(33 − 28)。复核方法:按缩进判叶子(有更深缩进后继者即非叶子),再按行内 #page= 数已绑(完整命令见 `docs/UI设计/菜单页面设计.md` §3.9)。**2026-10-29 补充**:「手动录波」已随故障录波独立立项(docs/子系统设计/故障录波设计说明.md;原卡片登记簿 2026-10-30 销项并入该文 §10),上面那行数字仍是 2026-10-28 当日复核值,未随立项改动。 +**2026-10-28 复核**:本表 27 叶中 **22 叶已落地**(本批 +6:记录 5 页与运行报告);未落地的 5 叶 = 遥信类型 / 遥信防抖 / 双点遥信(无开入硬件)+ 手动录波(无录波模块)+ SNTP设置(产品口径未定),重开条件见 `docs/架构设计/硬件规格与能力边界.md` H3 与各模块文档。口径闭合:本表 22 叶 + 立项前就已绑定、不在本表内的 6 叶(装置信息 / 交流量 / 直流量 / 网口设置 / 自检记录 / 运行记录)= 现值已绑 28 叶(= UI_PAGE_MAP_COUNT);本表未落地 5 叶 = 菜单树未绑 5 叶(33 − 28)。复核方法:按缩进判叶子(有更深缩进后继者即非叶子),再按行内 #page= 数已绑(完整命令见 `docs/UI设计/菜单页面设计.md` §3.9)。**2026-10-29 补充**:「手动录波」已随故障录波独立立项(docs/子系统设计/故障录波设计说明.md;原卡片登记簿 2026-10-30 销项并入该文 §10),上面那行数字仍是 2026-10-28 当日复核值,未随立项改动。 **2026-10-29 二补(录波 UI 道落地)**:本表「手动录波」转已落地(23 叶);菜单树另新增「录波回放」叶(node 43,不在本表立项快照内)——现值 43 节点 / 34 叶 / 已绑 30 / 未绑 4(= 遥信 3 + SNTP 1,UI_PAGE_MAP_COUNT = 30),口径复核方法与上一段相同 **2026-11-04 复核(板端 SNTP 接入立项,#57 调研结论)**:本表「SNTP设置」转已落地(24 叶)——`ui_page_sntp.c` 绑 `#page=sntp`,[sntp] 段经 `net_cfg_load` 注册、SNTP 客户端在 timeSyncTask 轮询(`App/sync/time_sntp.c`);现值 43 节点 / 34 叶 / 已绑 31 / 未绑 3(= 遥信 3,UI_PAGE_MAP_COUNT = 31),口径复核方法与上一段相同 diff --git a/docs/产品需求/产品需求设计文档.md b/docs/产品需求/产品需求设计文档.md index 20a8a892..5e6e8693 100644 --- a/docs/产品需求/产品需求设计文档.md +++ b/docs/产品需求/产品需求设计文档.md @@ -34,7 +34,7 @@ - 运行时架构(分层/任务/就绪位/启动时序)→ [`../架构设计/软件架构与运行时规格.md`](../架构设计/软件架构与运行时规格.md); - 硬件规格与能力边界(引脚/硬件边界)→ [`../架构设计/硬件规格与能力边界.md`](../架构设计/硬件规格与能力边界.md); - 参考产品能力基线与复刻逐项明细 → [`参考产品复刻明细.md`](参考产品复刻明细.md); -- 测试用例步骤 → `docs/测试说明/`;未闭环事项逐条跟踪 → [`docs/任务规划/README.md`](../任务规划/README.md)。 +- 测试用例步骤 → `docs/测试说明/`;未闭环事项跟着所属模块走(各文档「已知限制 / 重开条件」节),全项目顺序 → [`docs/任务规划/README.md`](../任务规划/README.md)。 ### 1.2 术语与缩写 @@ -474,9 +474,15 @@ flowchart LR - **需求(已确认)**:半双工 RS-485 **对下 ModBus RTU 采集**(下行采集口;上行走以太网 104)。 - **现状**:`rs485_init()` 已调用;`rs485_task.c` 为空桩、未在 `freertos.c` 创建;`App/protocol/` 为该 协议族预留(当前仅 104 在用)。**整簇冻结**(用户决定,2026-10-12)。 -- **重启门禁**:先修「单缓冲包撕裂」「TX 超时拉 DE 未等 TC」两条,再谈接消费者;实现须满足 - 双缓冲 + 序号、DE 收尾超时路径、协议解析与硬件 I/O 分离。 -- 详见 [`docs/任务规划/暂缓-RS485.md`](../任务规划/暂缓-RS485.md)。 +- **重启门禁**:先修「单缓冲包撕裂」「TX 超时拉 DE 未等 TC」两条,再谈接消费者。 +- **动手前必须落实的三条设计约束**(事后无法补测——撕裂与错误路径在真机上不可稳定复现。 + 本条收口原「测试与架构专项」2026-10-28 删除后唯一未闭环的约束): + ① **协议解析与硬件 I/O 分离**——解析函数只吃 `(const uint8_t *buf, size_t len)` 并返回结果, + 从而可被主机侧纯逻辑单测覆盖(参考 `cfg_file` 的"核心 + 后端"模式); + ② **采集缓冲双缓冲 + 序号**——撕裂是时序相关的,单测里测不出来,只能在设计上消除; + ③ **DE 收尾必须有超时路径覆盖**(RS-485 半双工特有陷阱)。 + **完成判据**:RS-485 设计文档体现上述三条,协议解析函数有对应的主机侧单测。 + ADC 侧不需要再做——它没有协议解析面,同一时刻性由 `tpafe5160_snapshot()` 原子快照保证。 ### 5.11 遥测与相量(FR-MEAS)✅ @@ -1386,7 +1392,7 @@ mac=00:00:00:00:00:00 > 同期(13)、看门狗(63)、遥测越限(10)等整单元(复刻明细 §1)。 **链路参数**:k=12 / w=8 / t1=15 s / t2=10 s / t3=20 s;IOA 3 字节、公共地址 2 字节、传送原因 2 字节; -公共地址与端口可配(`[comm]` 段,工厂默认 1 / 2404)。**生效语义**(用户裁定 2026-10-30):两者都按「保存即生效」要求;现实现 = 公共地址改后重启、端口下次重 bind 才生效,差距已登记 `docs/任务规划/登记簿.md` §1「104 端口改后立刻重 bind」。 +公共地址与端口可配(`[comm]` 段,工厂默认 1 / 2404)。**生效语义**(用户裁定 2026-10-30):两者都按「保存即生效」要求;现实现 = 公共地址改后重启、端口下次重 bind 才生效;差距的代码语义与重 bind 时机见 `docs/子系统设计/IEC104上行设计说明.md` §8。 --- @@ -1551,8 +1557,7 @@ pre-commit run --all-files **规模**:菜单节点 **9** 个(含根)+ 叶子节点 **34** 个 = **43** 节点;最大深度 **4 级(主界面 / 一级 / 二级 / 三级菜单)**。 **绑定现状**(2026-11-04 复扫):**已绑内容页 31 叶 / 未绑 3 叶**(页面注册表 `UI_PAGE_MAP_COUNT` = 31, -与已绑叶数一致);未绑 3 叶 = 无开入硬件 3(取舍与重开条件见 -`docs/任务规划/登记簿.md` §8「开入开出与遥信配置 3 页」);原「当前执行 6 项」(记录 5 页 + 运行报告)已于 2026-10-28 落地绑页, +与已绑叶数一致);未绑 3 叶 = 无开入硬件 3(重开条件见 `docs/架构设计/硬件规格与能力边界.md` H3);原「当前执行 6 项」(记录 5 页 + 运行报告)已于 2026-10-28 落地绑页, 「手动录波」与「录波回放」两叶于 2026-10-29 随录波道绑页(判据见 docs/子系统设计/故障录波设计说明.md §4.1 与 §8.1), 「SNTP 设置」叶于 2026-11-04 随 SNTP 客户端立项绑页(判据见 §5.3 FR-TIME-3 与 docs/网络/BSD_Socket_API_使用指南.md §6.1)。 @@ -1676,7 +1681,7 @@ pre-commit run --all-files | **多规约栈** | 17 | 12 种 | 1 种(104) | +11 种(101 / 102 / 103 / CDT / ModBus / Whm_GB / 61850 / CAN + 子站侧 3 类) | | **国密算法** | 18 | `Comm/Ecc/` 全套 | 0 | SM2 / SM3 / ECDSA | | **软压板铺开** | 11 | 9 面(表容量 32) | 1 面 | +8 面 | -| **SNTP 对时** | 17 | 参考对时走 SNTP | **SNTP 客户端已落地**(2026-11-04:coreSNTP 序列化器 + `[sntp]` 配置 + UI 设置页 + timeSyncTask 接入,判据 §5.3 FR-TIME-3);另有 104 `C_CS`(私有 TCP 8888 已随 #78 退役删除) | 台架真机对时判据(现场时间源,docs/任务规划/登记簿.md) | +| **SNTP 对时** | 17 | 参考对时走 SNTP | **SNTP 客户端已落地**(2026-11-04:coreSNTP 序列化器 + `[sntp]` 配置 + UI 设置页 + timeSyncTask 接入,判据 §5.3 FR-TIME-3);另有 104 `C_CS`(私有 TCP 8888 已随 #78 退役删除) | 台架真机对时判据(现场时间源,见 `docs/子系统设计/系统墙钟时间维护说明.md` §16) | | **固有参数** | 1 | `8001H~800AH` 字符串类参数 | 未实现(无法短浮点上送) | 随送检点表设计 | | **遥测增强** | 4、5 | k=1~9 谐波方和根 + 4 点平均 | 仅基波轨 | 谐波 / 等周波调频 / 零序自产外接切换 三条算法轨 | | **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / USART1 TTL 直连、无 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | **串口通道已交付**(4208 B 应答 / 状态灯掩码 / 键上行 / 双出口并发,屏板链路设计说明 §9.1);7003 四命令(INIT **8 B**);无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 7003 报文口径 6 项(`参考产品复刻明细.md` §11 第 2~9 条);串口侧验收尾巴见屏板链路设计说明 §9.2 | @@ -1684,8 +1689,7 @@ pre-commit run --all-files > **一句话**:**「标定闭锁」是唯一"再排期也没用"的缺口**(等标准源);「出口与开入」「三相与同期」 > 「电度计量」等 V0.2 硬件;「对下采集」等用户决策;其余规模型条目**全部可在现有硬件上推进**, > 只取决于排期。 -> 这张表与 [`docs/任务规划/登记簿.md`](../任务规划/登记簿.md) 一一对应;状态只在登记簿维护, -> 本节不另建状态。 +> 状态只在本节维护,别处不另建一份同表。 ### 9.2 推进顺序 @@ -1694,7 +1698,7 @@ pre-commit run --all-files | 顺序 | 工作 | 类别 | 当前状态 | 开始条件 | |---|---|---|---|---| -| 1 | UI 补齐(记录 5 页 → 运行报告) | 规模型 | **✅ 2026-10-28 落地并绑页;2026-11-06 台架判据复核完成,整体销项** | 六页已落地;余 3 叶属不做项(遥信 3,无开入硬件),重开条件见 `docs/任务规划/登记簿.md` §8 | +| 1 | UI 补齐(记录 5 页 → 运行报告) | 规模型 | **✅ 2026-10-28 落地并绑页;2026-11-06 台架判据复核完成,整体销项** | 六页已落地;余 3 叶属不做项(遥信 3,无开入硬件),重开条件见 `docs/架构设计/硬件规格与能力边界.md` H3 | | 2 | net 层跨上下文收口 | 平台 | **下一顺位(未开工)** | UI 清单已清空,切换条件已满足;**开工待用户点头** | | 3 | 其余结构与可靠性评估 | 平台 | 排队 | net 收口后 | | 4 | 端子/子板变比确认 → 两点标定 | 阻塞型 | 等外部资源 | 子板实物/原理图、标准源到位可插入 | @@ -1823,7 +1827,7 @@ pre-commit run --all-files | 条目命名与编号规则 | [`docs/文档规范.md`](../../docs/文档规范.md) §7.1 | | 部署环境 | [`docs/环境与部署/项目部署环境要求.md`](../../docs/环境与部署/项目部署环境要求.md) | | 硬件网表 | [`docs/硬件平台/V0.1_网表详细分析报告.md`](../../docs/硬件平台/V0.1_网表详细分析报告.md) | -| 待办登记簿 | [`docs/任务规划/README.md`](../任务规划/README.md) | +| 待办与推进顺序 | [`docs/任务规划/README.md`](../任务规划/README.md) | | 实机测试指南 | [`docs/测试说明/板级测试/实机测试实施指南.md`](../测试说明/板级测试/实机测试实施指南.md) | | 测试标准流程 | [`docs/测试说明/流程与规范/测试开发标准流程.md`](../测试说明/流程与规范/测试开发标准流程.md) | | RAM 预算与优化 | [`docs/内存管理/RAM使用分析与优化方案.md`](../../docs/内存管理/RAM使用分析与优化方案.md) | diff --git a/docs/产品需求/参考产品复刻明细.md b/docs/产品需求/参考产品复刻明细.md index 6fbd151c..6d4f2fb9 100644 --- a/docs/产品需求/参考产品复刻明细.md +++ b/docs/产品需求/参考产品复刻明细.md @@ -164,7 +164,7 @@ tTimer_NoUI 无压无流判据(CN_ |---|---|---| | **外部资源**(标准源、端子变比) | 定值标定、保护判据解卡 | 两点标定(需求档 §9.2 第 4 步) | | **硬件缺失**(X3 / X4) | 开入 138、开出 31、电度 8、同期、三相通道 | V0.2 硬件 | -| **立项未排** | 多规约、SNTP、定值铺开 | 按需求档 §9.2 顺序。**录波最小闭环已交付代码面**(2026-10-29,设计与板级判据 `docs/子系统设计/故障录波设计说明.md` §10;原卡片登记簿 2026-10-30 销项并入后删除;1 kHz 起步与本文 80 点/周波口径的偏离在该设计文档 §2 显式登记);**4 kHz 全速、多段、COMTRADE、104 文件传输仍未排**,属二期范围 | +| **立项未排** | 多规约、SNTP、定值铺开 | 按需求档 §9.2 顺序。**录波最小闭环已交付代码面**(2026-10-29,设计与板级判据 `docs/子系统设计/故障录波设计说明.md` §10;原卡片 2026-10-30 销项并入后删除;1 kHz 起步与本文 80 点/周波口径的偏离在该设计文档 §2 显式登记);**4 kHz 全速、多段、COMTRADE、104 文件传输仍未排**,属二期范围 | | **算力 / 形态**(X1 / X2) | 双核分工、VxWorks | 不解除。**屏板链路已从范围外项移入范围内**(规格见需求档 §5.16,主机侧实现 `docs/子系统设计/屏板链路设计说明.md`;串口通道已实现,网络通道未做):主机侧链路与参考 1:1 同构,不属"替代方案" | > **结论**:本产品与参考产品的差距**全部是"进度"而非"范围"**——没有一项是"参考有而我们不做"。 diff --git a/docs/代码规范/pre-commit使用说明.md b/docs/代码规范/pre-commit使用说明.md index 10c44941..20ae2535 100644 --- a/docs/代码规范/pre-commit使用说明.md +++ b/docs/代码规范/pre-commit使用说明.md @@ -24,8 +24,8 @@ git commit ├─ cubemx-survival CubeMX 重生成存活审计(易失定制清单 + 基线漂移) ├─ watchdog-unit-test 看门狗判定状态机主机侧单测(主机侧纯逻辑单测) ├─ test-suite-switch 测试套件开关=产品构建(防测试固件静默提交) - ├─ registration-check 双端注册反向校验(uvprojx + CMakeLists,登记簿「rs485_task 白名单缺口」;含 UI 页面描述符表接线,「UI 字符集与像素回归门禁」) - ├─ mem-budget RAM 预算 92% 阈值门禁(登记簿条目「缩堆迁 CCM 后半(暂缓)」,2026-10-12) + ├─ registration-check 双端注册反向校验(uvprojx + CMakeLists,`rs485_task` 白名单缺口;含 UI 页面描述符表接线,「UI 字符集与像素回归门禁」) + ├─ mem-budget RAM 预算 92% 阈值门禁(内存治理三件套,2026-10-12) └─ font-charset UI 字符集差集检查(防缺字白框,「UI 字符集与像素回归门禁」,2026-10-15) └─ commit-msg(.git/hooks/commit-msg) └─ gitlint 校验 commit message 格式 diff --git a/docs/任务规划/README.md b/docs/任务规划/README.md index 66a24318..dec93402 100644 --- a/docs/任务规划/README.md +++ b/docs/任务规划/README.md @@ -1,93 +1,68 @@ # 任务规划 -> **UI 补齐已于 2026-10-28 清空并整体销项**(记录 5 页 + 运行报告页落地;范围与判据口径已并入 -> `docs/UI设计/内容页架构.md` §7.1 与 `docs/UI设计/菜单页面设计.md` §3.9,原执行清单文件已删除)。 -> 下一顺位 = net 层跨上下文收口,已闭环。 +> 全项目**推进顺序的唯一权威**:只回答「现在做什么、接下来做什么、卡在哪一步」。 +> 各任务的验收判据与设计口径归其所属模块文档,本文件不复制。 -## 怎么用这份规划 +## 怎么用 -| 你想知道什么 | 只看哪个文件 | +| 你想知道什么 | 去哪看 | |---|---| -| 现在做什么、接下来做什么 | 本文件 | -| UI 之后还有什么、哪些事在等条件 | `登记簿.md` | -| ADC 标定为什么没做、保护为什么不动作 | `登记簿.md` §7 + `../算法/采集与算法层设计说明.md` §13 | -| RS-485 为什么冻结、重启要满足什么 | `暂缓-RS485.md` | - -**一件事只有一个归属。** 本文件只负责导航与顺序,不复制各任务的验收明细; -采集数据可信度的设计口径归 `docs/算法/采集与算法层设计说明.md` §13,待办归 `登记簿.md` §7。 +| 现在做什么、接下来做什么 | 本文件 §2 | +| 某件事在等什么条件 | 各模块文档的「已知限制 / 重开条件」节 | +| ADC 标定为什么没做、保护为什么不动 | `docs/算法/采集与算法层设计说明.md` §13 | +| RS-485 为什么冻结、重启要满足什么 | `docs/产品需求/产品需求设计文档.md` §5.10 | --- ## 0. 条目与引用规则 -- **新条目使用语义短语**,一行直接说清是什么事,不再新增字母加数字编号。 -- 旧编号只用于追溯历史,不复用、不重新发号;规则见 `docs/文档规范.md` §7.1。 -- 引用条目时写清所在文档和语义名,例如:`docs/任务规划/登记簿.md` 的 - 「net 层跨上下文收口」。不要只写一个短号让读者猜。 -- 任务状态只维护在任务所属文件;本文件不另建一套状态表。 +- **新条目用语义短语**:一行说清是什么事,不发字母加数字的编号;旧号不回收、不重新发号(规则见 `docs/文档规范.md` §7.1)。 +- **引用条目写清归属**:所在文档 + 语义名,例如「端子变比确认」。只给一个短号让人猜不算引用。 +- **状态只写在条目所属的模块文档**;本文件不另建一份状态表。 --- -## 1. UI 补齐(已整体销项) +## 1. 执行纪律:生成物单写者 -菜单树现状:**43 节点行 / 34 叶 / 已绑 31 叶 / 未绑 3 叶**。未绑 3 叶 = 遥信类型、遥信防抖、双点遥信—— -V0.1 没有开入硬件,不做;重开条件见 `登记簿.md` §8「开入开出与遥信配置 3 页」。 -数法、复核命令与「43 是节点行数不是叶数」的口径 → `docs/UI设计/菜单页面设计.md` §3.9。 +菜单树(`ui_menu_tree.txt` → `ui_menu_tab.c/.h`)、页面注册表与中文字库都是**整文件生成物**: +同刻只允许一个任务写它们,不要开两条并行道;需要并行时让别的道等这条道收尾。 -记录 5 页(事故 / 操作 / 保护告警 / 保护启动 / 遥控)与运行报告页已于 2026-10-28 落地并绑页; -上板判据(真记录翻页、掉电保持、清除后归零、`boot_count` 自增、`RESTARTED`、`rst_cause=IWDG`、`conn_up` +1) -已于 2026-11-06 Issue #53 台架轮复核完成(「拔 RTC 电池落 RESTARTED」经用户裁定 2026-11-05 台架不可验)。 -模拟器差距见 `docs/测试说明/专项验证/模拟器差距清单.md` §2.3「开机账本 boot_stats」一行。 - -页面的统一完成动作、三条硬规矩(不用演示数据 / 不做没效果的按钮 / 保护闭锁必须可见)与回归门禁 -→ `docs/UI设计/内容页架构.md` §7、§7.1。 - -**执行纪律:单道串行。** 菜单树与页面注册表是生成物,字库也是整文件生成物;不要同时开多条 UI 分支。 +生成方式、叶数口径与复核命令见 `docs/UI设计/菜单页面设计.md` §3.6、§3.9; +页面完成动作与三条硬规矩见 `docs/UI设计/内容页架构.md` §7、§7.1。 --- ## 2. 全项目推进顺序 -> 本节是全项目唯一的顺序权威。模块文档只描述局部设计,不另排一套路线图。 +> 本节是全项目唯一的顺序权威。模块文档只写局部设计与重开条件,不另排一套路线图。 +> 写范围相交怎么排队、构建与台架怎么串行 → `docs/环境与部署/并行任务工作树方案.md` §7.3。 ### 2.0 顺序表 | 顺序 | 工作 | 当前状态 | 开始或切换条件 | |---|---|---|---| -| **1** | **UI 补齐** | **✅ 2026-10-28 清单清空;2026-11-06 台架判据复核完成,整体销项** | 记录 5 页与运行报告页已落地并绑页;余 3 叶属不做项(遥信 3,无开入硬件),重开条件见 `登记簿.md` §8。页面口径见 `docs/UI设计/内容页架构.md` §7.1 | -| **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 日冻结特性 | -| **6** | 保护元件与采集增强 | 等待标准源或硬件改版 | 保护先解除未标定闭锁;三相同时刻类功能等 V0.2 硬件 | -| **7** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位时执行 | -| **8** | 独立模块与暂缓项 | 当前不排 | 开入开出、104 文件传输单独立项(SNTP 已单独立项并于 2026-11-04 落地 #73,:8888 随 #78 退役);RS-485 与内存优化按各自重启条件 | -| **独立** | **故障录波(1 kHz · 8 路原始码值 · 单通道回放)** | **代码面已交付;2026-10-31 远程半轮过六项、2026-11-02 回放页枚举缺陷已修复闭环、2026-11-04 注量对表闭环(#40 §8 交流轮)、2026-11-06 第二幕尾步坏段/空态画面台架远程轮拍毕——回放页三态板级判据全部实证、2026-11-07 #93 两条现场发现修复后台架验收 F1/F2 全过(PR #94);余保护触发(P,需标定解锁决定)、bench 定时自抓(T)与卷占用、`task_prof` 耗时峰值等到场/裁定项** | 用户裁定 2026-10-29 **录波先行**:数据面最小闭环 → 手动与保护启动触发 → 回放页。三块的**代码侧判据已收口**(主机单测 113 / 170 / 110 全 rc=0、双端编译 0 错误 0 警告、板端编码器与 PC 侧解码器字节级互验、手动录波与录波回放两叶已绑页、内容页黄金参考扩至 66 张);**2026-10-31 远程半轮已过六项**(真 FAT 落盘、触发→落盘全部落在 2 s 封存超时窗内、冷却恢复、轮转、PC 侧坏段拒收、冻结窗内 104 并发);同轮发现的缺陷「回放页段表枚举恒空」**已于 2026-11-02 远程修复并板级闭环**(根因 = 读侧 `wave_store_seg_path()` 返回值判错,顺带修键处理缺失效;回放页真段/切段/切道已实测,登记簿条目已销项,证据见设计说明 §10「回放页枚举恒空缺陷修复记录」);**注量对表半轮已于 2026-11-04 由 #40 §8 交流轮闭环**(幅值 / 相位 / 削顶三项实测,`meas:` 行与板上读数逐项核对,104 浮点遥测按用户裁定不作对照证据;`docs/测试说明/测试数据/boot_log_data/20261104_ac_*`);**回放页放坏段与空态画面已于 2026-11-06 台架远程轮拍毕闭环**(同号翻位覆盖→「该段不可读」零波形元素绝不平线;全删→「无录波段」+ 串口 `open fail fr=4` 互证;证据 `docs/测试说明/测试数据/wave_shot_20261106/`,记录见设计说明 §10「回放页坏段/空态画面闭环记录」);**#93 回放页两条现场发现(开页后新段不进表 / CRC 判废串口静默)已于 2026-11-07 按推荐方案修复并台架远程验收 F1 五条 F2 五条全过**(F1 = `wave_enter` 钩子开页作废钉表 + 空态键重探,A+B 同批;F2 = 五类判废汇成单条 `ui wave head idx= reject= stored= calc=` ERROR 级不去重留痕,reject=5 与 PC `wave_read` 同值互证;PR #94,证据 `docs/测试说明/测试数据/wave_fix_20261107/`,记录见设计说明 §10 修复记录);**没跑的只剩** 保护触发(P)对时刻(先要标定解锁决定)/ bench 定时自抓(T)与卷占用(需 bench 构建)/ `task_prof` 读路径耗时峰值,全部结果与清单见 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」。**板级判据、留痕名清单与执行顺序图的属主 = docs/子系统设计/故障录波设计说明.md §9 与 §10**(原卡片登记簿 2026-10-30 随销项并入后删除);**与 UI 道互斥**(菜单树与中文字库是整文件生成物,同刻只允许一条道写)——本波按此串行执行:UI 道在数据面与接线冻结之后才动生成物 | +| **1** | **端子 / 子板变比确认 → 两点标定** | 变比已按参数算定;标定未开工 | 缺标准源。开工前必须先拍板三件事(精度目标、变比来源、`eng=0` 期测频门处置),见 `docs/算法/采集与算法层设计说明.md` §13.13 | +| **2** | 标准源送检与第三方 104 主站验收 | 等待标定 | 两点标定完成且保护 `VALID` 已置位;送检窗口前 2 日冻结特性 | +| **3** | 定值 / 映射 / 遥测 / 软压板铺开 | 等排期 | 必须晚于标定,否则铺出去的全是 IV 点(两条不可颠倒的顺序见 `docs/产品需求/产品需求设计文档.md` §9.2) | +| **4** | 保护元件与采集增强 | 等待标准源或硬件改版 | 先解除未标定闭锁;跨转换器相位 / 功率 / 对称分量类功能等 V0.2 硬件(缺陷见 `docs/任务规划/登记簿.md` §1) | +| **5** | 其余结构与可靠性评估 | 排队 | 观察项的归属是各模块文档的「已知限制」节,不为清清单强做 | +| **6** | 验证窗口事项 | 逢条件顺带 | CI runner、PC peer、CH340、负向故障注入条件到位即执行 | +| **7** | 独立模块与暂缓项 | 当前不排 | 开入开出、104 文件传输单独立项;RS-485 见 `docs/产品需求/产品需求设计文档.md` §5.10;内存优化按自身重开条件(`docs/内存管理/RAM使用分析与优化方案.md`) | +| **独立** | **故障录波**(1 kHz · 8 路原始码值 · 单通道回放) | 代码面已交付;板级判据(手动触发、回放页三态、开页重扫与判废留痕)已台架验收 | 判据、留痕名清单与执行顺序的属主 = `docs/子系统设计/故障录波设计说明.md` §9、§10。**还没跑的只剩**:保护触发(要等标定解锁决定)、bench 定时自抓与卷占用、`task_prof` 读路径耗时峰值。与 UI 道互斥,见 §1 | ### 2.1 关键依赖 -- **UI**:写路径、整定 4 页、装置维护 3 页与遥测死区/系数 2 页已收口(含上板判据与真机回读); - 菜单树、页面注册表与字库都是生成物,同刻只允许一条道写。 -- **送检**:已知电压注入(✅ 2026-10-27 闭环)→ 信号发生器动态波形验证(✅ 2026-11-04 闭环, - 六轮全过;未闭合项已裁定或另登记于 `登记簿.md` §7)→ 端子/子板变比确认 → 标准源两点标定 → 保护解除闭锁 → 送检。 -- **保护扩展**:标准源未到位前不新增无法验证的判据;跨转换器相位、功率、对称分量类 - 功能必须等 V0.2 硬件。 -- **结构债**:UI 完成后先做 net 收口;RS-485 白名单、内存优化、仓库体积等观察项不抢占 - 当前编码道。 +- **送检链不可颠倒**:变比确认 → 两点标定 → 保护解卡 → 送检。顺序反了保护表现为不动作,不许用非标准源走捷径(红线见 `docs/产品需求/产品需求设计文档.md` §9.2)。 +- **保护扩展**:标准源未到位前不新增无法验证的判据;跨转换器相位、功率、对称分量类功能等 V0.2 硬件。 +- **观察项不抢道**:内存优化、仓库体积等观察项不抢占当前编码道。 --- ## 3. 维护约定 -1. **完成即删除待办条目**,同时清理其他文档对它的引用;结论和证据写入模块文档, - 历史由 `git log` 保留。 -2. **待办只改 `登记簿.md`**(新增、销项、改重启条件都在那一处);顺序变化才改本文件 §2。 -3. **设计约束不放在本目录**:采集数据可信度的口径归 `../算法/采集与算法层设计说明.md` §13, - 本目录的待办只认 `登记簿.md`(标识列用语义短语,卡片增减不改本条口径)。 -4. 专项文档只放**还没闭环的约束**;已落地事项的规格正文归代码头注释或模块文档, - 销项即删文件并把引用改指现行出处(先例:`测试与架构专项.md` 已删除 2026-10-28, - 唯一未闭环的「采集链路测试可验证性约束」并入 `暂缓-RS485.md`)。 -5. 任务分支不直接修改 `docs/任务规划/**`;状态更新与销项由主工作树统一处理。 -6. 并行开发机制、工作树和锁的使用见 `docs/环境与部署/并行任务工作树方案.md`。 - 本文件夹不再另维护一份分道、批次和写域方案。 -7. 暂缓不是完成:条目必须保留重启条件;没有重启条件的“以后再说”应写成观察项或删除。 +1. **完成即删条目**,同时清理其它文档对它的引用;结论与证据写进模块文档,历史交给 `git log`。 +2. **待办跟着所属模块走**:设计类待办写进模块文档的「已知限制 / 重开条件」一节;只有顺序变化才改本文件 §2。 +3. **设计约束不放本目录**:采集数据可信度的口径归 `docs/算法/采集与算法层设计说明.md` §13。 +4. 任务分支不直接修改 `docs/任务规划/`;状态更新与销项由主工作树统一处理。 +5. 并行开发机制、工作树与锁的使用见 `docs/环境与部署/并行任务工作树方案.md`,本目录不另维护分道与批次方案。 +6. 暂缓不是完成:条目必须随身带重开条件;没有重开条件的「以后再说」应写成观察项或删掉。 diff --git a/docs/任务规划/暂缓-RS485.md b/docs/任务规划/暂缓-RS485.md deleted file mode 100644 index 6145bdcd..00000000 --- a/docs/任务规划/暂缓-RS485.md +++ /dev/null @@ -1,32 +0,0 @@ -# 暂缓:RS-485 整簇(用户决定,2026-10-12) - -> **当前没有处理 RS-485 的打算**,以下条目整体冻结、不占执行队列;**重启 RS-485 采集链路时先回本文件评估前置,勿直接开工**。 -> 本文件**不是销项**:条目仍在簿,只是暂缓(`docs/任务规划/README.md` §3 维护约定)。 - -| 项 | 内容 | 重启时的前置 | -|---|---|---| -| **RS-485 采集链路** | **RS-485 采集链路实现**:双缓冲 + 序号(防包撕裂)+ DE 收尾(超时路径等 TC)+ ModBus RTU 状态机(`App/protocol/` 正是为此预留) | **RS-485 接线门禁尚未满足**:先修单缓冲包撕裂、TX 超时拉 DE 未等 TC 两条,修完才允许接消费者 | -| RS485 DE 收尾 | RS485 DE 收尾(原属结构债一档剩余,已移出) | 同上 | -| 采集链路测试可验证性约束 · RS485 侧 | 双缓冲 + 序号、DE 超时路径覆盖(约束正文 = 本文「采集链路测试可验证性约束」一节) | 随 RS-485 设计文档落地 | -| RS-485 方向控制硬件实测 | RS-485 PD0 DE 半双工方向语义硬件实测确认(本次仅静态审查) | 需硬件实测窗口 | -| 网络性能资源建议簇中 DE 项 | `HAL_Delay(1)` 阻塞 DE | 随 RS-485 采集链路 | - ---- - -## 采集链路测试可验证性约束(RS-485 动手前必须落实) - -> 原属 `docs/任务规划/测试与架构专项.md` §2.2(该文档已删除,2026-10-28)。ADC 侧随 ADC 采集链路闭环, -> **没落实的只剩 RS-485 侧**,所以约束正文收在本节——重启 RS-485 采集链路以这里为准,不要再另起一份。 - -本项**不是缺陷,是对上游 RS-485 采集链路的设计约束**:`rs485_task.c` 仍是空桩、`App/protocol/` 只有占位文件;动手前不落实 -这三条,事后无法补测(撕裂与错误路径在真机上不可稳定复现)。 - -1. **协议解析必须与硬件 I/O 分离**:`App/protocol/` 的解析函数应接受 `(const uint8_t *buf, size_t len)` 并返回 - 解析结果,使其成为**主机侧纯逻辑单测的天然适格对象**(参考 `cfg_file` 的"核心 + 后端"模式); -2. **采集缓冲必须双缓冲 + 序号**:否则消费者读到撕裂数据,而**撕裂在单测里测不出来**(时序相关), - 必须在设计上消除; -3. **DE 收尾必须有超时路径覆盖**(RS-485 半双工特有陷阱)。 - -**完成判据**:RS-485 设计文档体现上述三条;协议解析函数有对应的主机侧纯逻辑单测。 -(ADC 侧不需要再做:它没有协议解析面,"同一时刻性"由 `tpafe5160_snapshot()` 原子快照保证,2026-10-10 随 ADC 采集链路 - 闭环 → `docs/硬件平台/ADC通道映射说明.md` §8 与 `App/algo/README.md`。) diff --git a/docs/任务规划/登记簿.md b/docs/任务规划/登记簿.md index db64f63e..6aac4090 100644 --- a/docs/任务规划/登记簿.md +++ b/docs/任务规划/登记簿.md @@ -1,100 +1,9 @@ -# 后续待办与长期观察登记簿 +# 硬件缺陷登记簿 -> **全部待办只在本文件。** 推进顺序只看 `docs/任务规划/README.md` §2;UI 补齐已于 2026-11-06 整体销项。 -> -> 条目一律用语义短语标识;完成后删行并清理引用。§6~§9 是由原排期、送检、分道和 -> 开放问题文件合并而来的唯一归属,不再在多处复制同一事项。 -## 1. 网络(CH395F / net 层) - -| # | 事项 | 发现 | 证据与现状 | 出处 | -|---|---|---|---|---| -| 队列往返基线待重验 | **队列往返基线(1223/988µs)在发送分块握手改造后的重验**——队列往返测 DONTWAIT 队列全程;发送分块握手对该路径逐位不变 → 机制上无影响,但基线数值属分片时代,严格重锁需跑一轮 Phase 13(需 PC peer) | 2026-09-22(发送分块握手收尾留档) | 低风险:10ms/100ms 阈值余量 >8×;下次 Phase 13 窗口顺带重锁即可 | `链路延迟测试说明.md` §6.4 队列往返行的注¹ | -| 网络负向场景台架验证 | **负向场景台架验证待办**(拔线断链 / 芯片级 `net_init` 失败分支 / 短写压测;正常路径已实测零回归):① PHY 拔线负向测试——断链需断 **DTU 侧**线缆或关**受管交换机端口**;② 芯片级 `net_init` 失败分支(需 SPI 故障注入);③ 短写压测(需远显客户端 + UI 推流压力) | 2026-10-03(台架拓扑 = CH395↔交换机,拔线操作受限) | 待专项台架窗口 | `实机测试实施指南.md` §10 | -| 104 端口改后立刻重 bind | **改了 `[comm]` 段 `port` 之后要求立刻重 bind**(不等拆链重建、不等网络代次重建)——用户裁定 2026-10-30:需求口径按「保存即生效」定,**代码语义是要改的一侧** | 现实现 = `App/task/iec104_serv.c` 的 `s_bind_listen` 每次现取 `iec104_comm_port()`,注释自陈「下次重 bind(拆链重建/网络代次重建)即生效」;连带隐性耦合:`.serialtest/config.json` 必检锚点写死 `i104: listening on 2404`,端口一改串口回归必假失败(要么锚点只查 `listening on`,要么由脚本把端口注入锚点) | 属固件行为变更,需真机验证;本笔只登记不动代码 | 用户裁定 2026-10-30;`docs/产品需求/产品需求设计文档.md` §通讯配置、`docs/测试说明/流程与规范/自动化测试流程.md` | -| relisten 沉降段原语化受阻 | **relisten 沉降段统一到驱动 `sock_reset` 原语受阻**——"去重复实现"的收口已实测回退:原语版 `ftp_abort_probe` RST **0/10**、FIN **0/5**(中止后首笔复连仍被截断到 ≤2048B),另新增 `sock_reset_sync timeout (600ms)` 与 `close: sock_reset not done` 两条 `[ERR]`;同场 net 层自建序列 **10/10 + 5/5** | 2026-10-14(同一块板 A/B,判据 `test/host/ftp_abort_probe.py`;快复连 50/50、背靠背 30/30 两版都过 → 失效面精确落在"中止后首笔复连") | **现状 = `net_listener.c` 保留自建排渣序列**(排空 + CLOSE + 排事件 + 等 CLOSED,30 ms 重试轮持续清)。重开前置三条语义:① 隔离窗内**持续**排空/关闭(残渣在 CLOSE 之后才落进 RX,一次排空接不住)② **复用让位**(复位机不得拆上层刚在同一芯片 Socket 上重建的监听)③ `net_sock_reset_sync` 改"已在运行 = 加入等待"(`begin` 返 -1 ≠ 失败) | `../网络/网络自愈架构设计.md` §8 延后项 1、§5.2 E16;`../问题记录/CH395F_Trap_Records.md` TRAP-NET-18 | - -## 2. 存储 / 日志管线 - -| # | 事项 | 发现 | 证据与现状 | 出处 | -|---|---|---|---|---| -| 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 改版项) +## 1. 硬件(V0.1 缺陷 → V0.2 改版项) | # | 事项 | 发现 | 证据与现状 | 出处 | |---|---|---|---|---| | 双转换器无共同采样触发 | **8 路电气量分属两片转换器(V0.1 硬件缺陷,需下一版硬件修改)**——UA/UN/IA 走 TPAFE5160(16 位、8 通道同步、±5 V 双极性),UB/UC/IB/IC/IN 走 STM32 ADC(12 位、顺序扫描、0~3.3 V 单极性):① 两片转换器无共同采样触发 + STM32 侧顺序扫描(9 通道一轮 ≈ 67 µs)→ 跨转换器通道**无同一时刻性、相位关系不确定**,主板侧功率/功率因数/相角/对称分量类运算不成立;② 同族电气量精度与量程不一致(LSB ≈ 152.6 µV vs ≈ 806 µV,且 STM32 侧前端无中点偏置、负半周削顶);③ 语义与硬件归属交叉,固件映射/UI 通道序/自检注入须逐通道查表绕开 | 2026-10-10 定性更正(**撤销** 2026-10-09 建档时"有意分配、不要修正"的说法) | **V0.2 改版要求**:8 路电气量 UA/UB/UC/UN/IA/IB/IC/IN **全部接 TPAFE5160**,与 TPAFE 上 5 路备用路(AIN5/13/7/15/12)对调串联电阻在转换器一侧的目的地——元件数量与料号不变,属走线级改动。**V0.1 现板软件口径**:主板侧只做逐通道独立监视,禁止跨转换器做相位/功率/功率因数/矢量类运算(此类量取子板计量模块结果)。固件侧消费者已落地(ADC 采集链路,2026-10-10,按语义映射表取数)→ V0.2 改版只改映射表内容,上层语义与代码不动 | `../硬件平台/ADC通道映射说明.md` §1/§7;`../硬件平台/V0.1_网表详细分析报告.md` §1.4 V10、§6-3 | | IA 前端差分滤波限制谐波带宽 | **IA 通道差分滤波电容 C35 = 100 nF 构成一阶低通 fc ≈ 796 Hz,谐波产品路线的硬件前置未清**——250 Hz 注入读数 −4.4 % 即前端真实衰减(板端读数忠实;R19/R21 各 1 k `docs/硬件平台/V0.1.tel`:49 + C35 跨接差分对,拓扑 FR-ADC-5 `docs/产品需求/产品需求设计文档.md`);工频测量不受影响,外推 5 次 −4.6 %、9 次 −13 %、15 次 −27 %、21 次(1050 Hz)−39.6 % | 2026-11-04(模型与实测数据 `docs/测试说明/测试数据/boot_log_data/20261104_ac_ia_rc_model.txt`) | **改版/改板方向**:C35 换 10 nF(fc≈8 kHz、21 次仅 −0.9 %;改板优先于软件逐阶修正——容差与温漂使修正表不可信,理由详 `docs/硬件平台/ADC通道映射说明.md` §8.2)+ **清点其余各路差分滤波电容容值**(网表无容值标注,C35 = 100 nF 系用户口头确认,其余各路未定);将来有示波器可按预测复核(250 Hz 差分分量额外滞后 ≈17°)。详述 `docs/硬件平台/ADC通道映射说明.md` §8.2 | `docs/测试说明/专项验证/ADC前端注入验证流程.md` 谐波记录 B 行;`docs/硬件平台/ADC通道映射说明.md` §8.2 | - -## 4. 测试与验证基础设施 - -| # | 事项 | 优先级 | 问题与证据 | 处置方向 | 出处 | -|---|---|---|---|---|---| -| CI 远端闭环未验证 | **CI 远端闭环未验证**(runner 本机已就绪) | 中 | **剩余两件**:③ 推送远端跑一次两 job 闭环验证(**跑通证据尚无留档**,故仍按"未验证"对待);④ 第二机交叉验证(不同工具安装路径,验 `DTU_*` 环境变量方案,→ `../环境与部署/本地工具路径环境变量方案.md` 变更记录 TODO)。①② 已就绪,见 `../CI/远程CI完整指南.md` §0 仓库状态行 | 完成前**提交前仍须在本地跑 `scripts/ci_local.py` 或 `pre-commit run --all-files` 自查**(静态门禁唯一保障,不能因"已配 CI"而放宽) | `.gitea/workflows/ci.yml`;`../CI/远程CI完整指南.md`;`../测试说明/流程与规范/测试开发标准流程.md` §9 | - -## 5. RS-485、内存与仓库观察 - -| # | 事项 | 影响 / 现状 | 处置方向 | 状态 | 出处 | -|---|---|---|---|---|---| -| rs485_task 白名单缺口 | **KNOWN_GAPS 白名单清理**——现存唯一缺口 = `App/task/rs485_task.c`(RS-485 接线门禁未满足、刻意不接线,随 RS-485 采集链路 暂缓,见 `暂缓-RS485.md`) | 白名单不清 = "写了不编译"盲区仍在 | 随 RS-485 采集链路 一并出白名单(`--strict` 供审计复跑) | 结构债 | 报告 N 族残余(报告已删) | -| 缩堆迁 CCM 后半(暂缓) | **内存优化簇剩余**:原报告缩堆建议的后半(缩堆 56→32 KB → 迁 CCM)· 同类三项 | ⏸ **整簇暂缓**(2026-10-15 用户裁定):没有功能在等这块预算,而搬迁要动 scatter、要逐条过 DMA 可达性清单、缩堆还要上板复测。⚠ 代价落在"以后加任务 / 抬栈 / 加堆"那一刻——CCM 只剩 7,904 B、FreeRTOS 堆 `min_ever` 8,464 B,届时 `mem-budget` 会先报警 | 重开条件见 `../内存管理/RAM使用分析与优化方案.md` §4。⚠ **原报告另有一条已判定不可行**(CMSIS-RTOS2 `freertos_os2.h` 有 `#if (configMAX_PRIORITIES != 56) #error`,改小直接编译失败),不再列入 | **暂缓** | 报告 R 族剩余/§5.5(报告已删) | -| 仓库体积膨胀观察 | **仓库膨胀**:`.git` **233 MB**(2026-10-25 实测)+ 手册图片 36.3 MB(受控文件合计仅 79.3 MB,`.git` 已是它的 3 倍) | clone/备份慢,且持续恶化 | 降采样 / 拆 submodule / LFS 三选一 **+ 一次 `git filter-repo` 历史重写**(三项都不解决历史膨胀)。**已决策(2026-10-11):暂不处理、登记观察**——推送/协作前重评 | **仓库决策** | 报告 D 族 | -| 静态链硬线双 FAIL | **timeSyncTask / iec104Task 静态最坏链跌破 ISR 硬线**(判据 = margin ≥ max(1024 B, cfg×30%),静态 margin 是唯一拦提交项但尚未挂 pre-commit 钩子,口径见 `../内存管理/RAM使用分析与优化方案.md` §4.0.7 第③条)——2026-11-04 复测:master 2b848c4a timeSyncTask **2056 B(余 504)**、iec104Task **1600 B(余 960)**,双 FAIL;#78 合入后 timeSyncTask **1904 B(余 656)**,只减不增(−152 B = 旧 8888 任务自身帧)。两链同尾 = `ch395f SPI 故障收尾 → dbg_console_drain 幻影环`(`../内存管理/RAM使用分析与优化方案.md` §4.0.7「休眠环」在 #74 UDP / #77 SNTP 出向链接入后被重新展开) | 抬栈属 Ask-first:先台架复采 `[STACK]` 水位(scripts/stack_gate.py 三档判据),拿真实余量再定抬栈或接受现状;幻影环是 armlink 记账非设备故障,**不得写成优化收益也不得当作已越线事故** | ⏳ 待台架复采 | #78 复测留痕 `docs/内存管理/data/stack_report_20261104.md`;`../内存管理/RAM使用分析与优化方案.md` §2.3 | - ---- - -## 6. 编码队列 - -| 顺序 | 条目 | 要做什么 | 完成或关闭判据 | -|---|---|---|---| -| 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 原生 `0` 可逆排除 | 有实测收益才保留改动;否则继续观察 | - -> RS-485 白名单随 `暂缓-RS485.md` 整簇处理,不列为独立编码任务。 -> 并行写域、工作树与合并纪律统一见 `docs/环境与部署/并行任务工作树方案.md`。 - -## 7. 等台架或外部资源的事项 - -| 条目 | 需要条件 | 要做的事 | 去向 | -|---|---|---|---| -| **端子/子板变比确认** | 子板实物或原理图 | 给出「端子电压 → ADC 引脚电压」的比值(万用表同时量端子与引脚,或查子板原理图后实测核对),写入 `docs/硬件平台/ADC通道映射说明.md`;据此判定 `eng` 能否置 1;数据缺失则本波只交付引脚电压并登记缺口 | `../硬件平台/ADC通道映射说明.md` §7.2(参数已算定:电压族 606.06:1、电流族 29.4118 A/V,等实物复核) | -| **两点标定与精度验收** | 标准源 / 继保测试仪;精度目标先定(0.5 级还是 1 级) | 电压 4 路(UA/UB/UC/UN)+ 电流 4 路(IA/IB/IC/IN)各做两点标定(零点 + 满度,温度不纳入),写入 `[adc_cal]` 并置 `VALID`;误差 ≤ 目标精度;证据归档 | 设计口径 `../算法/采集与算法层设计说明.md` §13.2/§13.3;`eng` 升 1 条件同节 §13.5 承诺边界 | -| **标准源送检与第三方 104 验收** | 两点标定完成、保护 VALID 置位、第三方主站 | 标准源注入判据全部通过;总召、周期、变位、遥控全流程通过;证据归档。送检窗口前 2 日冻结特性 | `../子系统设计/IEC104上行设计说明.md` §7/§8 | -| **队列往返基线待重验** | 台架 + PC peer | 下次 Phase 13 窗口重锁基线 | 本文件 §1 | -| **网络负向场景台架验证** | 拔线、SPI 故障注入、远显压力条件 | PHY 拔线、芯片级 `net_init` 失败、短写压测 | 本文件 §1 | -| **CI 远端闭环未验证** | runner 与第二台机器 | 验证远端两 job 闭环和不同工具路径 | 本文件 §4 | -| **SNTP 校时真机判据** | 台架:板与 PC SNTP 服务器(192.168.31.161 / .13)同网段可达 | `[sntp]` 使能 + 配服务器后上板复核:`[SNTP] step offset=` 步进日志、钟面与时间源一致(本地 UTC+8 口径)、`poll_min` 周期到点重对、拔线后指数退避与主备轮换、恢复后回到周期 | `../子系统设计/系统墙钟时间维护说明.md` §16 | -| **谐波叠加工况复跑** | 一台带谐波叠加 / ARB 功能的信号源 | 基波 + 20 % 二次 + 20 % 五次同段注入,核两轨各认各的次且叠加不串扰。**现有发生器无叠加功能,本轮只做了单注三档**(已证"两轨各认各的次",不证叠加工况);算法侧已被 `test/host/phasor/phasor_test.c` TC-PHASOR-006(3 条谱线各 ±1 %,57/57)覆盖 | `../测试说明/专项验证/ADC前端注入验证流程.md` 谐波轮「叠加」行 | -| **IA 前端一阶低通模型绝对仪器证伪** | 示波器 | 按 fc ≈ 796 Hz 一阶低通模型预测,250 Hz 分量应额外滞后 ≈17°;用示波器直测板上 250 Hz 相位差与该预测比对。模型本体与改板方向见本文件 §3「IA 前端差分滤波限制谐波带宽」 | `../硬件平台/ADC通道映射说明.md` §8.2 | -| **通讯设置页真机判据** | 台架 + 主站 | 页面与六态黄金已入库,剩两条实机判据:①「改后重启即生效」——改 `[comm]` 段端口后重启,看实际监听端口是否跟着变(现状 `iec104_serv.c` 的 `s_bind_listen` 每次现取、拆链重建才生效,见本文件 §1「104 端口改后立刻重 bind」);② 配置段数与键数上限核对(`CFG_FILE_MAX_KEYS = 16`) | `App/protocol/iec104/iec104_comm.{c,h}`、`../子系统设计/网络配置说明.md` | - -**送检顺序不可倒过来**:产品构建当前要求 UA/UN/IA 的标定 VALID 全部置位才走保护判据。 -未完成标准源标定就送检,保护会表现为不动作。保持该闭锁,不用非标准源标定走捷径。 - -**标定前必须先拍板的三件事**(拍板前相应 DoD 无法判定): - -| 待定 | 备选 | 现状 | -|---|---|---| -| **精度目标** | 0.5 级 / 1 级 | 决定两点标定的判据,**开跑前必须定**,否则"误差 ≤ 目标精度"这条 DoD 无法判定。保护判据本身只需 3~5 %,0.5 级是计量口径 | -| **端子 / 子板变比从哪来** | ① 有原理图(直接算)② 只有实物(万用表同时量端子与引脚)③ 都没有 | 决定 `eng` 能否置 1。② 同样可行且够用;③ 则本波只交付"ADC 引脚电压",二次值登记为缺口。现状已按 ① 的参数算定(`../硬件平台/ADC通道映射说明.md` §7.2),等实物复核 | -| **`eng = 0` 期间的测频幅值门怎么处置** | 保持恒失效(现状,UI 恒 `--`)/ 台架临时把 `FREQ_AMP_MIN` 降到引脚域量级跑一轮再还原 / 换成相对量门限 | 建议**常态保持恒失效 + 需要时临时降门跑一轮**,换相对量门限要先重新论证、别在过渡期改。临时降门会改动产品头文件,收尾必须还原到 `git diff` 为空并重跑 `/keil-build` | - -## 8. 等立项或硬件代次的事项 - -| 条目 | 当前不做的原因 | 重开条件 | -|---|---|---| -| **保护元件 V0.1 可行子集** | A 相涌流制动、突变量启动、无压无流闭锁、元件级校验和虽能设计,但没有标准源就无法验收,且保护仍在闭锁 | 标准源到位,且标定与闭锁验证完成 | -| **采集增强** | 等周波调频、零序通道、遥测谐波轨依赖可信工程量 | 标定完成后单独立项 | -| **跨转换器三相与功率类功能** | 两片转换器无共同采样触发,V0.1 上相位、功率、对称分量不成立 | V0.2 硬件改版 | -| **开入开出与遥信配置 3 页** | 固件和 V0.1 硬件均无可配开入对象;出口还涉及 GPIO 安全电平、保持/脉冲和回读自检 | 开入开出作为独立模块立项,再与 UI 页面同批 | -| **故障录波** | 独立子系统,不是补一个页面——**2026-10-29 已立项**:设计与板级判据属主 docs/子系统设计/故障录波设计说明.md(§10;原卡片登记簿 2026-10-30 销项并入后删除) | 已解除暂缓;执行按该文 §10 顺序图,UI 道互斥 | -| **104 文件传输(规约侧读文件)** | 录波取回走现成 FTP 已够用,规约侧文件服务是另一件事 | 送检或第三方交接需求明确后单独立项 | -| **主站地址白名单** | CH395F 单连接 socket 上「拒绝即 close + 重 listen」等于给扫描风暴开门,且该值现在没有任何既有消费点 | 有真实消费场景或多连接后端立项时再评 | -| **RS-485 整簇** | 用户决定暂缓 | `暂缓-RS485.md` | - -## 9. 开放问题 - -| 问题 | 为什么还没答案 | 处理时机 | -|---|---|---| -| **是否在真实初始化点接入功能裁剪门控** | 旧占位宏没有消费者且已删除;是否需要真实门控属于产品定义,不是单纯代码问题 | 产品提出按配置裁剪需求时决定;决定前不新增空开关 | diff --git a/docs/内存管理/RAM使用分析与优化方案.md b/docs/内存管理/RAM使用分析与优化方案.md index 49d74d96..70251cff 100644 --- a/docs/内存管理/RAM使用分析与优化方案.md +++ b/docs/内存管理/RAM使用分析与优化方案.md @@ -20,7 +20,7 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1` ## 1. 背景与目标 -登记簿(原 `待处理内容.md`,现 `docs/任务规划/`)已提出:"所有任务的内存都是往大的给的,导致内存不够用,要仔细排查内存的预算情况"。 +原 `待处理内容.md`(现 `docs/任务规划/`)已提出:"所有任务的内存都是往大的给的,导致内存不够用,要仔细排查内存的预算情况"。 分析起点(2026-09-11 快照,逐符号见 `data/ram_report_20260911.md`): @@ -111,7 +111,7 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1` > 堆 `min_ever` 7152 → **6640 B**(-512 B,符合预算)。 > 此前 2026-10-04 的 V5 30 min 重采曾把 defaultTask 推到 **3664B/4096(余量 432B ≈ 10%,曾登记在案)**; > 2026-10-10 的栈整改(**未抬栈**,见 §4 阶段 0 的"2026-10-10 复测")把它压回 **2152B/4096**,该项已销项。 -> **2026-10-12 栈余量收口(登记簿销项,「采集保护收尾」M1)**:保护定值持久化把 defaultTask 静态链推到 **3016 B** +> **2026-10-12 栈余量收口(「采集保护收尾」M1)**:保护定值持久化把 defaultTask 静态链推到 **3016 B** > (storage_bring_up→cfg 写→f_rename→dhara GC→控制台回显尾),1024 words 余 1080 B < 30% 线; > timeSyncTask 链 **1264 B**(同一控制台回显尾),512 words 余 784 B < ISR 底线 → **抬栈** > defaultTask 1024→**1280**、timeSyncTask 512→**640**(堆 +1536 B,台账 §6 已登记); @@ -125,7 +125,7 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1` | ftpTask | `1024*4` | 4KB | lftpd FTP 服务 | 740 B(余 81%)/ 静态 1216 B | | testTask | `2048*4` | 8KB | 测试套件(产品构建不创建;存储套件深链需要) | 未创建 / 静态 496 B | | defaultTask | `1280*4` | 5KB | FatFS 挂载/探针 + 配置引擎 + syslog + 栈水位探针 | 2152 B(余 41%)/ 静态 **3016 B**(栈余量收口时抬栈 1024→1280,2026-10-12) | -| timeSyncTask | `640*4` | 2.5KB | 网络校时节拍宿主(SNTP 客户端;:8888 监听 2026-11-04 退役 #78,任务入口不变) | 616 B(余 50%,2026-10-12 实测)/ 静态 **1904 B**(2026-11-04 #78 交付态复测,`docs/内存管理/data/stack_report_20261104.md`;链尾 `time_sntp_run→net_sendto→ch395f_spi_fault_set→控制台 drain 幻影环`,§4.0.7 同族记账。**master 2b848c4a 同判据实测 2056 B = FAIL**,本 PR 只减不增(−152 B = 旧任务自身帧)——FAIL 属 #77/#74 后既有债,与 iec104Task 1600 B 同源,见登记簿「静态链硬线双 FAIL」;台架 `[STACK]` 水位待复采后再定抬栈与否,未据静态值擅自抬栈) | +| timeSyncTask | `640*4` | 2.5KB | 网络校时节拍宿主(SNTP 客户端;:8888 监听 2026-11-04 退役 #78,任务入口不变) | 616 B(余 50%,2026-10-12 实测)/ 静态 **1904 B**(2026-11-04 #78 交付态复测,`docs/内存管理/data/stack_report_20261104.md`;链尾 `time_sntp_run→net_sendto→ch395f_spi_fault_set→控制台 drain 幻影环`,§4.0.7 同族记账。**master 2b848c4a 同判据实测 2056 B = FAIL**,本 PR 只减不增(−152 B = 旧任务自身帧)——FAIL 属 #77/#74 后既有债,与 iec104Task 1600 B 同源,见 §4.0.7 同族记账;台架 `[STACK]` 水位待复采后再定抬栈与否,未据静态值擅自抬栈) | | adcTask | `640*4` | 2.5KB | TPAFE5160 采样消费 + 全周傅氏相量 + 有效性校验(TIM3 1 kHz 节拍,ADC 采集链路→全周傅氏相量→「采样有效性校验」 2026-10-11) | **952 / 2560**(余 1608 B / 62%,台架 `/serial-boot-test` 实测 2026-10-11);静态 **1320 B**(2026-10-12 复测,保护判据接线后) | | iec104Task | `640*4` | 2.5KB | IEC104 上行服务(默认 2404 监听 + link 状态机,IEC 104 上行 2026-10-12) | 未上板 / 静态 **1456 B**(拆链→重建监听→net_bind→SPI 故障→日志尾,日志主导;512 words 时余 592 B < ISR 底线 → 抬至 640,余 1104 B / 43%) | | protectTask | `512*4` | 2KB | 保护判据节拍(prot_elm_run 消费者 + 「自检失败闭锁」采样闭锁,保护任务 2026-10-12) | 未上板 / 静态 **872 B**(float 判据 + phasor 快照 + 日志尾,余 1176 B / 57%) | diff --git a/docs/内存管理/RAM预算台账.md b/docs/内存管理/RAM预算台账.md index f9a2f3c2..0af41aeb 100644 --- a/docs/内存管理/RAM预算台账.md +++ b/docs/内存管理/RAM预算台账.md @@ -1,7 +1,7 @@ # RAM 预算台账(配额 · 趋势 · 门禁) > **定位**:`docs/内存管理/RAM使用分析与优化方案.md` §8.2 模板与 -> 内存治理三件套的**落地件**(2026-10-12,登记簿条目「缩堆迁 CCM 后半(暂缓)」的已落地前半)。 +> 内存治理三件套的**落地件**(2026-10-12)。 > 回答三个问题:**每个子系统还能用多少 RAM**(配额)、**总量趋势往哪走**(基线 TSV)、 > **超了怎么拦**(92% 门禁)。 > @@ -58,7 +58,7 @@ UI 16 KB / RTOS 堆 56 KB / 应用 8 KB**。归集口径(按 `.map` 对象名 - **UI ⚠ 超配额 = 已知长期挂账,不是新增违规**:LVGL 池 16 KB(2026-10-15 落地,由 40 KB 收缩)+ 帧/远显缓冲 ≈12.8 KB,实测 30,412 B。配额 16 KB 描述的是 **把 UI 侧缓冲迁进 CCM 之后的目标态**, - 而 **该搬迁的后半已按用户裁定 2026-10-15 整簇暂缓**(`docs/任务规划/登记簿.md` §5 保留重启条件)→ + 而 **该搬迁的后半已按用户裁定 2026-10-15 整簇暂缓**(重开条件见 `RAM使用分析与优化方案.md` §4)→ **这条 ⚠ 会长期挂着**,判读时按已知挂账处理,别每轮当新问题追;重开条件 → `RAM使用分析与优化方案.md` §4。 - **RTOS 堆 = 配额本身**:56 KB 即 `configTOTAL_HEAP_SIZE`(2026-10-12 保护任务 由 48 KB 扩容,见 §6; `heap_4.o` 另含 32 B 元数据,不计超);**改堆 = 改配额**,必须先过本文件 §6 登记。 @@ -96,8 +96,8 @@ UI 16 KB / RTOS 堆 56 KB / 应用 8 KB**。归集口径(按 `.map` 对象名 | 日期 | 变更 | 原因 / 出处 | |---|---|---| -| 2026-10-12 | 建档:三件套落地(本台账 + `scripts/ram_baseline.py` + `scripts/ram_baseline.tsv` + pre-commit `mem-budget` 钩子) | 登记簿 N-27 前半 | +| 2026-10-12 | 建档:三件套落地(本台账 + `scripts/ram_baseline.py` + `scripts/ram_baseline.tsv` + pre-commit `mem-budget` 钩子) | 缩堆迁 CCM 后半的前半 | | 2026-10-12 | **RTOS 堆配额 48 KB → 56 KB**(`QUOTAS` 同步) | 保护任务 protectTask 立项:iec104Task(2.5KB)+protectTask(2KB)+TCB 入堆后 48KB 池 min_ever 预估跌破 3,072 B 告警线 → `.ioc` 语义取数与有效性参数 `configTOTAL_HEAP_SIZE` 49152→57344(CCM 水位 75.3%→87.9%,仍 <92% 门禁;CCM 空闲降至 ≈8 KB)。连带影响见 §3 迁 CCM 后半链注记 | -| 2026-10-12 | **任务栈 +1536 B(堆内用量,配额 56 KB 不变)**:defaultTask 1024→1280 words(+1024 B)、timeSyncTask 512→640 words(+512 B);产品任务栈合计 37,632→39,168 B | 登记簿 N-33 栈收口:保护定值持久化把 defaultTask 静态链推到 3016 B(余 1080 < 30% 线)、timeSyncTask 链 1264 B(余 784 < ISR 底线 1024);台架复测背书 min_ever=10000 → 抬后实测 `heap free=16400 / min_ever=8464`(与预算 −1536 完全吻合,>3072 告警线);`stack_report` 9 任务 0 FAIL + `@test` PASS,见 `RAM使用分析与优化方案.md` §1.4 | +| 2026-10-12 | **任务栈 +1536 B(堆内用量,配额 56 KB 不变)**:defaultTask 1024→1280 words(+1024 B)、timeSyncTask 512→640 words(+512 B);产品任务栈合计 37,632→39,168 B | 栈收口:保护定值持久化把 defaultTask 静态链推到 3016 B(余 1080 < 30% 线)、timeSyncTask 链 1264 B(余 784 < ISR 底线 1024);台架复测背书 min_ever=10000 → 抬后实测 `heap free=16400 / min_ever=8464`(与预算 −1536 完全吻合,>3072 告警线);`stack_report` 9 任务 0 FAIL + `@test` PASS,见 `RAM使用分析与优化方案.md` §1.4 | | 2026-10-29 | **故障录波数据面入册**:新增对象 `wave_ring.o` 5,300 B(ZI 5,256 + RW 44,落 SRAM1、CCM 增量 0);`default_task.o` 静态 2,736 → 3,940 B(+1,204 B,落盘道 `FIL` 528 + 分片缓冲 256 + 段头副本 136 + 段路径 17 + 打包上下文与 `DIR`/`FILINFO`);`RW_IRAM1` 81,536 → 89,936 B(62.2 % → 68.6 %,仍远低于 92 % 门禁);`RW_CCM` 三档恒 57,376 B | 决定人 lead。实测数字出自 lead 的权威构建(本工作树 `MDK-ARM/STM32F407-Demo/STM32F407-Demo.map`,0 错误 0 警告,`scripts/ram_baseline.py --update` 同批入 tsv);预估约 5.9 KB vs 实测数据面 +6,760 B 的差额构成与三档对照见 `docs/内存管理/内存内容分配策略.md` §6;**未抬栈**(`scripts/stack_report.py` 九任务全 PASS),判据出处 `docs/子系统设计/故障录波设计说明.md` §7 | | 2026-10-29 | **归集口径修正(非配额改动)**:`subsystem_of()` 补 `wave_` `iec104*` `soe_*` `meas` `freq` `run_par` `protect_task` `task_prof` `boot_stats` `vol_idle_sync` 等前缀——12 个 `App/` 对象 9,445 B 此前静默落「其它」;「应用」16,888 → 26,333 B、「其它」15,849 → 6,404 B,区域水位与 92% 红线均未变。同脚本加兜底:`App/**/*.c` 的对象落进「其它」时 `--gate` 逐条 WARN(不拦) | 配额表看不见录波/SOE 支路;口径依据本文件 §2「应用 = `App/` 其余」 | diff --git a/docs/子系统设计/ADC采样节拍设计说明.md b/docs/子系统设计/ADC采样节拍设计说明.md index 4a4cf1ba..02302c65 100644 --- a/docs/子系统设计/ADC采样节拍设计说明.md +++ b/docs/子系统设计/ADC采样节拍设计说明.md @@ -365,7 +365,7 @@ t = 1000 µs 下一个更新事件 | 项 | 现状 | 说明 / 出口 | |---|---|---| -| **8 路电气量分属两片转换器** | 跨转换器**没有共同采样触发点** → 无同一时刻性、相位不确定 | **V0.1 硬件缺陷**(登记簿条目「双转换器无共同采样触发」):V0.1 上**禁止**跨转换器做相位 / 功率 / 功率因数 / 矢量运算;根治要改板(8 路全接 TPAFE) | +| **8 路电气量分属两片转换器** | 跨转换器**没有共同采样触发点** → 无同一时刻性、相位不确定 | **V0.1 硬件缺陷**:V0.1 上**禁止**跨转换器做相位 / 功率 / 功率因数 / 矢量运算;根治要改板(8 路全接 TPAFE) | | STM32 侧数据滞后 | 固定 1 拍(1 ms) | 乒乓半区的结构代价;因上一条,不新增误差(§4.4) | | TPAFE 侧仍是"脉冲 + 中断读" | ISR 内 GPIO 脉冲、`BUSY` EXTI 逐通道读 8 次,**未 DMA 化** | 单点成本约 0.5 µs,非当前瓶颈;DMA / FMC 化的**前提未定**:接口类型与 `DRDY`、读时序须先用逻辑分析仪确认 | | 等周波调频 | **硬件侧已具备**:1 µs 分辨率 + ARR 预装载 + 唤醒与生产同源 → 运行期 `__HAL_TIM_SET_AUTORELOAD(&htim3, 周期µs - 1)` 即可无毛刺改频,**消费节拍自动跟随** | 采样率随动到相量窗与定值不在本层;测频见 `App/algo/freq.c`,上位需求见 `docs/算法/继电保护功能复现规划.md` §3.1 | diff --git a/docs/子系统设计/IEC104上行设计说明.md b/docs/子系统设计/IEC104上行设计说明.md index a66afc9d..e5d31198 100644 --- a/docs/子系统设计/IEC104上行设计说明.md +++ b/docs/子系统设计/IEC104上行设计说明.md @@ -3,7 +3,7 @@ > **定位**:DTU 上行规约 IEC 60870-5-104(DL/T 634.5104-2009)的设计基线—— > 范围、点表、链路流程、板端接入、预算与测试。规格来源 > `docs/算法/继电保护功能复现规划.md` §1.5(产品定义,验收 = 省电科院点表); -> 代码落点 `App/protocol/iec104/`;未闭环的送检验收挂 `docs/任务规划/登记簿.md` §7。 +> 代码落点 `App/protocol/iec104/`;未闭环的送检验收见本文 §8。 > **角色**:本 DTU = **被控站(受控端)**,104 **TCP 服务器,端口 `[comm]` 段 `port`(工厂默认 2404)**;主站 > (控制端,点表参考 `192.168.1.199`)主动连入。 @@ -70,7 +70,7 @@ | 19~20 | 零序过流 Ⅰ/Ⅱ | 「三段式零序过流」未实现 | ❌ IV | | 21~22 | 接地故障/重载 | 未实现 | ❌ IV | | 23 | 过载 | `PE_OL` asserted | ✅ | -| 24~30 | 外部遥信(RS-485) | RS-485 采集链路 暂缓(`docs/任务规划/暂缓-RS485.md`) | ❌ IV | +| 24~30 | 外部遥信(RS-485) | RS-485 采集链路暂缓(`docs/产品需求/产品需求设计文档.md` §5.10) | ❌ IV | | 31 | 保护闭锁 | `prot_set_locked()` | ✅ | | 32~33 | 预留 | — | ❌ IV | diff --git a/docs/子系统设计/屏板链路设计说明.md b/docs/子系统设计/屏板链路设计说明.md index 761f18d6..2719c0a7 100644 --- a/docs/子系统设计/屏板链路设计说明.md +++ b/docs/子系统设计/屏板链路设计说明.md @@ -189,7 +189,7 @@ flowchart TB 节拍 + 渲染地板 61.3 ms 占住,见 §7 表)→ **这一答发出去的是按键之前的画面(白发)**; 新内容只能随下一次召唤带出。三个结构性主因:①键召唤答旧帧;②`uiTask` FULL 整屏渲染地板 61.3 ms;③召唤周期 ~275-280 ms(带键最早 205 ms)。放大器④:远端查看器在连时 -`ui_net_sink_poll()` 可阻塞到秒级(登记簿「远端推流阻塞 uiTask」专项,本轮只裁案不做)。 +`ui_net_sink_poll()` 可阻塞到秒级(7003 解耦专项,本轮只裁案不做)。 典型 **~250-450 ms**、最坏 **~500 ms**;④ 发作时秒级。 **修复后(2026-10-30,用户裁定三处全做)**: @@ -207,10 +207,10 @@ flowchart TB 61.3 ms)→ 组帧 ~0.5 ms → 放行 ≤1 ms → 线上 59.6 ms → **典型 ~70-135 ms**(修复前 250-450 ms);uiTask 饿死场景 **~200 ms 保底发旧帧**(修复前同场景秒级且白发一帧)。 统计口径:TX 上报行新增 `dfok=`(新帧放行次数)与 `dfold=`(扣满 140 ms 发旧帧次数—— -**dfold 在涨 = uiTask 被饿 ≥140 ms 的直接证据**,与登记簿「reconcile 突发饿死 uiTask」对拍)。 +**dfold 在涨 = uiTask 被饿 ≥140 ms 的直接证据**,与网络自愈架构设计 §8 的 reconcile 突发饿死 uiTask 一条对拍)。 **没动的**:屏板固件(外部工程 DTU-LCD,用户裁定不改)、召唤节奏(280 ms 是屏板的,主机 -单方面把"下一次召唤"的期望值提前不了)、7003 解耦(只留方案在登记簿)。主机单测 +单方面把"下一次召唤"的期望值提前不了)、7003 解耦(方案留在本节,未实施)。主机单测 `TC-SBLINK-030~033` 钉住扣件/放行/截止/四边界(套件 164/164)。 ## 8. 对外接口(单一出处在各头文件,这里只列形状) diff --git a/docs/子系统设计/控制台单写者日志设计说明.md b/docs/子系统设计/控制台单写者日志设计说明.md index 554cb2fe..4d7ee598 100644 --- a/docs/子系统设计/控制台单写者日志设计说明.md +++ b/docs/子系统设计/控制台单写者日志设计说明.md @@ -415,7 +415,7 @@ sequenceDiagram ## 附录:日志静默观察项 × 步骤 8 合并评估(2026-10-25,道F 第二轮 / task-18,零代码改动) -> 评估任务(登记簿曾登记的**日志静默观察项**,已销项;残余动作是「与步骤 8 合并评估」):该观察项 +> 评估任务(**日志静默观察项**,已销项;残余动作是「与步骤 8 合并评估」):该观察项 > (49s 全系统日志静默,2026-09-22 L3 台架世代号 181)与步骤 8(日志非阻塞化,需求 > 出处 = `docs/测试说明/专项验证/链路延迟测试说明.md` §9.2/§10.2)的合并性价比判定。 > 评估纪律 = 结论即交付,不顺手重构;本节结论:**无需最小实现**(不新增代码)。 @@ -472,7 +472,7 @@ D4 否决理由对现状仍逐条成立(115200 发送率低、日志行稀疏 冷却路径核对)。 - **处置建议**:该观察项保留为低风险观察,至拆链修复版(merge 969fc5c)的 V5 复跑(判据 = 运行期 `[WD] task stall` 与非开机 `MISS start` 双零,台架由 - lead 排窗)达成后销项;本附录即销项结论落点。登记簿相应两行与波次行 + lead 排窗)达成后销项;本附录即销项结论落点。排期相应两行与波次行 的清理归单写者(lead)。 ### A.4 评估后的遗留面(全部既有,无新增) @@ -482,4 +482,4 @@ D4 否决理由对现状仍逐条成立(115200 发送率低、日志行稀疏 | ORE 僵尸根治(改只发不收) | §12 / §13-O4 | **2026-10-26 用户裁定不做**;量尺 `dbg_console_tx_timeout()` 保留,将来重评直接用 | | `tx_timeout` 读口接线(STALL 证据行加字段) | §13-O2 | 涉 `App/util/task_watchdog.c` 与被解析证据行的台架判据,非本卡写域;维持 O2“后续项” | | 未注册期裸发互斥 / `printf` 遗留开销 | §13-O1/O3 | 现状 = 纪律已落地,开机日志密度上升再议 | -| 日志静默观察项 | 登记簿曾登记(已销项) | 见 A.3:V5 复跑双零后销项(归 lead) | +| 日志静默观察项 | 曾登记(已销项) | 见 A.3:V5 复跑双零后销项(归 lead) | diff --git a/docs/子系统设计/故障录波设计说明.md b/docs/子系统设计/故障录波设计说明.md index 41c062fd..c0771fc4 100644 --- a/docs/子系统设计/故障录波设计说明.md +++ b/docs/子系统设计/故障录波设计说明.md @@ -23,7 +23,7 @@ - `§8` 现场回放显示契约 - `§9` 观测:只加一条周期行 - `§10` 测试与门禁,含 bench 自抓红线 -- `§11` 与标定任务卡(`../任务规划/登记簿.md` §7)的三处口径变更 +- `§11` 与标定折算(`docs/算法/采集与算法层设计说明.md` §13.13)的三处口径变更 - `§12` 风险 `§13` 范围边界 `§14` 与其它文档的关系 --- @@ -333,7 +333,7 @@ flowchart TD **bench 定时自抓的红线**:定周期自抓在 1 kHz / 8 路下每 2 s 一段,每 5 分钟就是一轮 NAND 写。**长时间挂着它白烧写次数**,而 dhara 的坏块记账是持久代价、普通恢复清不掉(`AGENTS.md` 测试构建节,`docs/测试说明/专项验证/存储维护与容量恢复.md`)→ 定时模式必须**默认关闭 + 有时长上限 + 启动时打一次告警**,用完立刻回产品构建。 -**本波执行顺序(2026-10-30 并入原卡片登记簿 §3;BENCH 与 COOL 两个判定就是「板级那一轮」未跑的回路,DONE = 台账回填 + 文档现状化)**: +**本波执行顺序(2026-10-30 并入本文;BENCH 与 COOL 两个判定就是「板级那一轮」未跑的回路,DONE = 台账回填 + 文档现状化)**: ```mermaid flowchart TD @@ -367,7 +367,7 @@ bench 锁全程持有(收工 release,PASS 证据就是本小节);设备 | 冻结窗口内 104 上送无恙(**正式判据项**) | 参考主站 `test/host/iec104_master.py` 全程跑在落盘窗口内:GI 扫描(双点组 / 单点组 / YC 组 / 频率)+ actterm + 定值读回全绿,**唯二 FAIL 是两条 COV 腿 = 标定闭锁腿(OC1 不出口,物理预期,非链路故障)**;全程无链路异常、无 send fail | | `drop` 观测 | 每冻结窗约 400–640 点(51–79 拍 × 8 路)入账,量级 = SEALED 态每拍 push +8 直到落盘 ACK 的窗口长度;`seg` 无丢段、`err`=0,采集无恙——纯观察项非失败(「丢样本不丢采集」的实测面) | -**新发现缺陷「回放页段表枚举恒空(板级)」**(原登记 `docs/任务规划/登记簿.md` §2,**2026-11-02 修复闭环后按「完成即销项」删行,完整记录即本小节**):回放页真机开屏恒显 +**新发现缺陷「回放页段表枚举恒空(板级)」**(**2026-11-02 修复闭环,完整记录即本小节**):回放页真机开屏恒显 「无录波段」,而 FTP `LIST` 六段全见、`RETR`/`DELE` 正常。判别面(五个独立复核,全非偶然): 手动触发照常成段(计数 + 真文件都在)⇒ 写侧取卷锁正常;SOE 记录页(同一条 `vol_lock_wait(0)` try 锁纪律)照常读出并显示 ⇒ try 锁读径正常;`manual_req` 作废段表缓存后重扫**仍空** ⇒ 不是 @@ -598,7 +598,7 @@ Before/After 表与串口原文。 | 动态波形验证读数的地方 = 派生标量(`meas:` / 104 / `phasor(hb)`) | 派生标量仍是**判据**,但样本改从录波段导出 → 判据升级为「PC 独立重算 vs 板上读数」对表 | 录波段就是现成的样本来源,不必再造一条串口通路 | | 动态波形验证「手边可做、排在最前」 | 排在录波 P1 之后(用户裁定 2026-10-29:录波先行) | 先有样本通路,验证才不留遗憾 | -(2026-10-30 更新:原卡片登记簿已销项并入本文,§10 尾有本波执行顺序图;排期顺位在 `docs/任务规划/README.md` §2.0「独立」行。) +(2026-10-30 更新:原卡片已销项并入本文,§10 尾有本波执行顺序图;排期顺位在 `docs/任务规划/README.md` §2.0「独立」行。) --- @@ -635,7 +635,7 @@ Before/After 表与串口原文。 | 文档 / 工作 | 关系 | |---|---| -| 原任务规划《故障录波》卡片登记簿(2026-10-30 销项删除) | 卡片判据与顺序图已并入本文 §9 与 §10;排期顺位归 `docs/任务规划/README.md` §2.0「独立」行——判据不再另立文件 | +| 原任务规划《故障录波》卡片(2026-10-30 销项删除) | 卡片判据与顺序图已并入本文 §9 与 §10;排期顺位归 `docs/任务规划/README.md` §2.0「独立」行——判据不再另立文件 | | `docs/算法/采集与算法层设计说明.md §13` | 上游:静态与动态信度、削顶归属由它定义;本文 §11 记录因录波而变的三处口径 | | `docs/子系统设计/ADC采样节拍设计说明.md` | 数据源与节拍属主;本波**不改**它,二期改节拍时必须回头改它 | | `docs/架构设计/STM32F4-Base存储架构说明.md` §10.1 | FatFs 陷阱与 8.3 短名的属主;本文 §5.2 只是消费者 | diff --git a/docs/子系统设计/看门狗设计说明.md b/docs/子系统设计/看门狗设计说明.md index ab745a94..2077a4da 100644 --- a/docs/子系统设计/看门狗设计说明.md +++ b/docs/子系统设计/看门狗设计说明.md @@ -479,7 +479,7 @@ snapshot == required → miss_streak=0、证据门闩复位、喂狗 | R6 | **`RCC_CSR` 读后即清** | 已在 `main.c` 统一处理;漏清会让下次软复位读回上次标志 | | R7 | **UI 推流的网络往返卡死不占心跳位**(产品掩码仍 `0x77`) | 刻意:往返卡死的根因在 netTask,netTask 已在掩码内、由它暴露;为"远端显示卡了"新增一位只会把观感问题升级成整机复位。UI 心跳已由自身喂位自产、不受推流影响;推流耗时看 `[PROF]` 的 `uis`/`uisn`。成因与判读见本文 **§11.3 第 2 条**;门控方案与残留暴露见 `../UI设计/RemoDispBus协议与接收设计说明.md` §3 | -### 9.2 未办项(登记簿同步) +### 9.2 未办项 | 条目 | 内容 | 与本案关系 | |---|---|---| @@ -559,7 +559,7 @@ python scripts/check_cubemx_survival.py --write # 确认改动无误后重建 > **来源**:`[ERR][WD] task stall: mask=0x00000067 req=0x00000077`(缺 bit4 = `TASK_WD_UI`) > 的完整归因与处置。故障本身已结案——**累计 38 次上板启动 0 复现**(主机侧回归的早期基线 3/10), -> 原始分析文档按登记簿"完成即销项"规则删除。本节只留**可复用的判读口径、诊断方法、 +> 原始分析文档按"完成即销项"规则删除。本节只留**可复用的判读口径、诊断方法、 > 实测基线与教训**;ADC 侧的处置细节在 [`ADC采样节拍设计说明.md`](ADC采样节拍设计说明.md) §6 与 §9, > UI 推流门控在 `../UI设计/RemoDispBus协议与接收设计说明.md` §3,就绪门控 API 在 > `../网络/BSD_Socket_API_使用指南.md` §10.1。 diff --git a/docs/子系统设计/网络配置说明.md b/docs/子系统设计/网络配置说明.md index d3257019..d21cef58 100644 --- a/docs/子系统设计/网络配置说明.md +++ b/docs/子系统设计/网络配置说明.md @@ -183,8 +183,9 @@ write=1 | `ca` | 公共地址(= 链路地址,ASDU 头 2B) | 1 | 1 ~ 65535 | | `port` | 被控站 TCP 监听端口 | 2404 | 1024 ~ 65535 | -- **生效 = 改后重启**(与 [network] 免重启重建**不同**,验收口径 → - `docs/任务规划/登记簿.md` §7「通讯设置页真机判据」):iec104Task 启动时读一次 getter; +- **生效 = 改后重启**(与 [network] 免重启重建**不同**;台架判据 = 改 `port` 后重启, + 看实际监听端口是否跟着变,以及配置段数与键数上限 `CFG_FILE_MAX_KEYS = 16` 核对): + iec104Task 启动时读一次 getter; 端口另在下次重 bind(拆链/代次重建)自然生效。不挂段回调、不新增事件位—— CH395F 单连接 socket 上「换端口/拒绝重听」= close + re-listen,做成热生效 会被端口扫描打成 SPI/看门狗风暴(详论 → 本段只登记,正文唯一详述处 = diff --git a/docs/子系统设计/运行与自检记录设计说明.md b/docs/子系统设计/运行与自检记录设计说明.md index 1b017313..e42c7a64 100644 --- a/docs/子系统设计/运行与自检记录设计说明.md +++ b/docs/子系统设计/运行与自检记录设计说明.md @@ -171,7 +171,7 @@ defaultTask(唯一写者,挂载成功后): ``` - **日志读写放大收口(2026-10-15,写侧):一次排空合并成"每文件一次 open/write/close"**。旧实现每条记录一轮,而 `f_close` 要回写目录项、`f_write` 要对目标扇区做读-改-写 → **每条日志 2~4 次 NAND 页读写**。现在同一文件的一批(≤8 条 = 512 B 静态缓冲 `s_batch`)合并成一次追加写: - - **掉电语义不变**:批次仍在**同一次 `syslog_drain()` 调用内**写完并 `f_close`;`f_close` 内部 `sync_fs` → `disk_ioctl(CTRL_SYNC)` 会 `ftl_flush_cache()` 把 FTL 的单页写回缓存刷进 NAND(`Drivers/BSP/GD5F2GQ5UE/nand_ftl.c` 的 `CTRL_SYNC` 分支)。落盘时机与旧实现每条 close 等价,**批次不跨调用驻留 RAM**:"写完即关"的路径关文件即落盘,残余只到"单次写事务进行中掉电/复位"为止(`../任务规划/登记簿.md` 条目「写回缓存空闲 flush」:无空闲/掉电前周期 flush,2026-10-22 用户裁定暂不做)。 + - **掉电语义不变**:批次仍在**同一次 `syslog_drain()` 调用内**写完并 `f_close`;`f_close` 内部 `sync_fs` → `disk_ioctl(CTRL_SYNC)` 会 `ftl_flush_cache()` 把 FTL 的单页写回缓存刷进 NAND(`Drivers/BSP/GD5F2GQ5UE/nand_ftl.c` 的 `CTRL_SYNC` 分支)。落盘时机与旧实现每条 close 等价,**批次不跨调用驻留 RAM**:"写完即关"的路径关文件即落盘,残余只到"单次写事务进行中掉电/复位"为止(无空闲/掉电前周期 flush,2026-10-22 用户裁定暂不做)。 - **条目不丢**:启动前数组按下标"看而不删",整批成功才删;队列条目在落盘失败(-2 卷忙 / -1 写失败 / -3 容量不足)时**回投队列**。 ⚠ **2026-10-24 更正本条**:旧实现里 -2 只在**按条慢路径**被正确回投,**批量路径根本没有 -2 分支**(`done` 保持 `n` → 回投循环空转)→ 卷忙时一批(≤8 条)既不落盘也不回投、静默丢失,而本节长期写着"条目不丢"替它背书。现已补 `rc == -2` 分支整批回投(不计故障、不打日志、保序),由 `test/host/sys_log_mcu/` 的 TC-SYSLOG-035 组逐条钉住。**真机必验**:FTP 传输期间持续投日志,传输结束后条数 == 投递条数、顺序不乱。 - **容量轮转仍只在按条慢路径做**:批量路径发现剩余容量装不下一批时返回 -3,退回逐条 `s_append()`("满了 unlink 重建"只保留一处实现,避免一批跨多轮重建)。 diff --git a/docs/文档规范.md b/docs/文档规范.md index 27bcc282..915cc426 100644 --- a/docs/文档规范.md +++ b/docs/文档规范.md @@ -375,7 +375,7 @@ | 项目级铁律、构建/烧录/测试命令、平台约束 | `AGENTS.md`(AI 协作上下文,**精简优先**) | | 开发者入门、架构速览、目录导航 | `README.md` | | 详细设计、专项说明、测试指南 | `docs/` 下对应子目录 | -| 跨文档待办登记 | `docs/任务规划/README.md`(统一登记簿) | +| 跨文档待办登记 | 各模块文档的「已知限制/重开条件」节(顺序归 `docs/任务规划/README.md`) | | 评审报告与专项审计 | `docs/问题记录/` | > **避免重复**:同一事实只在一处详述,其它位置用链接指向。典型如 FreeRTOS 任务表——`Src/freertos.c` 是唯一事实源,`README.md`/`AGENTS.md` 的表由脚本生成,不在别处再抄一份。 diff --git a/docs/架构设计/STM32F4-Base存储架构说明.md b/docs/架构设计/STM32F4-Base存储架构说明.md index 02f0f5af..6e604681 100644 --- a/docs/架构设计/STM32F4-Base存储架构说明.md +++ b/docs/架构设计/STM32F4-Base存储架构说明.md @@ -34,7 +34,7 @@ HAL_Init → SystemClock_Config → MX_GPIO/DMA/USART1/SPI2/SPI1/I2C1/UART4/IWDG ├─ adcTask → TIM3 1kHz 唤醒,ADC 采集(纯消费者) ├─ iec104Task → IEC 60870-5-104 上行(默认 :2404) ├─ protectTask → 保护判据 20ms 节拍 - └─ rs485Task → 未创建(RS-485 暂缓,见 docs/任务规划/暂缓-RS485.md) + └─ rs485Task → 未创建(RS-485 暂缓,见 docs/产品需求/产品需求设计文档.md §5.10) ``` --- @@ -730,7 +730,7 @@ LPN 与原始码的位置**就地分类并打印(`ftl_err_name()` 给可读名 ### 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` 调用点) @@ -751,7 +751,7 @@ LPN 与原始码的位置**就地分类并打印(`ftl_err_name()` 给可读名 LVGL 的 FatFs 驱动桥(`Lib/lvgl/src/libs/fsdrv/lv_fs_fatfs.c`)`LV_USE_FS_FATFS` 默认关闭、本仓未接线,不是卷使用者;`test/board/` 的存储测试任务仅存在于互斥测试 -构建(`test-suite-switch` 门禁),不在产品镜像。**登记簿原口径「卷锁仅覆盖 +构建(`test-suite-switch` 门禁),不在产品镜像。**原口径「卷锁仅覆盖 syslog/cfg/lftpd 三条路径」是 2026-10-02 建档快照,已被本表取代**——SOE、录波段写、 `/prot_set.bin`、UI 读径与空闲 sync 随后都进了同一把锁。 @@ -767,4 +767,4 @@ defaultTask(喂狗点)内也不饿狗,残留形态收敛为「有界时长 复位默认值的 P0 修复,见 `../子系统设计/看门狗设计说明.md` 变更记录),此后 2026-10-25 F2/F3 探针轮、2026-11-02 录波枚举台架轮(卷锁 try 超时 0 次)、 2026-11-05 PR #82 补验 soak(STOR 密集)均无该签名。重开判据不变:**台架再出 -存储侧喂狗饥饿才排期**;观察行留登记簿 §2。 +存储侧喂狗饥饿才排期**;观察结论留本节。 diff --git a/docs/架构设计/项目启动顺序管理.md b/docs/架构设计/项目启动顺序管理.md index b4537472..e91d89c9 100644 --- a/docs/架构设计/项目启动顺序管理.md +++ b/docs/架构设计/项目启动顺序管理.md @@ -18,7 +18,7 @@ | `iec104Task` | IEC 60870-5-104 上行(工厂默认 :2404 监听 + link 状态机,IEC 104 上行) | `osEventFlagsWait(SYS_EVT_NET_READY, … \| osFlagsNoClear)` | | `adcTask` | TIM3 1kHz 采样节拍**纯消费者**(`adc_input_poll()`,语义取数与有效性/全周傅氏相量取数,不做保护运算) | **无事件位依赖**:TIM3 ISR 内 `adc_tick_irq_notify()` 直接唤醒(TIM3 比调度器早 ≈100ms 启动,ISR 侧只能走该通知函数) | | `protectTask` | 保护判据 20ms 节拍(`prot_elm_run()`,保护判据,保护任务) | 无(节拍自持,不依赖网络) | -| `rs485_task` | RS-485 通信(任务体已实现) | **未在 `freertos.c` 创建**(RS-485 采集链路 暂缓,见 `docs/任务规划/暂缓-RS485.md`) | +| `rs485_task` | RS-485 通信(任务体已实现) | **未在 `freertos.c` 创建**(RS-485 采集链路暂缓,见 `docs/产品需求/产品需求设计文档.md` §5.10) | ### 1.2 改造前(已废弃)的依赖管理手段 > 以下为引入 Event Flags 之前的历史做法,仅作背景记录,当前代码已不再使用。 diff --git a/docs/架构设计/项目架构总览.md b/docs/架构设计/项目架构总览.md index 96528cdf..0d61434a 100644 --- a/docs/架构设计/项目架构总览.md +++ b/docs/架构设计/项目架构总览.md @@ -56,7 +56,7 @@ > **与 §1 分层图的分工**:§1 回答「谁属于哪一层、层间单向依赖」,本图回答「一条数据从引脚走到 104 报文 / 显存 / 记录文件要穿过哪些框、谁在什么时候被谁唤醒」。图里的五条纵带只是**列分组**(便于对齐),不是依赖声明——依赖方向仍以 §1.1 表与 `layer-deps` 门禁为准。 > 影响链路走向的两条行为条件已画进图内(RS-485 未接线 → 暂缓接语义取数层;跨任务握手集中经 `就绪屏障`);其余行为条件(未标定闭锁、`osFlagsNoClear`、CH395F 单连接、V0.1 双转换器无共同采样触发)不在图上重复,见 AGENTS.md「项目概况 / 平台约束」与 §2.2、§5。 -> `*` `rs485_task.c` 任务体已实现,但**当前未在 `freertos.c` 创建**(RS-485 采集链路 暂缓,见 `docs/任务规划/暂缓-RS485.md`);`adc_task.c` 已于 2026-10-10 接入创建(`adcTask`)。 +> `*` `rs485_task.c` 任务体已实现,但**当前未在 `freertos.c` 创建**(RS-485 采集链路暂缓,见 `docs/产品需求/产品需求设计文档.md` §5.10);`adc_task.c` 已于 2026-10-10 接入创建(`adcTask`)。 > 串口三分(2026-10-29 屏板批 0 后的定态):**USART1 = 屏板链路 700 kbaud**、**UART4 = RS-485(115200,未接线)**、**UART5 = 控制台日志 115200**——日志口原在 USART1,屏板占用后迁至 UART5(RS232#1 台架线改接日志口)。 --- diff --git a/docs/测试说明/专项验证/ADC前端注入验证流程.md b/docs/测试说明/专项验证/ADC前端注入验证流程.md index e71899aa..efe36d5a 100644 --- a/docs/测试说明/专项验证/ADC前端注入验证流程.md +++ b/docs/测试说明/专项验证/ADC前端注入验证流程.md @@ -250,7 +250,7 @@ TPAFE 双极性补码可注负压;STM32 单极性负半周测不了。UA/UN/IA | STM32(`UB`/`UC`/`IB`/`IC`/`IN`) | 0~3.3 V 单极性 | 无正向意义 | 只在削顶轮用:注交流 = **故意触底**,负半周本就钉 0 | 3. **一次只注一路**(相位轮除外,它要 `UA` 与 `UN` 两路同源),换表笔前先关输出。端子侧串阻 **1 k**(R31/R28/R19/R52…)。STM32 五路负半周经**片内**钳位灌向 VDDA(网表 `docs/硬件平台/V0.1.tel` :228-241 实证:无外置钳位二极管、无隔直电容);Vpp 2.828 V 时峰值电流 ≈ **1.1 mA**(量级估算),**别往上加幅度**——这种注入只允许出现在削顶轮。 -4. **电流通道也是注电压**:`IA` 注入点同样是电压进 R19 端子侧。这一轮证"给定引脚电压算得对不对",不是"一次侧 1 A 怎么办"——后者要变比,属 `docs/任务规划/登记簿.md §7` 的端子 / 子板变比确认。 +4. **电流通道也是注电压**:`IA` 注入点同样是电压进 R19 端子侧。这一轮证"给定引脚电压算得对不对",不是"一次侧 1 A 怎么办"——后者要变比,见 `docs/硬件平台/ADC通道映射说明.md` §7.2 的端子 / 子板变比登记。 ### 8.4 记录表抬头(每条用例一份,与日志一起归档) @@ -408,7 +408,7 @@ TPAFE 双极性补码可注负压;STM32 单极性负半周测不了。UA/UN/IA | 注入分量 | 发生器设定 | UI 读数 (V) | 期望 (V) | 偏差 % | `phasor` 旁证 | 结论 | |---|---|---|---|---|---|---| | A 只注二次 | 100.00 Hz / Vpp 0.453 V | `Ia=0` / `Ia2=0.158` / `Ia5=0` | 0.160 / ≈0 | **−1.25 %** | —(A/B 步落在 18:22–18:28 日志盲区,心跳旁证未留) | **过**(±2 % 内;选择性成立——100 Hz 没漏进基波 / 五次桶) | -| B 只注五次 | 250.00 Hz / Vpp 0.453 V | `Ia=0` / `Ia2=0` / `Ia5=0.153`(2026-11-04 复测;11-02 初读 0.152) | ≈0 / 0.160 | **−4.4 %**(超 ±2 %) | —(两轮均未留 250 Hz 心跳旁证——带外信号 `meas:` 判不了,见上卡旁证行) | **过——已按「板端真实衰减」关闭(2026-11-04)**:−4.4 % = IA 前端差分滤波(C35 = 100 nF + R19/R21 各 1 k,一阶低通 fc ≈ 796 Hz)在 250 Hz 的真实衰减,**板端读数忠实,量与算都没错**(模型与数据 `docs/硬件平台/ADC通道映射说明.md` §8.2);工频 50 Hz 仅 −0.2 %,不受影响;选择性成立(基波 / 二次桶 = 0);谐波功能要板改(C35 换 10 nF)——登记 `docs/任务规划/登记簿.md` §3 | +| B 只注五次 | 250.00 Hz / Vpp 0.453 V | `Ia=0` / `Ia2=0` / `Ia5=0.153`(2026-11-04 复测;11-02 初读 0.152) | ≈0 / 0.160 | **−4.4 %**(超 ±2 %) | —(两轮均未留 250 Hz 心跳旁证——带外信号 `meas:` 判不了,见上卡旁证行) | **过——已按「板端真实衰减」关闭(2026-11-04)**:−4.4 % = IA 前端差分滤波(C35 = 100 nF + R19/R21 各 1 k,一阶低通 fc ≈ 796 Hz)在 250 Hz 的真实衰减,**板端读数忠实,量与算都没错**(模型与数据 `docs/硬件平台/ADC通道映射说明.md` §8.2);工频 50 Hz 仅 −0.2 %,不受影响;选择性成立(基波 / 二次桶 = 0);谐波功能要板改(C35 换 10 nF)——登记 `docs/任务规划/登记簿.md` §1 | | C 纯基波 | 50.00 Hz / Vpp 0.453 V(实际按 0.453 注,Vpp 2.263 那档未做) | `Ia=0.160` / `Ia2=0` / `Ia5=0`(2026-11-04 复测;11-02 初读 0.159) | ≈0 / ≈0 | 基波 **0.0 %**(对 0.160 读数;11-02 为 −0.6 %) | **有**:18:33:43 起串口可见窗 `C01 rms=1 / C04 rms=0 / C05 rms=0`,与 C 步工况吻合;2026-11-04 复测窗串口 `ia_mv=159↔160` 同刻印证屏显 | **过**(两谐波轨零值经串口旁证补认;基波读数两轮 ≤0.6 %,与幅值轮同档一致) | | 叠加(原行,**本轮不做**) | 基波 + 二次 + 五次同段 | — | — | — | — | 发生器无谐波叠加 / ARB 功能 → 本轮不做·设备缺口·TC-PHASOR-006 单测覆盖(`test/host/phasor/phasor_test.c`,3 条谱线各 ±1 %,实跑 57/57 PASSED) | diff --git a/docs/测试说明/专项验证/故障录波板级到场轮执行手册.md b/docs/测试说明/专项验证/故障录波板级到场轮执行手册.md index bd08a36b..9ae7a066 100644 --- a/docs/测试说明/专项验证/故障录波板级到场轮执行手册.md +++ b/docs/测试说明/专项验证/故障录波板级到场轮执行手册.md @@ -53,7 +53,7 @@ flowchart LR 1. **[agent]** 在 `App/task/ui_task.c` 的扫描函数给 `f_opendir`/`f_readdir` 失败分支加带 FR 码的留痕(顺带修伴生纪律:失败不许钉 `s_wave_scanned=1`)→ `/keil-build` 0 错误 0 警告 → 烧录(`-Rst -Run` + 回读校验,见 `docs/测试说明/测试工具/ST-LINK_CLI_复位使用说明.md`)。 2. **[agent]** 等 30 s 装置起来 → 远程走 UI 开回放页 → 串口读那条带 FR 码的新留痕。 -3. **你对结果做一次定性**(agent 会把原文贴给你):FR_DENIED → 锁纪律;FR_NO_PATH/FR_NOT_READY → 路径或挂载;FR_OK 但零条目 → readdir 与卷状态交互——**根因入登记簿,这条销项**。 +3. **你对结果做一次定性**(agent 会把原文贴给你):FR_DENIED → 锁纪律;FR_NO_PATH/FR_NOT_READY → 路径或挂载;FR_OK 但零条目 → readdir 与卷状态交互——**根因入 `docs/子系统设计/故障录波设计说明.md` §10,这条销项**。 4. **[agent]** 按根因出修复构建,重烧重验:回放页开屏应列出 WAVE00…05 六段、`↑↓` 切道 `←→` 切段照常、`l` 切段不再空。 5. **要烧几次板,都由 agent 盯**;你只在会话里看到"请确认烧录"时回一个"烧"字(烧录动作属 Ask-first 边界,agent 不会自己烧)。 @@ -103,7 +103,7 @@ flowchart LR **先讲人话**:过流启动录波的代码路已接在 `protect_task.c` 的启动边沿上(判据一 picked,录波同拍请求),但**保护判据现在整机闭锁**——`adc_cal_flags()` 的 VALID 位对 UA/UN/IA 三路都没置位,`protect_task` 直接停走判据。要让保护真出口,**必须先把这三路标定**;这正是 2026-10-25 你裁定"保持闭锁、不用万用表走捷径"守着的那道门。 -- **决定一(解锁)**:这一幕要不要用**发生器为参考**给 UA/UN/IA 做两点标定换保护触发路(src=P)验证?它**不是送检级标定**(端子变比还挂着 `docs/任务规划/登记簿.md §7` 的原理图确认),做出来的工程量是"发生器刻度下的近似值"。**点头 → 往下走;摇头 → 第三幕整体顺延到标准源轮,本文其余各幕照做。** +- **决定一(解锁)**:这一幕要不要用**发生器为参考**给 UA/UN/IA 做两点标定换保护触发路(src=P)验证?它**不是送检级标定**(端子变比是按参数算定的标称值,见 `docs/硬件平台/ADC通道映射说明.md` §7.2),做出来的工程量是"发生器刻度下的近似值"。**点头 → 往下走;摇头 → 第三幕整体顺延到标准源轮,本文其余各幕照做。** - **决定二(还锁)**:这一幕验完,把标定清回闭锁(还原出厂系数)还是**留着 valid** 让保护继续在线(此后 UI 显示与 104 遥测的二次值都按这份近似标定出数——**留着就要在台账注明非送检级**)。 步骤(决定一通过后): @@ -143,7 +143,7 @@ flowchart LR - [ ] `FILLER.BIN` 已从 `/` 删除;`/WAVE` 里**只剩真实段**(坏段样本若留着,在 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」里点名它是坏段,回放页翻到必须显拒收态——留着当常设负样本也行,二选一并记录) - [ ] 标定与定值按**决定二**处置完毕,处置结果已写进 `docs/子系统设计/故障录波设计说明.md` §10「板级远程半轮记录」的后续小节 - [ ] 设备跑的是**产品构建**且启动锚点全过;UI 停在主菜单;两把锁(build/bench)空闲 -- [ ] 现场记录表数值入档、抓屏证据归档到会话的 `ci-artifacts/wavebench/`,`docs/子系统设计/故障录波设计说明.md` §10 状态与登记簿同步销项 +- [ ] 现场记录表数值入档、抓屏证据归档到会话的 `ci-artifacts/wavebench/`,`docs/子系统设计/故障录波设计说明.md` §10 状态同步更新 ## 8. 出问题怎么办(三条,都别硬试) @@ -160,4 +160,4 @@ flowchart LR | 中 | 第三幕(保护触发) | 30~60 min(含两个决定) | **是**(多点注入接线 + 加流) | | 后 | 第四幕(bench 占卷) | 20~30 min | 否 | -第二、三幕共用同一次到场(都在 UA/IA 端子上做文章);第一、四幕可以排在任意工作日远程做。**四幕全过 = 录波本波收口**——`docs/任务规划/README.md` §2.0「独立」行的"一轮未跑"字样就可以清了。 +第二、三幕共用同一次到场(都在 UA/IA 端子上做文章);第一、四幕可以排在任意工作日远程做。**四幕全过 = 录波本波收口**——届时把 `docs/任务规划/README.md` §2.0「独立」行里“还没跑的”那三项清掉。 diff --git a/docs/测试说明/专项验证/链路延迟测试说明.md b/docs/测试说明/专项验证/链路延迟测试说明.md index c1638bdf..997555ee 100644 --- a/docs/测试说明/专项验证/链路延迟测试说明.md +++ b/docs/测试说明/专项验证/链路延迟测试说明.md @@ -444,7 +444,7 @@ med 65.0ms/max 133.5ms(133.5 = 压力启动瞬态单帧);**挂起 recv 化 ¹ 队列往返两行为 2026-09-22 上午分片时代(M2 RS-485 采集链路 档)数值:发送分块握手对 DONTWAIT 快速路径**逐位不变**(dispatch → `net_poll` → `get_recv_len` 读,无 readable 门控),pending tick 无 pending 时为纯指针读零 SPI -(µs 级)——机制上不影响队列往返;M2 重验未在本轮执行(低风险,留待 Phase 13 下次窗口,见 `docs/任务规划/README.md` 条目「队列往返基线待重验」)。 +(µs 级)——机制上不影响队列往返;M2 重验未在本轮执行(低风险,留待 Phase 13 下次窗口;该项未闭环,见 `docs/测试说明/板级测试/实机测试实施指南.md` §7.3)。 数据来源:SPI 字节命令/SPI DMA = §6.1;发送分块握手/队列往返/请求→首字节/整帧 3209B 往返 = M2 RS-485 采集链路 档(200ms、per-recv 日志已删)串口 `[LAT]` 行 (`../测试数据/m2_data/m2_quiet_r200.json`);生产路径帧周期/连接/重监听/uiTask 节拍 = **挂起 recv 构建 2026-09-22 16:42/16:43 重锁** diff --git a/docs/测试说明/单元测试/ADC输入层单元测试说明.md b/docs/测试说明/单元测试/ADC输入层单元测试说明.md index af31bad8..765c8059 100644 --- a/docs/测试说明/单元测试/ADC输入层单元测试说明.md +++ b/docs/测试说明/单元测试/ADC输入层单元测试说明.md @@ -263,6 +263,6 @@ test/host/adc_input/adc_input_test.c ### 4.3 不覆盖 V0.1 的硬件缺陷(双转换器无共同采样触发) -V0.1 上 8 路电气量分属两片转换器且**无共同采样触发**(登记簿条目「双转换器无共同采样触发」),本层只做**逐通道独立监视**。 +V0.1 上 8 路电气量分属两片转换器且**无共同采样触发**(`docs/任务规划/登记簿.md` §1),本层只做**逐通道独立监视**。 "跨转换器相量合成"(线 / 负序 / 零序)不得在本层或 全周傅氏相量上做——属「线/负序/零序合成」且 V0.1 受限 (见 `docs/算法/继电保护功能复现规划.md` §1.6)。 diff --git a/docs/测试说明/板级测试/CH395F_Test_Guide.md b/docs/测试说明/板级测试/CH395F_Test_Guide.md index 648a9bd4..d3bbd9f5 100644 --- a/docs/测试说明/板级测试/CH395F_Test_Guide.md +++ b/docs/测试说明/板级测试/CH395F_Test_Guide.md @@ -1133,7 +1133,7 @@ WAIT_CLOSE 阶段已内置二段补发(只补一次),生产 net 层则靠 主机单测(`test/host/net_socket/ns_s7_udp.c`,`docs/测试说明/单元测试/主机单测覆盖率口径.md` 第 4 轮) 把逻辑面钉死了,但芯片行为——DesIP 生效时机、UDP 的 SINT 触发、读指针上的残包排空——在桩里怎么编都"对"。 **这句话在 2026-11-04 被兑现了:桩里全绿的"按形态决定剥不剥",真机第一轮就翻车**(见下面「实测把设计改写了」)。 -下面 5 条就是那轮登记簿留下的「台架必验」的可执行形态。 +下面 5 条就是那轮留下的「台架必验」的可执行形态。 **架构**:板端一个 UDP socket,先 `net_bind(:6001)` 做服务端,再从收到的包里学对端地址回显。 **必须板端先听**:PC 侧是 DHCP(本轮实测 192.168.31.161),`net_test_task.h` 里那个 diff --git a/docs/测试说明/板级测试/实机测试实施指南.md b/docs/测试说明/板级测试/实机测试实施指南.md index c6fe43eb..f895da67 100644 --- a/docs/测试说明/板级测试/实机测试实施指南.md +++ b/docs/测试说明/板级测试/实机测试实施指南.md @@ -5,8 +5,7 @@ > **已完成事项**(S7、A1~A4)的实施细节与证据**不在本文**,见对应模块文档(§10 状态与去向)。 > **前置铁律**:本文所有步骤**均在接上 MCU / 串口 / ST-LINK 之后**执行; > 无实机时**只读本文,不执行任何烧录**。 -> **上游**:`docs/任务规划/README.md`(统一登记簿:P-x / N·S·T-x / -> S1x·A-x / 阶段排序 / 诊断基线)· +> **上游**:`docs/任务规划/README.md`(全项目阶段排序)· > `子系统设计/看门狗设计说明.md`(§7 验证记录)。 > **约定**:本文事项完成后**先销上游登记**,再把结论写进正文对应小节(本文不再记流水,过程查 `git log`); > 结论与证据沉淀进对应模块文档/问题记录(2026-10-02 台架窗口的完整取证链—— @@ -101,7 +100,7 @@ > **2026-10-03 台架结论**(实施细节与证据见 `子系统设计/看门狗设计说明.md` 变更记录): > V2/V4/V5 三用例全部通过——V2(任务饿死)声明 stall 后 ≤2.5s `reset cause: IWDG`;V4(关中断死循环)每 ~4.9s 稳定 IWDG 复位(IWDG 独立于中断);V5(30 min 真实负载)**120/120 次 FTP 传输全 PASS、零 IWDG 复位**。 -> **遗留观察**:V5 期间 44 次 stall 声明 100% 与 `e02_probe` 探针的 time_sync 30s 掉线+监听重建重合;隔离实验(仅 FTP 120s)**0 次 stall** → 探针场景专属,非一般负载误杀(已登记 `docs/任务规划/登记簿.md`)。 +> **遗留观察**:V5 期间 44 次 stall 声明 100% 与 `e02_probe` 探针的 time_sync 30s 掉线+监听重建重合;隔离实验(仅 FTP 120s)**0 次 stall** → 探针场景专属,非一般负载误杀(结论留本节)。 > 来源:`子系统设计/看门狗设计说明.md` §7 验证记录(原实施步骤已并入该文档文末变更记录)。 > 判定状态机与 IWDG 配置(PR/RLR 按设计值写入)已落地并经真机验证(2026-10-02,`930215f`, @@ -251,12 +250,12 @@ time_sync 触发形态,退役后该触发场景不再存在。 - **正常路径 ✅**:V5 长跑(30 min,FTP 512 KB 上/下传)**120/120 PASS、零 IWDG 复位**, 网络重建后的 FTP/time_sync 服务据代次号重建监听、功能正常(证据 `/tmp/v5_soak_serial_20261003.log`)。 - **负向路径(拔线/芯片级 `net_init` 失败)**受**台架拓扑**限制(CH395↔交换机, - 拔交换机侧线缆链路仍 UP;芯片级失败需 SPI 故障注入)→ 已登记 `docs/任务规划/登记簿.md` 条目「网络负向场景台架验证」 - (① PHY 拔线负向 ② A2 `net_init` 失败分支 ③ A4 短写压测),需专项窗口。 + 拔交换机侧线缆链路仍 UP;芯片级失败需 SPI 故障注入)→ 这三条负向场景(① PHY 拔线 ② A2 `net_init` 失败分支 ③ A4 短写压测) + 仍待专项台架窗口,判据与现状即本节,别处不另存一份。 ### 7.2 日志静默观察项:49s 全系统日志静默复现与定位 · ✅ 判据②已满足 / 判据①未复现 -**现状证据**(登记簿条目「日志静默观察项」):2026-09-22 台架实测,串口日志 **49s 无行** +**现状证据**:2026-09-22 台架实测,串口日志 **49s 无行** (testTask/netTask/[STACK] 行全缺),期间 net 栈照常处理外部连接 → **日志管线停滞**, 队列满后各任务日志行被丢;系统功能不受损。 @@ -471,7 +470,7 @@ CH395F / STORAGE / GD5F,未含 RTC;怀疑 RTC 构建下 `testTask` 不被创 | 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 正常路径零回归;芯片级失败分支 / 短写 / 拔线负向场景记 `docs/任务规划/登记簿.md` 条目「网络负向场景台架验证」,待专项台架窗口。 +> A2/A3/A4 正常路径零回归;芯片级失败分支 / 短写 / 拔线负向场景待专项台架窗口(判据见 §7.1)。 --- @@ -483,7 +482,7 @@ CH395F / STORAGE / GD5F,未含 RTC;怀疑 RTC 构建下 `testTask` 不被创 | V2/V4/V5 | `子系统设计/看门狗设计说明.md` §7 验证记录 | `子系统设计/看门狗设计说明.md` 变更记录(2026-10-03) | | S11 堆告警 | —(原复审项,已闭环 2026-10-03) | `内存管理/RAM使用分析与优化方案.md`(基线更新) | | S9 GD5F | —(第二档 #1) | `问题记录/GD5F2GQ5UE_Trap_Records.md`、`docs/测试说明/板级测试/GD5F2GQ5UE_Test_Guide.md` | -| 日志静默观察项 | `docs/任务规划/登记簿.md` | `网络/Net层阻塞模型架构设计.md`(头阻塞,历史编号) | +| 日志静默观察项 | 本文 §7.2(原上游登记簿已清空,本文即其归属) | `网络/Net层阻塞模型架构设计.md`(头阻塞,历史编号) | | 网络重建 | —(原台账项,已闭环 2026-10-02) | `网络/Net层阻塞模型架构设计.md` | | S5/S4 | —(原复审项,已闭环 2026-10-03) | `docs/测试说明/流程与规范/测试开发标准流程.md` | | 模拟器差距 | `docs/测试说明/专项验证/模拟器差距清单.md` §3 决策规则 | 本文为"需回真机"项的执行面 | diff --git a/docs/测试说明/测试数据/boot_log_data/20261104_ac_manifest.txt b/docs/测试说明/测试数据/boot_log_data/20261104_ac_manifest.txt index ea6166ca..e18a355b 100644 --- a/docs/测试说明/测试数据/boot_log_data/20261104_ac_manifest.txt +++ b/docs/测试说明/测试数据/boot_log_data/20261104_ac_manifest.txt @@ -10,4 +10,4 @@ e5dc076bc4c975eac92f93b2db8e0e81 相位轮 0°/90° 段原件(触发 19:15:32 b853cd0c34d3698184782a32cb34c2d2 无归属切换瞬态段(触发 19:22:19,UA 1408 mVpk 瞬态,不判任何行,留证溯源) 5250 B 20261104_ac_unattributed_wave10.BIN 599e8c5b79a590089f3bd47134c2e1be 6442 B 20261104_ac_wave09_scriptout.txt 783b45fe3fcf5034a0a84954c34a2d5d 6033 B 20261104_ac_wave10_11_scriptout.txt -236c34c4f33105d7c653f7939d3a2e3c 谐波 B 行归因证据:前端差分 RC 三点拟合模型输出(脚本 ia_rc_model.py,见登记簿 §3 与通道映射 §8.2) 818 B 20261104_ac_ia_rc_model.txt +236c34c4f33105d7c653f7939d3a2e3c 谐波 B 行归因证据:前端差分 RC 三点拟合模型输出(脚本 ia_rc_model.py,见登记簿 §1 与通道映射 §8.2) 818 B 20261104_ac_ia_rc_model.txt diff --git a/docs/测试说明/测试数据/boot_log_data/README.md b/docs/测试说明/测试数据/boot_log_data/README.md index 058a96ac..70784004 100644 --- a/docs/测试说明/测试数据/boot_log_data/README.md +++ b/docs/测试说明/测试数据/boot_log_data/README.md @@ -36,8 +36,7 @@ 当时那 56 条早被后续台架长跑覆盖,**不可复现、不可重生成**。把它写成「可由脚本重新生成」= 新造一条无法 核实的断言,比现在这条断链更糟(这正是本卡要修的毛病,不能拿一个新毛病换一个旧毛病)。 - 体积可忽略:两个文件合计 **6,528 B**(2,944 + 3,584,64 B/条的裸记录),比同目录**已入库**的两份解码 - 文本 `20261012_B9_soe_decode_pre.txt` / `20261012_B9_soe_decode_post.txt`(7,861 + 9,521 B)还小;对登记簿 - 「仓库体积膨胀观察」那条(.git 约 233 MB)没有可测影响。 + 文本 `20261012_B9_soe_decode_pre.txt` / `20261012_B9_soe_decode_post.txt`(7,861 + 9,521 B)还小;对仓库体积(.git 约 233 MB)没有可测影响。 - 不放宽任何规则:全局 `*.bin` 与 `simulator/tests/ref/*.bin` 的显式反选(`.gitignore` 第 130 行)**都不动**, 只对这两个具名文件各 `git add -f` 一次。入库理由要与黄金参考区分开:那边入库是因为它是**判据本体** (不入库则新克隆上这条门禁直接不存在),这边入库是因为它是**不可复现的原始证据**——理由不同, diff --git a/docs/环境与部署/并行任务工作树方案.md b/docs/环境与部署/并行任务工作树方案.md index 8db1b6ff..84e7d903 100644 --- a/docs/环境与部署/并行任务工作树方案.md +++ b/docs/环境与部署/并行任务工作树方案.md @@ -14,7 +14,7 @@ ## 1. 目的与范围 **要解决的问题**:多个任务同时推进时,若共用同一个工作目录,会互相踩——构建产物、日志目录、 -Python 环境、以及 `docs/任务规划/` 这类**全局唯一登记簿**都会被并发写坏。 +Python 环境、以及 `docs/任务规划/` 这类**全局唯一顺序权威**都会被并发写坏。 **做法**:每个任务一棵 `git worktree` + 一条任务分支,任务之间物理隔离;干完由固定命令合回主干。 @@ -127,11 +127,11 @@ D:/Code/DTU Code/ | -------- | ---------------------------------------------------------------------------------------------------- | | 集成分支(主干) | `v2-on-ui` | | 任务分支 | `task/-`,从主干当前 HEAD 切出 | -| `` | **沿用 `docs/任务规划/README.md` 的编号空间**(`P0-x`/`N-x`/`S-x`/`T-x`/`B-x`/`C-x`/`D-x`);无对应条目的临时任务用 `X-<日期>-` | +| `` | **语义短语**(如 `wave-replay-fix`),对应 `docs/任务规划/README.md` §2 顺序表里的那一行;纯临时任务用 `<日期>-` | | 合并方式 | `git merge --no-ff` 合入主干 | | 并发上限 | **同时最多 8 棵登记工作树**(2026-10-29 由 3 上调,用户裁定;另有插件树不计入,见 §3.4) | -**`` 复用登记簿编号**是为了可追溯:任务分支名直接对应待办条目,回收时销项有据可查。 +**`` 用语义短语**是为了可追溯:任务分支名直接对应待办条目,回收时销项有据可查。 **并发上限的依据**(2026-10-29 由 3 上调到 8,用户裁定;脚本常量 `MAX_CONCURRENT`): 磁盘从来不是这条线的硬约束——实测一棵纯净检出 **84.0 MiB / 2857 个受控文件**(含 LFS smudge @@ -167,12 +167,12 @@ D:/Code/DTU Code/ ### 6.1 单写者文档 -并行失败通常不是代码冲突,而是**多个任务同时改同一个「登记簿」**。以下文件在任务期间 +并发失败通常不是代码冲突,而是**多个任务同时改同一个共享索引**。以下文件在任务期间 **禁止在任务工作树里修改**,一律由 `done` 回收阶段在主工作树统一处理: | 文件 | 冲突原因 | 回收时的处理 | | ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | -| `docs/任务规划/`(整个文件夹) | 全项目唯一登记簿,每个任务都要销项 | 由主工作树统一改,任务分支不碰 | +| `docs/任务规划/`(整个文件夹) | 全项目顺序唯一权威,任务销项时要改 | 由主工作树统一改,任务分支不碰 | | `AGENTS.md`、`docs/README.md`(索引/登记类) | 每个任务都要在 AGENTS.md 的「按主题查哪份文档」表、`docs/README.md` §9.2 环境表、`docs/README.md` 的文档索引表里**各加一行** → 同一张表的新增行两任务必撞(2026-10-12 实测:主工作树里本任务的行与他任务的行已并排混在**同一 hunk**)。变更记录那一路**不再是冲突面**:2026-10-28 起新文档一律不设变更记录节(`docs/文档规范.md` §5.1),存量也只剩 5 篇台账/证据文档 | 由主工作树统一追加;提交时**只 `git add` 本任务的行**(`git apply --cached` 选择性入库),勿整文件 `git add` | | `AGENTS.md` 的 `TASK_TABLE` 块 | 生成物,两个任务都抬栈就冲突 | 合并后重跑 `scripts/gen_task_table.py` **重新生成**,不手工并 | | `MDK-ARM/STM32F407-Demo.uvprojx` | 新源文件注册 + UV4 自动改写 | 手工并 `` 条目 → 重跑 `registration-check` → `/keil-build` | @@ -238,7 +238,7 @@ D:/Code/DTU Code/ ### 7.3 并行道与写范围规则(规划层 ↔ 执行层映射) -规划层(任务卡在 `docs/任务规划/登记簿.md §7`,其余待办在 `docs/任务规划/登记簿.md`); +规划层(全项目顺序在 `docs/任务规划/README.md` §2,设计类待办在各模块文档); 五字段 = **DoD / 硬依赖 / 资源 / 写范围 / 状态**) 按**资源属性**把任务切进三条道,本方案(工作树 + 锁)是它的执行层: @@ -250,15 +250,15 @@ D:/Code/DTU Code/ **四条规则**: -1. **WIP ≤ 2**:每道最多 1 个进行中(典型 = 台架道 1 + 代码道 1),先完再开——登记簿需可见 +1. **WIP ≤ 2**:每道最多 1 个进行中(典型 = 台架道 1 + 代码道 1),先完再开——进度需可见 `⬜ 未开始 / 🟦 进行中` 两态,销项仍删行。 2. **写范围相交 = 声明合并次序**:任务卡必须写写范围(目录级);相交不排队等待,而是**声明谁先合** (后合者在主工作树 rebase 后继续),claim 时定。 3. **分支存活 ≤2 天、绿即合**:合并走 `done` 预演(§6.3);单写者文档(§6.1)仍由主工作树统一处理。 -4. **里程碑不拖延、功能顺延下一轮**(时间驱动):里程碑的退出判据写在登记簿,判据不满足则该**功能** +4. **里程碑不拖延、功能顺延下一轮**(时间驱动):里程碑的退出判据写在任务所属文档,判据不满足则该**功能** 移入下一波次,里程碑本身按判据改期而非无限等待。 -> 登记簿是规划层唯一权威(§2 铁律不变);本节只定义执行层映射,**不在本文排任务顺序**。 +> 规划层唯一权威仍是 `docs/任务规划/README.md` §2;本节只定义执行层映射,**不在本文排任务顺序**。 --- @@ -439,4 +439,4 @@ docs\内存管理\RAM使用分析与优化方案.md:585 [路径引用] docs/内 | 自动化测试与台架流程 | `docs/测试说明/流程与规范/自动化测试流程.md` | | 文档写作规范(编码/链接/登记) | `docs/文档规范.md` | | 工具路径环境变量(换机) | `docs/环境与部署/本地工具路径环境变量方案.md` | -| 待办与排序登记簿 | `docs/任务规划/README.md` | +| 待办与排序 | `docs/任务规划/README.md` | diff --git a/docs/环境与部署/项目部署环境要求.md b/docs/环境与部署/项目部署环境要求.md index 1f6a3682..ef575ae7 100644 --- a/docs/环境与部署/项目部署环境要求.md +++ b/docs/环境与部署/项目部署环境要求.md @@ -543,7 +543,7 @@ $env:DTU_KEIL_UV4 = 'D:\NotExist\UV4.exe' # 仅当前会话,不动用户级 | 开关 | 位置 | 当前值 | 说明 | |---|---|---|---| -| 功能裁剪开关 | — | 无 | **当前没有任何可裁剪的编译开关**(2026-10-22):原 `APP_NET_ENABLE` / `APP_ADC_ENABLE` / `APP_RS485_ENABLE` 三个宏全库零消费点,已于 2026-10-22 删除,`App/app/app_cfg.h` 只留决策占位说明。要不要真实门控取决于产品定义(开放问题见 `docs/任务规划/登记簿.md` §9);在此之前各模块一律编译进产品 | +| 功能裁剪开关 | — | 无 | **当前没有任何可裁剪的编译开关**(2026-10-22):原 `APP_NET_ENABLE` / `APP_ADC_ENABLE` / `APP_RS485_ENABLE` 三个宏全库零消费点,已于 2026-10-22 删除,`App/app/app_cfg.h` 只留决策占位说明。要不要真实门控取决于产品定义(属产品口径,未定);在此之前各模块一律编译进产品 | | `TEST_SUITE_*` | `test/board/test_config.h` | 全注释(产品构建) | 测试套件**互斥**:一次构建只开一个(CH395F / 存储 / GD5F / RTC);全注释 = 正常产品固件 | --- diff --git a/docs/硬件平台/ADC通道映射说明.md b/docs/硬件平台/ADC通道映射说明.md index fc5b7556..d29f95d8 100644 --- a/docs/硬件平台/ADC通道映射说明.md +++ b/docs/硬件平台/ADC通道映射说明.md @@ -253,7 +253,7 @@ STM32(U17)为 LQFP144 脚号。 **观察项(都判读过、非缺陷)**:TPAFE 输入浮空读数钉在 ≈1743/1747 mV 静态(撤线后 UA/IA 出现——读 `meas:` 时先确认接线);未接线的 STM32 侧引脚码值随环境缓漂(UC/IC/IN/T),不消费即可;录波触发后 `drop` 涨一截是 SEALED 窗口设计内(`App/algo/wave_ring.c:50`,涨完冻结,判失败只看 `err`/`ovf`);采集链全程 Δ9998/10 s、`idle=0`、`adc1_err=0`(前置门 8 条全过)。 -**IA 前端差分滤波 = 低通 fc ≈ 796 Hz**:C35 = 100 nF 跨接差分对,与 R19/R21 各 1 k([`V0.1.tel`](V0.1.tel):49)构成一阶低通;拓扑为 1 k 串联 + 1 k 接差分负端、不分压(`docs/产品需求/产品需求设计文档.md` FR-ADC-5)。**250 Hz 的 −4.4 % 就是这颗电容在该频点的真实衰减,板端读数忠实**,工频 50 Hz 仅 −0.2 % 不受影响。谐波测量不够用——同拓扑外推:5 次 ≈ −4.6 %(出 ±2 % 判据)、7 次 −8.5 %、9 次 −13.0 %、11 次 −17.7 %、13 次 −22.6 %、15 次 −27.2 %、21 次(1050 Hz)−39.6 %;C35 改 10 nF 则 fc ≈ 8 kHz、21 次仅 −0.9 %。**谐波功能产品化的硬件前置 = 板改小 C35 + 清点其余各路差分滤波电容容值**(登记 `docs/任务规划/登记簿.md` §3)。**为什么改板而不是软件逐阶修正**:修正系数依赖这颗电容的实际容值,而它有容差、随温度漂,每块板、每个温度都不一样,修正表跟不上;二次谐波制动这类“拿某次谐波幅值与基波比值”的判据,比值被前端畸变后判定就不可信。换 10 nF 后测量带内是平的,板端读数直接可信。证伪条件(有示波器再复核):该低通预测 250 Hz 差分分量额外滞后 ≈17°;模型与三点拟合 `docs/测试说明/测试数据/boot_log_data/20261104_ac_ia_rc_model.txt`。 +**IA 前端差分滤波 = 低通 fc ≈ 796 Hz**:C35 = 100 nF 跨接差分对,与 R19/R21 各 1 k([`V0.1.tel`](V0.1.tel):49)构成一阶低通;拓扑为 1 k 串联 + 1 k 接差分负端、不分压(`docs/产品需求/产品需求设计文档.md` FR-ADC-5)。**250 Hz 的 −4.4 % 就是这颗电容在该频点的真实衰减,板端读数忠实**,工频 50 Hz 仅 −0.2 % 不受影响。谐波测量不够用——同拓扑外推:5 次 ≈ −4.6 %(出 ±2 % 判据)、7 次 −8.5 %、9 次 −13.0 %、11 次 −17.7 %、13 次 −22.6 %、15 次 −27.2 %、21 次(1050 Hz)−39.6 %;C35 改 10 nF 则 fc ≈ 8 kHz、21 次仅 −0.9 %。**谐波功能产品化的硬件前置 = 板改小 C35 + 清点其余各路差分滤波电容容值**(登记 `docs/任务规划/登记簿.md` §1)。**为什么改板而不是软件逐阶修正**:修正系数依赖这颗电容的实际容值,而它有容差、随温度漂,每块板、每个温度都不一样,修正表跟不上;二次谐波制动这类“拿某次谐波幅值与基波比值”的判据,比值被前端畸变后判定就不可信。换 10 nF 后测量带内是平的,板端读数直接可信。证伪条件(有示波器再复核):该低通预测 250 Hz 差分分量额外滞后 ≈17°;模型与三点拟合 `docs/测试说明/测试数据/boot_log_data/20261104_ac_ia_rc_model.txt`。 **边界**:本节不证端子二次值(④ 段变比已算定、两点标定未做,`eng` 仍为 0,见 §7.2)/ 精度等级(要标准源)/ 跨转换器相位(V0.1 硬件缺陷)/ THD。 @@ -288,8 +288,8 @@ STM32(U17)为 LQFP144 脚号。 接在**已经验证过的那个注入点**上就行。它比第 4、5 级安全一个量级——只需 ±2 V 以内的正弦, 而端子级验证要上 100 V / 220 V 二次值。 3. **第 4、5 级在等外部**:④ 子板/端子板变比(仓库里没有原理图)与标准源两点标定, - 两者完成前 `eng` 保持 0,本波只承诺"ADC 引脚电压"。两张待做任务卡见 - `docs/任务规划/登记簿.md` §7。 + 两者完成前 `eng` 保持 0,本波只承诺"ADC 引脚电压"。开工前置见 + `docs/算法/采集与算法层设计说明.md` §13.13。 ### 9.2 波次退出判据与现状 @@ -305,7 +305,7 @@ STM32(U17)为 LQFP144 脚号。 | ⑥ 量纲回归用例(不该动作时不动作)通过 | ✅ | `test/host/prot_dim/`,口径 `docs/算法/采集与算法层设计说明.md` §13.6 | **所以差的是"台架面",它分两半**:动态这半已于 2026-11-02 / 11-04 台架闭环(§8.2); -端子与精度那半要等子板与标准源(`docs/任务规划/登记簿.md` §7)。 +端子与精度那半要等子板与标准源(开工前置见 `docs/算法/采集与算法层设计说明.md` §13.13)。 遥测链(快照发布)与运行参数/点表均已达成,口径沉淀在 `App/algo/meas.h`、`App/algo/run_par.h` 头注释与 `docs/算法/采集与算法层设计说明.md` §13.9;其中"104 上送值与**工程量**一致"仍挂在 diff --git a/docs/硬件平台/V0.1_网表详细分析报告.md b/docs/硬件平台/V0.1_网表详细分析报告.md index 7488ceaf..79cf2baa 100644 --- a/docs/硬件平台/V0.1_网表详细分析报告.md +++ b/docs/硬件平台/V0.1_网表详细分析报告.md @@ -63,7 +63,7 @@ | V7 | **VCAP1/VCAP2(U17.71/106)旁路电容 C94/C79 值未标注**:数据手册要求 VCAP1/VCAP2 各接 1~4.7µF 低 ESR 陶瓷电容至 VSS(内部 1.2V LDO 稳定裕量) | 实测 C94/C79 容值(若为 100nF 则低于手册建议,168MHz 满负荷下 1.2V 轨纹量/稳定性需留意);值补录 BOM | | V8 | **V15/J3/F3 子板 LED 3 线落在 PC13/PC14/PC15**(脚 7/8/9):备份域电源开关供电,手册 Note 3 限**灌流 ≤3mA、≤2MHz、不可作电流源** | 核子板 LED 驱动电流需求;超 3mA 则 V0.2 移足驱力脚或子板加三极管扩展 | | V9 | **V0.1 主板 SDIO 固定引脚组全被占用**:PC6/PC7/PC8/PC9/PA8(TPAFE 控制)+ PA9(USART1)+ PC10/PC11/PC12/PD2(UART4/UART5)= SDIO 全部 10 脚(F407 SDIO 无重映射) | 架构约束备案:V0.1 主板**无 SDIO 能力**;当前设计不受影响(代码未启用 SDIO,FatFs 卷在 SPI NAND 上) | -| **V10** | **8 路电气量分属两片转换器(V0.1 硬件缺陷,V0.2 改版项)**:UA/UN/IA 走 TPAFE5160(16 位、同步、±5 V 双极性),UB/UC/IB/IC/IN 走 STM32 ADC(12 位、顺序扫描、0~3.3 V 单极性)→ 跨转换器通道**无同一时刻性**(相位关系不确定)、精度与量程不一致。详见 §6-3 与 [`ADC通道映射说明.md`](ADC通道映射说明.md) §1(2026-10-10 定性更正,登记簿条目「双转换器无共同采样触发」) | **V0.2 改版**:8 路电气量 UA/UB/UC/UN/IA/IB/IC/IN **全部接 TPAFE5160**,与 TPAFE 上 5 路备用路(AIN5/13/7/15/12)对调串联电阻在转换器一侧的目的地——元件数量与料号不变,属走线级改动。V0.1 现板:主板侧只做逐通道监视,**不做**跨转换器的相位/功率/功率因数/矢量运算 | +| **V10** | **8 路电气量分属两片转换器(V0.1 硬件缺陷,V0.2 改版项)**:UA/UN/IA 走 TPAFE5160(16 位、同步、±5 V 双极性),UB/UC/IB/IC/IN 走 STM32 ADC(12 位、顺序扫描、0~3.3 V 单极性)→ 跨转换器通道**无同一时刻性**(相位关系不确定)、精度与量程不一致。详见 §6-3 与 [`ADC通道映射说明.md`](ADC通道映射说明.md) §1(2026-10-10 定性更正;缺陷登记在 `docs/任务规划/登记簿.md` §1) | **V0.2 改版**:8 路电气量 UA/UB/UC/UN/IA/IB/IC/IN **全部接 TPAFE5160**,与 TPAFE 上 5 路备用路(AIN5/13/7/15/12)对调串联电阻在转换器一侧的目的地——元件数量与料号不变,属走线级改动。V0.1 现板:主板侧只做逐通道监视,**不做**跨转换器的相位/功率/功率因数/矢量运算 | ## 2. 元件级变化 diff --git a/docs/算法/继电保护功能复现规划.md b/docs/算法/继电保护功能复现规划.md index cc575d03..64aa5fd0 100644 --- a/docs/算法/继电保护功能复现规划.md +++ b/docs/算法/继电保护功能复现规划.md @@ -39,7 +39,7 @@ | 采样硬件 | TPAFE5160(16 位、8 通道**同步**、±5 V 双极性、并行 `GPIOG[15:0]`)+ STM32 内部 ADC1(12 位、9 通道**顺序**扫描、0~3.3 V 单极性) | | 采样软件 | `Drivers/BSP/TPAFE5160/tpafe5160.h` 驱动就绪(原子快照 API);`App/task/adc_task.c` **已实现真实消费者(ADC 采集链路,2026-10-10)**——`tpafe5160_snapshot()` 取数 + 帧统计;**采样节拍由 TIM3 更新事件(1 kHz)硬件触发**(2026-10-10;同一事件经 TRGO 触发 ADC1 + DMA);STM32 侧 **`App/algo/adc_input.c` 已实现语义映射 + ADC1 DMA 乒乓帧消费(「STM32 ADC1 启动与扫描」,v2.0)**,`HAL_ADC_Start_DMA` 已出现 | | 保护算法层 | **全周傅氏相量层已实现并台架闭环**(`App/algo/sample_ring.c` + `phasor.c`:全周傅氏 5 实例、双区交换、每 1 ms 刷新,2026-10-11 `/serial-boot-test`);**保护判据元件框架 + 过流/过负荷/过压/欠压/零序过压 + 定值模型软件侧完成**(`prot_elm.c` + `prot_set.c`,2026-10-11,57 项主机单测);**出口 / SOE 记录仍缺失**(P4) | -| 已知硬件缺陷 | 登记簿条目「双转换器无共同采样触发」:8 路电气量分属两片转换器 → V0.1 上禁止跨转换器做相位/功率/矢量运算 | +| 已知硬件缺陷 | `docs/任务规划/登记簿.md` §1:8 路电气量分属两片转换器 → V0.1 上禁止跨转换器做相位/功率/矢量运算 | ### 1.3 复现范围界定 @@ -138,7 +138,7 @@ | # | 约束 | 出处 | 后果 | | --- | --- | --- | --- | -| 双转换器无共同采样触发 | 8 路电气量分属 TPAFE5160 与 STM32 ADC1 **两片**,两片**无共同采样触发** | `ADC通道映射说明.md` §1、登记簿条目「双转换器无共同采样触发」 | 跨转换器的相位 / 矢量 / 功率 / 功率因数 / 负序运算**不成立** | +| 双转换器无共同采样触发 | 8 路电气量分属 TPAFE5160 与 STM32 ADC1 **两片**,两片**无共同采样触发** | `ADC通道映射说明.md` §1、`docs/任务规划/登记簿.md` §1 | 跨转换器的相位 / 矢量 / 功率 / 功率因数 / 负序运算**不成立** | | R5 | STM32 侧**无中点偏置**(1k 串联 + 1k 到 `*_GND`),0~3.3 V 单极性 | `ADC通道映射说明.md` §1、§7 | STM32 侧交流量负半周**削顶** → 该侧**算不出有效值 / 相量** | **(2)净效果:V0.1 只有 TPAFE 三路"测量有效"** @@ -189,7 +189,7 @@ | **出口与记录与信号** | 跳闸/告警出口、信号灯 | `TripKO` / KO | `App/protect/` + BSP 出口驱动 | | **动作留痕记录与上送** | SOE/动作记录、UI 显示、遥测上送 | 记录模块 + 通信 | `App/log/` + `Drivers/BSP/UI/` + `App/protocol/` | -> **分层原则**:语义取数与有效性只做"数"(码值→工程量),全周傅氏相量只做"相量"(工程量→复相量),保护判据只做"判据"(相量 + 定值→布尔),出口与记录/动作留痕只做"动作与留痕"。**算法与 I/O 分离**,使 全周傅氏相量/保护判据成为主机侧纯逻辑单测的天然适格对象(落实 `docs/任务规划/暂缓-RS485.md`「采集链路测试可验证性约束」)。 +> **分层原则**:语义取数与有效性只做"数"(码值→工程量),全周傅氏相量只做"相量"(工程量→复相量),保护判据只做"判据"(相量 + 定值→布尔),出口与记录/动作留痕只做"动作与留痕"。**算法与 I/O 分离**,使 全周傅氏相量/保护判据成为主机侧纯逻辑单测的天然适格对象(三条采集链路设计约束的正文在 `docs/产品需求/产品需求设计文档.md` §5.10)。 ### 2.2 任务与中断模型(映射到 STM32F4 + FreeRTOS) @@ -426,7 +426,7 @@ | --- | --- | --- | --- | | AD 器件 | 专用同步采样 AD | TPAFE5160(16 位、8 通道同步、±5 V)+ STM32 ADC1(12 位、顺序、0~3.3 V) | 统一到"工程量"层,屏蔽码值差异 | | 通道数 | 8 实通道(4U+4I,自产零序) | 8 路电气量(4U+4I)+ 温度 | 语义映射见 `docs/硬件平台/ADC通道映射说明.md` | -| 同一时刻性 | 单芯片同步 | **跨转换器无共同触发**(登记簿条目「双转换器无共同采样触发」) | V0.1 只做逐通道独立监视 | +| 同一时刻性 | 单芯片同步 | **跨转换器无共同触发**(`docs/任务规划/登记簿.md` §1) | V0.1 只做逐通道独立监视 | | 量程/精度 | 一致 | TPAFE LSB ≈ 152.6 µV vs STM32 LSB ≈ 806 µV | 同族量不可统一算法处理 | ### 6.2 双转换器无共同采样触发:影响与降级口径 @@ -516,9 +516,9 @@ B0 产品定义 ✅(2026-10-10 已确认,见 §1.5) | 语义取数与有效性板端套件 | 采样/相量/保护元件 | `test/run_all_suites.py` 板端套件 | | 全周傅氏相量/保护判据台架 | 标准源注入、动作出口、时序 | 台架闭环(COM6 @115200) | -### 8.2 `docs/任务规划/暂缓-RS485.md`「采集链路测试可验证性约束」落实 +### 8.2 采集链路三条设计约束落实 -`docs/任务规划/暂缓-RS485.md`「采集链路测试可验证性约束」对采集链路提出三条设计约束,保护层须一并满足: +`docs/产品需求/产品需求设计文档.md` §5.10 对 RS-485 采集链路提出三条设计约束,保护层须一并满足: 1. **协议解析与硬件 I/O 分离**——保护判据函数只吃相量 + 定值,可单测; 2. **采集缓冲双缓冲 + 序号**——防撕裂(单测测不出时序撕裂,须设计上消除); diff --git a/docs/算法/采集与算法层设计说明.md b/docs/算法/采集与算法层设计说明.md index 56030a26..39bca4fd 100644 --- a/docs/算法/采集与算法层设计说明.md +++ b/docs/算法/采集与算法层设计说明.md @@ -6,8 +6,8 @@ > 本文不重复其内容;本文不写历史演进、门禁复测记录与修订日志(需要时查 git 历史)。 > **状态**:语义取数与有效性 → 全周傅氏相量 → 保护判据主线已闭环到板端消费者(`protectTask`,20 ms 判据节拍); > 标定折算层 `App/algo/adc_cal` 已于 2026-10-25 落地(标定折算与落盘整定,§13.2, -> 引脚电压量纲 + 系数落盘 + 未标定闭锁);**幅值精度判据**仍待标准源两点注入复核(§13 状态段与 -> `docs/任务规划/登记簿.md` §7)。 +> 引脚电压量纲 + 系数落盘 + 未标定闭锁);**幅值精度判据**仍待标准源两点注入复核(§13 状态段; +> 推进顺序与等待的外部资源见 `docs/任务规划/README.md` §2)。 > **相关文档**: > 分层与功能项(语义取数与有效性~动作留痕)的唯一属主登记处:`docs/算法/继电保护功能复现规划.md` §2.1(分层)、§3(功能清单)、§4.2(精度)、§7(路线图) > `docs/硬件平台/ADC通道映射说明.md`(**语义映射唯一权威口径**) @@ -41,7 +41,8 @@ ADC1)、不做出口动作。 - **这样分离换到什么**:`sample_ring` / `phasor` / `adc_health` / `prot_set` / `prot_elm` / `freq` **零平台依赖**(只用 `stdint.h` / `math.h` / `stddef.h` 与本目录头),因此可被主机侧 - 单测以 `#include` 原样纳入、离线全覆盖(落实 `docs/任务规划/暂缓-RS485.md`「采集链路测试可验证性约束」),不需要真机就能钉死判据。 + 单测以 `#include` 原样纳入、离线全覆盖,不需要真机就能钉死判据(采集链路三条设计约束见 + `docs/产品需求/产品需求设计文档.md` §5.10)。 - **上下文约束**:`*_init()` 一律无 RTOS 依赖、幂等,由 `app_main_init()` 在**内核启动前**调用; `adc_input_poll()` / `phasor_run()` / `freq_run()` **仅任务上下文**(快照走临界区)。 - **消费者在 `App/task/`**:`adcTask` 采集并压环、`protectTask`(保护任务)跑 `prot_elm_run()`; @@ -416,8 +417,8 @@ UA 无幅值落 IA → 0.0020 Hz。 2. **禁止跨转换器运算**(V0.1 硬件缺陷**双转换器无共同采样触发**):`UA/UN/IA` 在 TPAFE、`UB/UC/IB/IC/IN` 在 STM32 ADC1,两片转换器没有共同采样触发 → 无同一时刻性、相位不确定。故本层**不做**跨转换器的 相位 / 功率 / 功率因数 / 负序零序类矢量运算;**8 路全接 TPAFE(V0.2 硬件)后方可解禁**。 -3. **标定折算已落地、精度复核未做**(2026-10-25 `App/algo/adc_cal`;两点标定与精度目标见 - `docs/任务规划/登记簿.md` §7):帧值现 = 引脚侧工程量(ROM 默认系数 = 转换器 LSB 事实值), +3. **标定折算已落地、精度复核未做**(2026-10-25 `App/algo/adc_cal`;两点标定怎么开工见 §13.13): + 帧值现 = 引脚侧工程量(ROM 默认系数 = 转换器 LSB 事实值), 前端分压读法判别与端子变比仍待台架——**精度结论前不得把幅值当计量证据**(§13)。 4. **本层无副作用外溢**:不建任务、不等事件、不写日志(日志由调用侧打)、不碰寄存器 (例外只有 `adc_input.c` 驱动 ADC1)。 @@ -621,8 +622,7 @@ V0.1 恒命中 UB/UC/IB/IC/IN,位图 `0xE6`),它表示"这路不能测交 > **承诺边界**:只到 **ADC 引脚电压**(`eng = 0`)。"端子二次值"要等子板变比确认、 > 标准源两点标定写入 `[adc_cal]` 并置 `VALID`;`eng` 升 1 的条件是电气 8 路 VALID **全置位** -> (`App/app/ui_data_feed.c` 的 `feed_eng()`)。两张待做任务卡见 -> `docs/任务规划/登记簿.md` §7。 +> (`App/app/ui_data_feed.c` 的 `feed_eng()`)。两点标定怎么开工见 §13.13。 **动态验证已跑两轮(2026-11-02 / 11-04),六轮全部闭合**——幅值 / 波形 / 相位 / 测频 / 谐波 / 削顶直流档都过了;实测数与逐轮结论只详述在 `docs/硬件平台/ADC通道映射说明.md` §8.2,本节不抄第二份。 @@ -773,6 +773,19 @@ typedef struct { 新增决策照上表格式往下加:一行一个问题、一行定成了什么、一行为什么。 +### 13.13 两点标定开工前必须先拍板的三件事 + +拍板前,相应验收判据无法判定——这是**开跑的前置**,不是排期问题。 + +| 待定 | 备选 | 为什么必须先定 | +|---|---|---| +| **精度目标** | 0.5 级 / 1 级 | 决定两点标定的判据,否则"误差 ≤ 目标精度"这条无法判定。保护判据本身只需 3~5 %,0.5 级是计量口径 | +| **端子 / 子板变比从哪来** | ① 有原理图(直接算)② 只有实物(万用表同时量端子与引脚)③ 都没有 | 决定 `eng` 能否置 1。现状已按 ① 的参数算定(`docs/硬件平台/ADC通道映射说明.md` §7.2),等实物复核;② 同样可行且够用;③ 则只交付引脚电压、二次值登记为缺口 | +| **`eng = 0` 期间测频幅值门怎么处置** | 保持恒失效(现状,UI 恒 `--`)/ 台架临时把 `FREQ_AMP_MIN` 降到引脚域量级跑一轮再还原 / 换成相对量门限 | 建议**常态保持恒失效 + 需要时临时降门跑一轮**;换相对量门限要先重新论证,别在过渡期改。临时降门会改产品头文件,收尾必须还原到 `git diff` 为空并重跑构建 | + +**送检顺序不可倒过来**:产品构建当前要求 UA/UN/IA 的标定 `VALID` 全部置位才走保护判据。 +未完成标准源标定就送检,保护会表现为不动作。保持该闭锁,不用非标准源标定走捷径。 + ## 14. 相关文档 - 目录索引与构建 / 测试入口:`App/algo/README.md` diff --git a/docs/网络/网络自愈架构设计.md b/docs/网络/网络自愈架构设计.md index bb971255..00322512 100644 --- a/docs/网络/网络自愈架构设计.md +++ b/docs/网络/网络自愈架构设计.md @@ -18,7 +18,7 @@ | `形态①`~`形态⑤` | `net_reconcile_tick` 的五类**失同步判据** | §4.1 | | `U1`~`U15` | 状态迁移的**"无人负责"组合**(架构欠债清单) | `docs/问题记录/CH395F_Trap_Records.md` 审计遗留章节 | | `TRAP-NET-nn` | **陷阱记录**条目 | 同上 | -| `N-nn` | `docs/任务规划/登记簿.md` 的**任务/发现编号**(⚠ 已销项的号不再可查,本文引用处即其最终事实描述) | 该登记簿 | +| `N-nn` | 历史上的**任务/发现编号**(已停发;⚠ 已销项的号不再可查,本文引用处即其最终事实描述) | 本文各节 | | `D1`~`D7` | 本文**决策记录** | §10 | | `自愈收敛阶段 N` | 2026-10 的分阶段实施标签,**只存在于历史文档与归档**(2026-10-29 起全仓仅剩 5 篇保留的变更记录真台账)(代码注释已全部改为平实语言);勾选清单已归档(§12)——**勿用它叙述设计,也勿再写回注释** | §12 | | `TSL` / `TSC` / `TSD` | SPI 命令与数据之间的**时序间隔**要求 | `docs/芯片手册/CH395F.md` §7.4 | @@ -699,7 +699,7 @@ DISCONNECT 会被 `(void)` 丢掉。但 RECV_OK 是条件位(下轮补回) ③ **槽位可加入**:每 Socket 只有一个复位槽位,`ch395f_sock_reset_begin` 返 -1(已在运行) 不等于失败——同步包装必须**加入**已在跑的复位机,否则 `net_close` 走 "proceed anyway"、排渣被跳过。 - 补齐 ①②③ 并各自回归后再接;登记 `docs/任务规划/登记簿.md` 条目「relisten 沉降段原语化受阻」。 + 补齐 ①②③ 并各自回归后再接;三条前置语义与本条现状见本节。 2. **部分读→再查 recv_len 定向 TC**:旧"部分读归零"机理未证实(与手册 §5.34 及 TC-NET-201 相反),注释约束已降级为历史观察——以定向用例结案(陷阱记录「台架纪律」 节已挂该待办)。 diff --git a/docs/门禁说明/mem-budget.md b/docs/门禁说明/mem-budget.md index 43e81318..6625c8f5 100644 --- a/docs/门禁说明/mem-budget.md +++ b/docs/门禁说明/mem-budget.md @@ -5,7 +5,7 @@ - 配置:`entry: python scripts/ram_baseline.py --gate`、`pass_filenames: false`、 `files:` 覆盖 `App/`、`Drivers/BSP/`、`Src/`、`Inc/`、`Lib/lv_conf.h` 等会影响占用面。 -- 背景:登记簿条目「缩堆迁 CCM 后半(暂缓)」的前半;三件套里的机械部分(阈值门禁 + 趋势台账 + 台账受管区)。 +- 背景:内存治理三件套的机械部分为「缩堆迁 CCM 后半(暂缓)」的前半;三件套里的机械部分(阈值门禁 + 趋势台账 + 台账受管区)。 ## 1. 它在查什么 diff --git a/docs/门禁说明/registration-check.md b/docs/门禁说明/registration-check.md index 3a474a2e..e8ad6362 100644 --- a/docs/门禁说明/registration-check.md +++ b/docs/门禁说明/registration-check.md @@ -4,7 +4,7 @@ > ——这一门专抓"写了却从不生效"的死代码,包括第四种更隐蔽的:页面描述符没接线。 - 配置:`entry: python scripts/check_registration.py --strict`、`pass_filenames: false`。 -- 背景:登记簿条目「rs485_task 白名单缺口」;UI 页面那类是「UI 字符集与像素回归门禁」补强(2026-10-15)。 +- 背景:`App/task/rs485_task.c` 的白名单缺口;UI 页面那类是「UI 字符集与像素回归门禁」补强(2026-10-15)。 ## 1. 它在查什么(四类缺口) diff --git a/docs/问题记录/采集与数据处理短板评测.md b/docs/问题记录/采集与数据处理短板评测.md index 442052e6..572d047d 100644 --- a/docs/问题记录/采集与数据处理短板评测.md +++ b/docs/问题记录/采集与数据处理短板评测.md @@ -1,7 +1,7 @@ # 采集与数据处理短板评测(2026-10-23) > **定位**:以参考项目 CLS100(`Scatter_P_HV03.01_SV01.01`)的"采样 → 预处理 → 相量 → 遥测 → 录波 → 上送"全链路为对照,评测本项目在**电力采集与数据处理**上的完成度,指出下一步该补的短板与顺序。 -> **不是待办登记簿**:排序权威仍是 `docs/任务规划/README.md` §2;本文只出评测结论与建议,条目落地时按语义标识登记进 `docs/任务规划/登记簿.md`。 +> **不是待办表**:排序权威仍是 `docs/任务规划/README.md` §2;本文只出评测结论与建议;待办按语义标识登记在该模块自己的文档里。 > **对照口径**:项目内以 `docs/算法/继电保护功能复现规划.md` §3 的 语义取数与有效性~动作留痕清单为准;参考侧以参考项目 `项目分析文档/04-算法与采样专题/` 三篇(《ADC采集至数据使用全流程详解》《项目详细分析-交流采样与有效值计算》《傅氏算法详解》)与源码为准。 > **硬件前提**:结论只针对 **V0.1 现板**;受「双转换器无共同采样触发」(8 路电气量分属两片转换器)制约的项单独标注,V0.2 改版后解禁。 diff --git a/scripts/archive/id_gate/编号治理历史.md b/scripts/archive/id_gate/编号治理历史.md index 85961d35..9157bca6 100644 --- a/scripts/archive/id_gate/编号治理历史.md +++ b/scripts/archive/id_gate/编号治理历史.md @@ -344,7 +344,7 @@ P-6 号必须能反查到定义(属主登记处得存在)· P-7 编号不语 (38 次上板启动复现)读作主机侧回归的早期基线,改写为「主机侧回归的早期基线 3/10」。 4. **登记簿条目 `L5 队列往返基线待重验` 改名**为「队列往返基线待重验」:这里的 `L5` 曾**长在语义 短语里**(`id_aliases.json` 当年就是这么登记的),属"短语里混着号"的坏例子——`编号规范.md` - §1 的好例子清单里正是它。引用侧 5 处同批改(登记簿 §1/§7、实机测试实施指南 §7.3 标题与步骤表、 + §1 的好例子清单里正是它。引用侧 5 处同批改(原登记簿两节、实机测试实施指南 §7.3 标题与步骤表、 编号规范好例子清单);归档里那条历史 note 原文不动,它是当时决定的记录。 另修一处上一批路径残留:`net_latency_test.c/.h` 三处注释把 peer 少写一级目录(正确路径是 diff --git a/scripts/check_registration.py b/scripts/check_registration.py index 8207415c..67d28e58 100644 --- a/scripts/check_registration.py +++ b/scripts/check_registration.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- """check_registration.py - 双端注册反向校验门禁(纯标准库)。 -背景(登记簿条目「rs485_task 白名单缺口」): +背景(rs485_task 白名单缺口): 本工程 Keil 工程与 PC 模拟器都用**显式文件列表**(无通配扫描)。新 `.c` 必须手动注册两处才会被编译: ① `MDK-ARM/STM32F407-Demo.uvprojx` 的 `` 条目(MCU 固件构建) @@ -46,7 +46,7 @@ & '.venv\\Scripts\\python.exe' scripts/check_registration.py & '.venv\\Scripts\\python.exe' scripts/check_registration.py --strict -设计依据:docs/任务规划/登记簿.md 条目「rs485_task 白名单缺口」;.dsh/skills/new-source-file +设计依据:rs485_task 白名单缺口(`docs/产品需求/产品需求设计文档.md` §5.10);.dsh/skills/new-source-file 创建日期:2026-10-12 """ diff --git a/scripts/check_test_suite.py b/scripts/check_test_suite.py index 43a1e983..5cd0b68d 100644 --- a/scripts/check_test_suite.py +++ b/scripts/check_test_suite.py @@ -37,7 +37,7 @@ & '.venv\\Scripts\\python.exe' scripts/check_test_suite.py --allow-test-build & '.venv\\Scripts\\python.exe' scripts/check_test_suite.py --file <路径> -设计依据:docs/任务规划/登记簿.md;docs/测试说明/流程与规范/测试开发标准流程.md §3.1 +设计依据:docs/测试说明/流程与规范/测试开发标准流程.md §3.1 创建日期:2026-10-01 """ diff --git a/scripts/ram_baseline.py b/scripts/ram_baseline.py index 03ef3d56..3f2e2f9d 100644 --- a/scripts/ram_baseline.py +++ b/scripts/ram_baseline.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -RAM 预算门禁 + 趋势台账(登记簿条目「缩堆迁 CCM 后半(暂缓)」的台账/门禁那半 / 审查报告 §5.5 三件套,2026-10-12)。 +RAM 预算门禁 + 趋势台账(内存治理三件套,2026-10-12)。 三件套的机械部分收在本脚本(事实源 = Keil `.map`,与 `check_mem_numbers.py` 同口径): @@ -28,7 +28,7 @@ RAM 预算门禁 + 趋势台账(登记簿条目「缩堆迁 CCM 后半(暂 python scripts/ram_baseline.py --trend [-n 10] 退出码:0 通过/跳过;1 门禁失败或受管区漂移;2 事实源解析失败。 -创建日期:2026-10-12(登记簿条目「缩堆迁 CCM 后半(暂缓)」的台账/门禁那半) +创建日期:2026-10-12(内存治理三件套的台账/门禁件) """ import argparse import pathlib diff --git a/scripts/ram_baseline.tsv b/scripts/ram_baseline.tsv index 68d4bae6..8fd6dbd9 100644 --- a/scripts/ram_baseline.tsv +++ b/scripts/ram_baseline.tsv @@ -19,3 +19,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi 2026-11-04 254332 30824 2072 150104 285156 27.2 94752 72.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;nand_ftl.o=6236;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 2026-11-05 254820 30896 2072 150104 285716 27.2 94752 72.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;nand_ftl.o=6236;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 2026-11-09 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 +2026-11-10 255160 31204 2080 152152 286364 27.3 96808 73.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;nand_ftl.o=8288;lftpd.o=7884;ui_net_sink.o=6802;ui_port.o=6432;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 diff --git a/scripts/size_attestation.json b/scripts/size_attestation.json index 69a020b2..430f8efd 100644 --- a/scripts/size_attestation.json +++ b/scripts/size_attestation.json @@ -1,15 +1,15 @@ { - "built_at": "2026-11-09T16:09:17+08:00", - "fingerprint": "a7e57c2a7e70ba95944f64b9254e5ec3ed4c0b4482dfc73276912cf53bea4df5", + "built_at": "2026-11-10T11:42:28+08:00", + "fingerprint": "bd97996ef0586e185e13beca01d36f43fdbc118c69c0833166065752aacae96c", "fingerprint_files": 1479, "fingerprint_source": "git-index", "gated_regions": [ "RW_IRAM1", "RW_CCM" ], - "git_head": "7027718dcd67cfe84128b9dabf3acc53b5cf740c", + "git_head": "ae09c5737a0bc56cddc469fc2ca0afe78e6cbd74", "map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map", - "map_mtime": 1794211736, + "map_mtime": 1794282125, "pct": { "ER_IROM1": 27.31, "RW_CCM": 87.89, diff --git a/test/host/iec104_master.py b/test/host/iec104_master.py index 15576d07..0e89e3c8 100644 --- a/test/host/iec104_master.py +++ b/test/host/iec104_master.py @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- """B6 bench leg: IEC 60870-5-104 master client (GI + COV round-trip). -Historical bench leg; current acceptance index: docs/任务规划/登记簿.md §7. +Historical bench leg; acceptance criteria: docs/子系统设计/IEC104上行设计说明.md §8. docs/子系统设计/IEC104上行设计说明.md §3/§4. Constants mirror App/protocol/iec104/iec104_asdu.h / iec104_link.h.