docs(销项): 批 1 登记簿收口 + A-5 口径联动到三处门禁文档
销项(登记簿删行 + 结论沉淀指针): - 数据可信.md:卡 1~7 行删除,表下补销项记录(merge 231dc81/d39e5c9/ 59da40b);§2.1 口径冲突注改 ✅ 已定死;§6 顺序图与失效预警改写为 "批1 已销项 + 批2 在途"现状;卡 0/0b/12 与 M4①⑤台架面保留待跑 - 测试与架构专项.md:未闭环一览删 S12 / A-5 两行;§1 标题 1 项→0 项, P1-10 剩余两条改已销项记录(5 档构建 + f3 PASS,数字正文在 test/board/ch395f_test.h);§2.1 S12、§2.3 A-5 标题 ⬜→✅ 带落点 - README.md:一览删 P1 收步行;网络/结构/UI 行加 🟦批2 在途标记; 测试基础设施 5→3;数据可信行改"在途 7 卡";验证常态两处删 P1-10/S12/A-5 口径联动(A-5 已落地,文档追平): - CI 远程CI完整指南.md §0.0 整节重写(盲区→同码凭证强制 + 三项仍 守不住 + 变更记录行);CI README 索引行同步 - 门禁说明/mem-numbers.md §1/§6、mem-budget.md §6 第 4 条:远端缺口 已由 check_size_gate.py 关闭,唯一正文 = 其 docstring
This commit is contained in:
+1
-1
@@ -23,7 +23,7 @@
|
||||
| 想干什么 | 去看 |
|
||||
|---|---|
|
||||
| 先搞清 CI 需要哪三样东西就位、本机拓扑、部署前置清单 | §0 / §0.1 / §0.2 |
|
||||
| **CI 不守哪些门禁**(体积门禁盲区 S14、gitlint 空转) | §0.0 + §7 排障表"钩子条数对不上"行 |
|
||||
| **CI 体积门禁现在怎么守**(同码凭证强制,S14 盲区已关闭;gitlint 空转仍在) | §0.0 + §7 排障表"钩子条数对不上"行 |
|
||||
| 服务端开启 Actions、`DEFAULT_ACTIONS_URL` 到底管什么 | §1(含 §1.2.1,**这条最容易搞反**) |
|
||||
| 下载 / 注册 runner(`--instance` 用回环、labels 必须精确匹配 `runs-on`) | §2.2 |
|
||||
| `config.yaml` 各字段语义(capacity / timeout / labels / 日志目录…) | §2.3 |
|
||||
|
||||
+15
-13
@@ -36,22 +36,23 @@
|
||||
|
||||
---
|
||||
|
||||
## 0.0 ⚠️ CI 不覆盖的体积门禁(必读,S14)
|
||||
## 0.0 ⚠️ CI 体积门禁:从盲区到同码凭证强制(必读,S14 → A-5 残余已销项)
|
||||
|
||||
> **CI 不守 Flash/RAM 体积门禁。** `mem-numbers` 钩子的事实源是 Keil 构建产物
|
||||
> `MDK-ARM/**/*.map`(已 gitignore),而 CI 刻意不跑 `@build` → **无 `.map` → 该钩子被跳过**。
|
||||
> **曾经的盲区已关闭为强制路径(2026-10-25,A-5 残余销项,`task/A5-size-gate`→564715c)。**
|
||||
> `mem-numbers` 钩子的事实源是 Keil 构建产物 `MDK-ARM/**/*.map`(已 gitignore),CI 刻意不跑
|
||||
> `@build` → 该钩子在远端只会被跳过(现以 `SKIP` 名单诚实显示 Skipped,不再伪装 Passed)。
|
||||
> 补上的强制路径 = **同码凭证**:本地 `@build` 0/0 后 `ram_baseline.py --update` 顺手盖
|
||||
> `scripts/size_attestation.json`(三道前置:`.map` 可解析 / `.map` 不早于指纹内源码 mtime /
|
||||
> 受管区 ≤92%);CI 无需 Keil,L0 作业末尾的「体积门禁」步用 `scripts/check_size_gate.py --ci`
|
||||
> 复核两件事——**工作树指纹 == 凭证指纹**(改了代码从没测过 = 拦)+ **按凭证数字复跑 92% 红线**。
|
||||
> 主干 push 拦红,其余事件 `--warn-only`;本地 `ci_local.py` 的 L0c 步无条件 fail-closed。
|
||||
>
|
||||
> 后果:**新增任务 / 栈 / 缓冲 / 代码导致的体积增长(或文档内存数字失真)不会在 CI 被拦下。**
|
||||
> 仍守不住的三项(正文唯一口径 = `scripts/check_size_gate.py` docstring):CI 不重算绝对数字
|
||||
> (只复核同码性与红线复算);编译器选项(`.uvprojx`)不在指纹内;凭证由本地真实构建产生,
|
||||
> 链路本身不经 Keil 授权就无法伪造,但"盖戳后换机器环境"的差异只能靠 mtime 前置兜。
|
||||
>
|
||||
> 兜底(每次改代码后必做):
|
||||
> ```powershell
|
||||
> & '.venv\Scripts\python.exe' .dsh\skills\keil-build\scripts\keil_build.py # 0/0 且生成 .map
|
||||
> & '.venv\Scripts\python.exe' scripts/check_mem_numbers.py --scan
|
||||
> ```
|
||||
> 若 CI 允许在带 Keil 的 runner 上跑,则该钩子会在有 `.map` 时**照常执行**(workflow 自适应)。
|
||||
>
|
||||
> CI 运行时该跳过以 **`::warning::`** 明示(不是弱化的 notice),并写入 job 的
|
||||
> **step-summary** 醒目行,避免被忽略。
|
||||
> 本地兜底动作不变(每次 `@build` 后):`ram_baseline.py --update`(含盖戳)+
|
||||
> `check_mem_numbers.py --scan`。若 runner 以后装了 Keil,`mem-numbers` 会在有 `.map` 时照常执行。
|
||||
|
||||
---
|
||||
|
||||
@@ -1351,6 +1352,7 @@ powershell -ExecutionPolicy Bypass -File scripts\ci_runner_bootstrap.ps1 -DryRun
|
||||
|
||||
| 日期 | 变更 |
|
||||
|---|---|
|
||||
| 2026-10-25 | 🔒 **A-5 残余销项联动(§0.0 重写)**:体积门禁由"CI 不守"改为**同码凭证强制**——本地 `@build` 0/0 后 `ram_baseline.py --update` 盖 `scripts/size_attestation.json`,L0 作业末尾 `check_size_gate.py --ci` 复核同码性 + 红线复算(runner 无需 Keil);主干 push 拦红、其余事件 warn-only;`mem-budget` 补进 SKIP 名单诚实显示。指纹取 git 索引 blob(跨 checkout 稳定,修 7c4628b);三项仍守不住的口径唯一正文 = 脚本 docstring |
|
||||
| 2026-10-12 | 🐛 **第一次真跑出 run,当场暴露 gitlint 门禁空转**:把本轮修复推到新分支 `v2-on-ui-ci` 后拿到 task 31/32——**L0.5 成功**(`10 runner(s), 647/647 assertions passed, fail=0`,与本地逐字一致),**L0 失败**却与提交信息毫无关系:`exit code: 254` + `Missing git configuration: please set user.name`。根因是 `actions/checkout` 把 HOME 指向每次任务的临时目录、SYSTEM 账号没有 git 身份,gitlint 在读到规则之前就配置错误退出;旧脚本还把失败原因**写死**成"标题超 100 字符",加上该步 `exit 1` 让后面 26 个钩子**一个都没跑**。修法:脚本先探测身份,缺失就用 `GIT_CONFIG_COUNT/KEY/VALUE` 注入一次性身份(不写文件、不碰开发者机器),并区分 254(门禁没跑起来 → `exit 2`)与真实违规(→ `exit 1`)。另记一条新坑:**新建分支的首次 push 不产生 run**(§7 排障表 ④) |
|
||||
| 2026-10-12 | 🔀 **随 `master` 合入 `v2-on-ui`:数字口径改为分支中立**。本指南原先写死 master 的数字(18 钩子 / 17 报告、3 runner / 288 断言),而 `v2-on-ui` 是 **26 钩子 / 10 套件**——同一篇文档在两个分支上必然有一个是错的。§6 验收第 8 行、§7 排障表、§10 验收标准三处改为讲规则(**报告数 = 定义数 − 1**;**runner 数 = `test/host/` 下 `run_unit_test.py` 个数**)+ 分分支实测快照。本次合并只带文档与脚本,**零 C 代码改动**;合并后本分支 `@build` 0 错 0 警、`ci_local.py` 全绿(L0 25 钩子 + L0.5 10 runner / 647 断言) |
|
||||
| 2026-10-12 | ✅ **双看门狗缺陷实测收敛** + 修掉日志里的 PS 5.1 stderr 包装噪声与 `-Status` 假警。① 管理员 `-StartNow` 杀掉 3 个残留(孤儿看门狗 26900/19716 + 占锁 daemon 53848)→ `daemon up: pid 40360 (single instance)`,监管链 `svchost → 看门狗 → daemon`,看门狗日志 25 秒零增长、runner 回 online。② 新坑:daemon 日志写 **stderr**,PS 5.1 的 `2>&1` 把每行包成 ErrorRecord → `gitea-runner.exe : ` 前缀 + 4 行 `CategoryInfo` 块,实测 2 行真日志写成 8 行(**每 4 行有 3 行是噪声**,且就在文档让大家第一个打开的文件里)。启动器改为 `2>&1 \| ForEach-Object { "$_" } \| Out-File -Encoding utf8`(实测与 cmd 包装等价但免引号剥离坑,`$LASTEXITCODE` 不受影响);§7.2 方式 B 的示例原本正是 `> log 2>&1`(UTF-16LE + 包装双坑),已改;新增 §7.3 汇总这两条。③ `-Status` 两处诚实化:非管理员**读不到 SYSTEM 进程命令行**(`CommandLine` 为 null → 过滤器静默匹配 0 个),改为明说"需提权"而不是谎报"没有看门狗";重启循环判据不再靠"日志尾部有没有错误串"(文件不轮转,修好后旧失败仍在尾部 → 对健康 runner 报假警),改看 **daemon 进程存活时长**(CIM `CreationDate` 非管理员可读,`Process.StartTime` 对 SYSTEM 进程不可读) |
|
||||
|
||||
+10
-11
@@ -14,7 +14,7 @@
|
||||
> | `并行分道方案.md` | **待办横向归道**:文件级写域(域1~域8)· 八条道(道A~道H)· 批次与合并次序 · 不能并行的事项 | 低频——分道或批次变化时改;**明细不复制**,只做归道 |
|
||||
> | `暂缓-RS485.md` | B2 RS-485 整簇冻结清单(用户决定) | 极少 |
|
||||
> | `登记簿.md` | N-x / S-x / T-x 长期登记(网络 / 存储 / 硬件 / 测试 / 报告并轨) | 中频——新发现进对应表 |
|
||||
> | `测试与架构专项.md` | P1-10 收尾 + S1x / A-x 专项 | 低频 |
|
||||
> | `测试与架构专项.md` | S1x / A-x 专项(P1-10 / S12 / A-5 已于 2026-10-25 销项) | 低频 |
|
||||
> | `基线与待确认.md` | **只放还没答案的问题**(OQ 族属主登记处);基线类内容已移出到模块文档 | 参考,少改 |
|
||||
>
|
||||
> **怎么用**:想知道"现在该做什么、按什么顺序" → 本文件 **§2**;想知道"当前波次任务卡状态 / 验收判据 / 并行道" → `数据可信.md`;
|
||||
@@ -56,16 +56,15 @@
|
||||
|
||||
| 类别 | 数量 | 条目 |
|
||||
|---|---|---|
|
||||
| P1 收尾 | 1 | P1-10 测试固件构建实测(`测试与架构专项.md` §1) |
|
||||
| 网络 | 4 | N-2(49s 日志静默,**低风险观察项**)· N-3(L5 基线重验)· N-16(A2/A4 负向台架)· N-17(探针窗口心跳缺口) |
|
||||
| 网络 | 4 | **N-2(49s 日志静默,**低风险观察项**)🟦批2道F** · N-3(L5 基线重验)· N-16(A2/A4 负向台架)· **N-17(探针窗口心跳缺口)🟦批2道F** |
|
||||
| 存储 / 日志 | 3 | **S-3(USART1 TX-only 根治)** · S-4(dhara 重试自旋)· S-5(可选全序列卷锁) |
|
||||
| 结构 / 健壮性 | 4 | N-22(写回 flush)· N-23(注册校验残余白名单)· N-25(性能/语义簇)· N-28(uvprojx 空 TU 观察) |
|
||||
| 结构 / 健壮性 | 4 | **N-22(写回 flush)🟦批2道F** · N-23(注册校验残余白名单)· N-25(性能/语义簇)· N-28(uvprojx 空 TU 观察) |
|
||||
| 仓库 | 1 | N-29(`.git` **233 MB**,**已决策暂不处理、登记观察**) |
|
||||
| 硬件 | 1 | N-18(V0.2 改版项) |
|
||||
| 测试 / 基础设施 | 5 | T-7(CI 远端两 job 闭环 + 第二机交叉验证)· S12(断言宏)· A-4(采集链路测试约束,RS485 侧随 B2 暂缓)· A-5 残余(CI 体积门禁盲区)· 串口助手 A6/A7 补验(待 CH340) |
|
||||
| UI | 1 | U5 页面落地(**未排期**,最早在「数据可信」M4 之后) |
|
||||
| 测试 / 基础设施 | 3 | T-7(CI 远端两 job 闭环 + 第二机交叉验证)· A-4(采集链路测试约束,RS485 侧随 B2 暂缓)· 串口助手 A6/A7 补验(待 CH340) |
|
||||
| UI | 1 | U5 页面落地 🟦**批 2 道E 在途**(2026-10-25 开工;`ui_data` 快照层 + 27 叶 + 3 页回炉) |
|
||||
| **暂缓** | 2 簇 | **B2 RS-485 整簇**(`暂缓-RS485.md`)· **N-27 内存优化簇剩余**(R-2 后半 / R-3 / R-4 / R-6;重开条件见 `../内存管理/RAM使用分析与优化方案.md` §4)。⚠ 已落地的 R-9 与 `mem-budget` 门禁/台账/趋势**不回退** |
|
||||
| **数据可信**(当前波次) | 1 簇 · **14 张卡** | 已知电压注入验证 · 端子变比确认 · 通道标定系数与折算 · 标定落盘 · 未标定即闭锁 · 下游三常数重定 · 量纲回归 · 遥测快照 200 ms · 运行参数段 · 频率点绑定(详表 `数据可信.md`) |
|
||||
| **数据可信**(当前波次) | 1 簇 · 在途 7 卡 | 🟦批2道D:遥测快照 200 ms · 104 读快照+死区运行参数化 · 运行参数段 · 频率点绑定 |🔴台架/外部:已知电压注入 · 端子变比确认 · 标准源两点标定。**卡 1~7(口径/CFG_VAL_INT/折算/落盘/闭锁/三常数/量纲回归)已于 2026-10-25 销项**(详表 `数据可信.md` §5) |
|
||||
|
||||
> **网络侧 E-xx 存量项**(历史编号族,属主文档已于 2026-10-15 删除,编号冻结见
|
||||
> `docs/编号规范.md` §4.3):E-27 / E-28 挂「net 层跨上下文收口」(见 `排期详述.md` §1);
|
||||
@@ -77,7 +76,7 @@
|
||||
|
||||
1. **功能主线优先(用户决定 2026-10-12)**:把"采集→相量→保护→上送"链路收口到"台架闭环 + 功能面完整 + 可送检"。前两项已达成,「采集保护收尾」只剩 M3 送检(`采集保护收尾.md`)。**RS-485 对下采集(B2)暂缓**(`暂缓-RS485.md`),主线不等它。
|
||||
2. **内存预算红线已机械化**:`mem-budget` 钩子拦 RW_IRAM1/RW_CCM >92%,子系统配额 / CCM 台账 / 趋势基线 → `docs/内存管理/RAM预算台账.md`。**R-2 后半与 R-3 / R-4 / R-6 整簇暂缓**(CCM 只剩 **7,904 B**,重开条件见 `../内存管理/RAM使用分析与优化方案.md` §4)——**门禁与台账继续常开,它们正是"何时该重开"的传感器**。
|
||||
3. **验证债仅剩窗口性事项**(L5 基线重锁 / A2-A4 负向台架 / 探针窗口心跳 / 串口助手补验 + P1-10 收尾),不单独排期、逢窗口顺手做。
|
||||
3. **验证债仅剩窗口性事项**(L5 基线重锁 / A2-A4 负向台架 / 探针窗口心跳 / 串口助手补验),不单独排期、逢窗口顺手做。
|
||||
|
||||
---
|
||||
|
||||
@@ -100,8 +99,8 @@
|
||||
| **数据可信**(当前) | **通道标定 → 遥测链 → 运行参数**:M4 系数与量纲 / M5 遥测链 / M6 运行参数与点表;14 张卡与事实基线见 `数据可信.md` | **用户决定(2026-10-23):下一步做通道标定,先于 UI 页面与结构债**。它是唯一"改一处、全链受益"的入口(`App/task/adc_task.c:335` 是码值→工程量的唯一位置),也是「UI 扩展」页面与 104 遥测的共同前置——先做页面则 `ui_data_feed` 组装的码值帧要返工。本波紧随「采集保护收尾」,排在「预算与内存」「结构债」之前。⚠ 2026-10-23 补记:ADC 至今**从未采过已知电压**(连极性都没验过,见 `数据可信.md` §2.6),故第一张卡是"已知电压注入验证"——只需一块万用表,不需要信号源/示波器,是开工的第一刀 |
|
||||
| **预算与内存** | ⏸ **整簇暂缓**:R-2 后半(缩堆 56→32 KB → 29.5 KB 迁 CCM)· R-3 · R-4 · R-6;R-5 已判定不可行 | **不再排期**:没有功能在等这块预算,而搬迁要动 scatter、要逐条过 DMA 可达性清单、缩堆还要上板复测。重开条件 → `../内存管理/RAM使用分析与优化方案.md` §4 |
|
||||
| **结构债** | **USART1 改为只发不收 → 日志管线与 S8 合并评估 → net 层跨上下文收口 → 注册校验白名单清理 → 写回 flush / 性能语义簇 / 空 TU**(详表 `排期详述.md` §1) | 无紧急,按性价比排:USART1 那条灭 IWDG 误复位的机制根源;net 层收口体量大、验证重,放后 |
|
||||
| **验证常态** | P1-10 收尾 · T-7 CI · L5 基线重锁 · A2/A4 负向台架 · 探针窗口心跳 · 串口助手 A6/A7 · S12 · A-5(详表 `排期详述.md` §2) | 窗口性,逢机顺带,不单独排期 |
|
||||
| **UI 扩展** | **U5 页面落地**——27 是目标数不是差集(现存 7 个页面实现;27 个空叶子已归并为 7 模块 + 2 项前置能力) | **未排期**(2026-10-20 用户裁定暂缓)。地基已齐(U1~U4 落地、`ui-golden` 与字符集差集检查已挂 pre-commit),新增一页 = 3 处人工 + 1 条生成器命令。**最早在「数据可信」的 M4 之后开工**——`ui_data` / `ui_data_feed` 需要真数据(`数据可信.md` §10)。逐页规格见 `../UI设计/页面扩充详细方案.md` |
|
||||
| **验证常态** | T-7 CI · L5 基线重锁 · A2/A4 负向台架 · 探针窗口心跳 · 串口助手 A6/A7(详表 `排期详述.md` §2) | 窗口性,逢机顺带,不单独排期 |
|
||||
| **UI 扩展** | **U5 页面落地**——27 是目标数不是差集(现存 7 个页面实现;27 个空叶子已归并为 7 模块 + 2 项前置能力) | 🟦**批 2 道E 在途**(2026-10-25 开工,组件层三件套已于批 1 落地)。地基已齐(U1~U4 落地、`ui-golden` 与字符集差集检查已挂 pre-commit),新增一页 = 3 处人工 + 1 条生成器命令。**最早在「数据可信」的 M4 之后开工**——`ui_data` / `ui_data_feed` 需要真数据(`数据可信.md` §10)。逐页规格见 `../UI设计/页面扩充详细方案.md` |
|
||||
| **仓库决策** | **N-29** `.git` **233 MB** + 图片 36.3 MB | **已决策(2026-10-11):暂不处理、登记观察**——推送/协作前重评(`git filter-repo` 历史重写影响未推送提交与协作者) |
|
||||
| **暂缓** | **B2 RS-485 整簇**(`暂缓-RS485.md`) | **用户决定(2026-10-12):当前不处理 RS-485** |
|
||||
| **硬件改版** | N-18 8 路电气量全接 TPAFE(V0.2) | 下一版硬件;固件侧已用语义映射隔离,改版只动映射表 |
|
||||
@@ -120,7 +119,7 @@
|
||||
↓
|
||||
结构债 USART1 只发不收 → 日志管线与 S8 → net 层收口 → 白名单清理 → 写回/性能/空TU
|
||||
↓
|
||||
验证常态 P1-10 · T-7 CI · L5 基线重锁 · A2/A4 负向台架 · 探针心跳 · 串口助手 · S12 · A-5
|
||||
验证常态 T-7 CI · L5 基线重锁 · A2/A4 负向台架 · 探针心跳 · 串口助手
|
||||
↓
|
||||
UI 扩展 U5 页面落地(未排期,最早「数据可信」M4 之后)
|
||||
仓库决策 N-29 .git 233MB(已决策暂不处理) 硬件:N-18 V0.2
|
||||
|
||||
+5
-3
@@ -15,8 +15,10 @@
|
||||
|
||||
## 1. 一句话结论
|
||||
|
||||
> **起跑状态(2026-10-25 实测)**:`task list` 报"没有任务空间",`git worktree list` 只剩主树 →
|
||||
> **3 个名额全空,批 1 可直接开三棵**。
|
||||
> **批 1 已收口(2026-10-25)**:九分支全合主干(`15aa085`→`db9f256`,工作树清零、两锁空闲);
|
||||
> M4 六条 ②③④⑥ 达成、①⑤台架面 deferred(归卡 0/0b/12);台架 f2→f3 转 PASS 并顺带复活
|
||||
> HW 模式看门狗掩码死分支。**批 2 在途(同日开工)**:道D 遥测(卡 8~11)∥ 道E UI 页面
|
||||
> (`ui_data` + 27 叶 + 3 页回炉)∥ 道F 结构债(N-2 评估 / N-22 flush / N-17 心跳缺口)。
|
||||
> 道C 不含主机单测(S1-c 已完成,证据见 `docs/测试说明/主机单测覆盖率口径.md` §9),
|
||||
> 只剩"断言宏 + 门禁 + 构建实测"三件。
|
||||
|
||||
@@ -182,7 +184,7 @@
|
||||
|
||||
---
|
||||
|
||||
## 5. 批 1 三道详解(可以今天开工)
|
||||
## 5. 批 1 三道详解(✅ 2026-10-25 收口:九分支全合入,本节转为过程记录)
|
||||
|
||||
### 5.1 道A「标定与量纲」(关键路径)
|
||||
|
||||
|
||||
+18
-29
@@ -69,9 +69,10 @@ frame[s] = (float)code;
|
||||
|
||||
- 通道数:`ADC_SEM_COUNT = 9`(8 电气 + 温度),定义见 `App/algo/adc_input.h`。
|
||||
- 分压比出处:`docs/硬件平台/ADC通道映射说明.md` §7"前端偏置"行(每路 1k 串联 + 1k 到 `*_GND`)。
|
||||
- ⚠ **两处文档口径冲突,落地前必须定死**:`docs/硬件平台/ADC通道映射说明.md` §1 写 TPAFE "±10 V",
|
||||
§7 写"默认 ±5 V(RANGE 接 GND)、LSB 152.59 µV"。按 LSB × 65536 = 10 V **跨度**反推 §7 正确,
|
||||
§1 的"±10V"应理解为跨度而非正负范围。**这个不定死,TPAFE 侧系数差一倍。**
|
||||
- ✅ **口径已定死(2026-10-25,卡 1 销项)**:`docs/硬件平台/ADC通道映射说明.md` §1/§7 统一为
|
||||
"±5 V 满量程 = 10 V 跨度、LSB 152.59 µV"("±10 V" 仅作芯片可选档括注,本板 RANGE 接 GND 未用);
|
||||
全仓搜 `±10 V` 无本板口径残留。分段链路口径(引脚侧已冻结 / 分压读法待卡 0 / 变比待卡 0b)
|
||||
见同文档 §7.1。
|
||||
- ⚠ **上表的"板级系数"只到 ADC 引脚,不到端子**(2026-10-23 补充):1k 串 + 1k 到地这组网络,
|
||||
`docs/硬件平台/V0.0_网表详细分析报告.md` §4.7 定性为"**源阻抗匹配(手册推荐做法,非分压)**";
|
||||
端子到引脚之间还有一级子板/端子板的变比,而**仓库里没有任何文档给出该变比**
|
||||
@@ -284,19 +285,16 @@ typedef struct {
|
||||
|---|---|---|---|---|---|---|
|
||||
| **0** | **已知电压注入验证(首次功能级 ADC 验证)** | 在**可安全接触的最低一级**(ADC 引脚侧或端子侧,二选一并在证据里写明注入点)用板载 3.3 V 轨经电位器注入 **3 个直流点**(≈0.3 / 1.0 / 2.0 V),每点**同时**用万用表读注入点实际电压 + 读 `adc_input_raw()` 码值:① 三点线性拟合 **R² ≥ 0.999**;② 注入点在引脚侧时,斜率须与 §2.1 理论值(TPAFE 6553 码/V、STM32 1241 码/V)偏差 **≤2 %**;在端子侧时把斜率记为**实测变比**;③ 注入 0 V(短接 AGND)零点 \|码\| ≤ 10(TPAFE)/ ≤ 5(STM32),并解释首帧 ~1000 码的来源;④ **逐通道映射确认**:8 路电气量逐个注入,确认"注入哪一路、哪一路语义变化",语义与下标不符即映射错;⑤ TPAFE 侧原"BUSY 有脉冲"判据**改用固件帧计数**(注入前后 `tpafe5160_frame_seq()` 仍严格 1000 Hz 递增)——不需要示波器;⑥ 结论写回 `docs/硬件平台/ADC通道映射说明.md` §8,把"尚未执行"改为实测值 + 日期 | 1 | 🔴 + 万用表(**不需信号源 / 示波器**) | `docs/硬件平台/ADC通道映射说明.md`、`docs/测试说明/boot_log_data/` | ⬜ |
|
||||
| **0b** | **端子 / 子板变比确认** | 给出"端子电压 → ADC 引脚电压"的比值(万用表同时量端子与引脚,或查子板原理图后实测核对),写入 `docs/硬件平台/ADC通道映射说明.md`;据此判定 `eng` 能否置 1;数据缺失则本波只交付引脚电压并登记缺口 | 0 | 🟡 子板实物或原理图 | `docs/硬件平台/` | ⬜ |
|
||||
| **1** | **TPAFE 量程口径定死并更正文档** | `docs/硬件平台/ADC通道映射说明.md` §1 与 §7 统一为"±5 V 满量程 = 10 V 跨度、LSB 152.59 µV",§1 的"±10 V"改为"10 V 跨度"或加括注;全仓搜 `±10 V` 无遗留歧义 | 无 | 🟢 | `docs/硬件平台/ADC通道映射说明.md` | ⬜ |
|
||||
| **2** | **通道标定模块与折算函数** | 新增 `App/algo/adc_cal.c/h`:`adc_cal_init()` / `adc_cal_apply(sem, code)` / `adc_cal_flags(sem)` / `adc_cal_k_uv(sem)`;`adc_task.c:335` 改为调用折算,**输出单位 = ADC 引脚电压 V**(`eng=0`;端子变比由卡 0b 另存,不在本卡内混算);主机单测覆盖 8 通道 × 3 个码值点,期望值由 LSB 常数独立算得(不是抄实现);`@build` 0 错 0 警 | 1 | 🟢 | `App/algo/adc_cal.*`(新)、`App/task/adc_task.c`、`test/host/` | ⬜ |
|
||||
| **3** | **`cfg_file` 补有符号整型值类型** | 新增 `CFG_VAL_INT`:`s_decode` 分支用 `strtol` + 范围校验,`s_gen_document` 输出带负号;主机单测覆盖 `-1` / `INT32_MIN` / 越界拒绝 / 往返一致;既有 `network`/`ftp` 段回归不变 | 无 | 🟢 | `App/cfg/cfg_file.c/.h`、`test/host/` | ⬜ |
|
||||
| **4** | **标定系数落盘与整定入口** | 注册 `[adc_cal]` / `[adc_cal_ofs]` 两段(§4.4 布局);上电加载:段缺失/损坏/键非法 → 回退 ROM 理论系数 + `[ERR]` 留痕;`adc_cal_set()` 写值并置 `VALID`;主机单测覆盖"段损坏 → 回退默认且 flags 无 VALID" | 2、3 | 🟢 | `App/algo/adc_cal.*`、`App/cfg/` | ⬜ |
|
||||
| **5** | **未标定即闭锁** | `protect_task.c` 新增闭锁源:UA/UN/IA 的 `VALID` 未全置位 → `prot_elm` 复位且本拍不 eval;边沿日志区分"未标定闭锁"与"采样故障闭锁";台架 `@test` 判据同步更新(默认构建下保护不动作是**期望行为**) | 2 | 🟢 + 🔴 | `App/task/protect_task.c`、`App/algo/prot_elm.*`、`test/` | ⬜ |
|
||||
| **6** | **下游三常数按工程量重定** | ① `FREQ_AMP_MIN` 改为二次值口径并在注释里写清判据来源(对 100 V PT 为何取该值);② `k_yc[].deadband` 9 点按"额定 0.5 %"规则重定并注明;③ `g_prot_set_meta[]` 的 A/V 默认值与 `min`/`max` 复核,与二次值量程自洽;三处注释都指向同一份换算依据 | 2 | 🟢 | `App/algo/freq.h`、`App/protocol/iec104/iec104_pts.c`、`App/algo/prot_set.c` | ⬜ |
|
||||
| **7** | **量纲回归用例(不该动作时不动作)** | 主机单测:给定定值 + 标定后的码值序列 → 断言"低于定值不动作 / 高于定值按延时动作 / 返回系数滞回正确";**用例里显式写出码值→二次值的换算**,使"码值当工程量"这个错配一旦复发立即 FAIL;覆盖 OC1/OC2/OC3/OL/OV/UV/3U0 七类 | 2、5、6 | 🟢 | `test/host/` | ⬜ |
|
||||
| **8** | **遥测快照模块(200 ms)** | 新增 `App/algo/meas.c/h`:`meas_snap_t`(§4.5 布局)、`meas_tick()`(由 `adc_task` 200 ms 分频调用)、`meas_get()`、`meas_seq()`;并发沿用 `phasor` 双区 + 单字节索引翻转,读者无锁;主机单测覆盖 seq 递增、双区切换无撕裂、品质汇总(任一点 CLIPPED → 该点 `qds` 置位);RAM 增量 = 2×72 B ≈ 144 B | 2 | 🟢 | `App/algo/meas.*`(新)、`App/task/adc_task.c` | ⬜ |
|
||||
| **9** | **104 遥测改读快照 + 死区改运行参数** | `s_src_yc_read()` 改为读 `meas_get()`;`k_yc[].deadband` 从编译期常量改为运行时取值(先读 ROM 默认,M6 后读运行参数段);PC 主站总召读回值与工程量一致(记录到 `docs/测试说明/boot_log_data/`) | 6、8 | 🟢 + 🔴 | `App/protocol/iec104/iec104_pts.c` | ⬜ |
|
||||
| **10** | **运行参数段 `0x8020~0x8058`** | 新增 `App/algo/run_par.c/h`:至少含遥测死区(9 点)+ 通道系数覆盖;cfg 段持久化(键数受 16 限制,必要时再拆段);104 段读写映射(`C_RD`/`C_SE`);主机单测覆盖读写往返 + 越界拒绝 | 4、9 | 🟢 | `App/algo/run_par.*`(新)、`App/protocol/iec104/`、`App/cfg/` | ⬜ |
|
||||
| **11** | **频率点 `0x401D` 绑定** | `k_yc[]` 的 `0x401D` 从 `-1` 改为频率源(YC 表加 `src` 类型区分 phasor / freq);`freq_valid()==0` 时品质 IV;PC 主站读回频率与 `freq_get()` 一致(±0.01 Hz) | 6 | 🟢 + 🔴 | `App/protocol/iec104/iec104_pts.c` | ⬜ |
|
||||
| **12** | **8 通道两点标定与精度验收** | 电压 4 路(UA/UB/UC/UN)+ 电流 4 路(IA/IB/IC/IN)各做两点标定(零点 + 满度,温度不纳入),写入 `[adc_cal]` 并置 `VALID`;误差 ≤ 目标精度(待定:0.5 级 / 1 级);证据归档 | 0、0b、4 | 🟡 标准源 / 继保测试仪 | `docs/算法/`、`docs/测试说明/boot_log_data/` | ⬜ |
|
||||
|
||||
> **卡 1~7 已销项**(2026-10-25 批 1 道A:`task/cal-scale-doc`→231dc81、`task/cal-adc-cal`→d39e5c9、
|
||||
> `task/cal-lockout-dim`→59da40b;证据沉淀 `docs/算法/采集与算法层设计说明.md`、
|
||||
> `docs/硬件平台/ADC通道映射说明.md` §7.1 与 `App/algo/adc_cal.*`)。M4 六条中 ②③④⑥ **达成**;
|
||||
> **①(卡 0 注入验证)与 ⑤ 的台架面 deferred**——M4 行保留,卡 0 跑完再整波收口。
|
||||
> **两张 🟡 外部依赖卡**:卡 0b(子板变比)与卡 12(标准源)。二者都**不阻塞** M4~M6 的软件道——
|
||||
> M4 用板级 LSB 常数即可退出(`eng=0`),但"二次值"真正成立要靠 0b 的变比、`VALID` 置位要靠 12。
|
||||
> 卡 0(引脚侧注入)**没有外部依赖**,只需一块万用表,是今天就能做的第一步。
|
||||
@@ -306,31 +304,22 @@ typedef struct {
|
||||
## 6. 并行与顺序
|
||||
|
||||
```
|
||||
① 事实与地基(可并行) 1 量程口径 ∥ 3 CFG_VAL_INT
|
||||
1 ─→ 0 已知电压注入(🔴 台架 + 万用表)
|
||||
↓(ROM 默认系数冻结须等 0 的结论)
|
||||
② 核心折算(关键路径起点) 2 标定模块
|
||||
↓
|
||||
③ 三条分支(可并行)
|
||||
├─ 4 落盘 ─→ 5 未标定闭锁 ─┐
|
||||
├─ 6 三常数重定 ───────────┼─→ 7 量纲回归
|
||||
└─ 8 遥测快照 ─→ 9 104 读快照 ─→ 10 运行参数段
|
||||
6 ─→ 11 频率点绑定
|
||||
② 核心折算+三条分支(✅ 2026-10-25 销项:231dc81 / d39e5c9 / 59da40b)
|
||||
2 标定模块 ─→ 4 落盘 ─→ 5 未标定闭锁 ─┐
|
||||
6 三常数重定 ─────────────────────┼─→ 7 量纲回归
|
||||
③ 批 2 在途
|
||||
8 遥测快照 ─→ 9 104 读快照 ─→ 10 运行参数段
|
||||
6 ─→ 11 频率点绑定
|
||||
|
||||
台架道(🔴,串行):0 注入验证 → 5 闭锁验证 → 9 主站读回 → 11 频率核对
|
||||
外部道(🟡,与软件道并行):0b 变比确认 → 12 标准源两点标定(本波末)
|
||||
```
|
||||
|
||||
- **卡 0 与卡 2 可并行**(代码不依赖实测值),但**卡 4 的 ROM 默认系数必须等卡 0 的结论**;
|
||||
若卡 0 实测斜率与理论值偏差 >2 %,**先查前端(分压/变比/焊接)再改系数**——用系数去凑
|
||||
一个错误的斜率,会把硬件的错固化成"标定值"。
|
||||
- **关键路径**:`2 → 4 → 5`(M4 退出条件全在这条线上)。卡 1 是它的前置事实输入,必须先做。
|
||||
- **卡 3 可完全并行**:它只碰 `cfg_file.c`,与标定模块零交集。
|
||||
- **卡 6 与卡 4 无依赖**(改的是三个常数的值,不依赖落盘),但**必须在卡 7 之前**完成,
|
||||
否则回归用例断言的是错的期望。
|
||||
- **卡 0 斜率规则对 ROM 默认仍有效**(卡 1~7 已按理论 LSB 冻结销项):实测斜率与理论值
|
||||
偏差 >2 % 时**先查前端(分压/变比/焊接)再改系数**——用系数凑斜率会把硬件的错固化成"标定值"。
|
||||
- **WIP ≤ 2**:代码道最多 2 个并行(台架道 1 个),沿用 `docs/环境与部署/并行任务工作树方案.md` §7.3。
|
||||
- **写范围冲突预警**:卡 2 / 4 都改 `App/algo/adc_cal.*`,必须同一分支顺序做;
|
||||
卡 9 / 11 都改 `iec104_pts.c`,同上。
|
||||
- **写范围冲突预警**:卡 9 / 11 都改 `App/protocol/iec104/iec104_pts.c`,必须同一分支顺序做;
|
||||
卡 8 新 `App/algo/meas.*`、卡 10 新 `App/algo/run_par.*`,落新文件须双端注册。
|
||||
|
||||
---
|
||||
|
||||
|
||||
+10
-6
@@ -9,12 +9,16 @@
|
||||
> `../测试说明/主机单测覆盖率口径.md` §9「P1 落地」与「P2 落地」(S1-c:`sys_log_mcu` 106 例、
|
||||
> `time_sync` 既有 4 例,两套均已被 `test-coverage` 总闸覆盖)。
|
||||
|
||||
## 1. P1 收尾(1 项:P1-10 剩构建实测闭环)
|
||||
## 1. P1 收尾(0 项:P1-10 已于 2026-10-25 销项)
|
||||
|
||||
### P1-10 测试固件静态 RAM 预算(基线已重建、缓冲已瘦身,剩构建实测闭环)
|
||||
|
||||
- **位置**:`MDK-ARM/STM32F407-Demo/STM32F407-Demo.sct`(`RW_IRAM1 0x20000000 0x00020000` = 128KB;芯片 192KB 的上部 64KB 有意未映射,克隆芯片兼容性考量)
|
||||
- **剩余**:① CH395F 套件(`TEST_SUITE_CH395F`,HW 全阶段 / NET 层 7 配置)实际构建确认链接通过——PHASE5 三静态缓冲 3×4093B 仍在,理论余量足够但未实测;② `@test` 闭环。
|
||||
- **已销项(2026-10-25,`task/P1-10-test-fw`→73f9e10)**:① CH395F 套件 **5 档**实际构建全部链接通过
|
||||
(PHASE5 三静态缓冲确证在链:ch395f_test_task.o 数据段 12,285 B;最坏态 RW_IRAM1 91,088 B / 69.5%,
|
||||
距 92% 线余 29,498 B——数字与规范正文见 `test/board/ch395f_test.h` 开关区,同一事实不在此重复);
|
||||
② `@test` f3 轮 **VERDICT PASS**(Phase 1/12/15 = 9/9、1/1、21/21,身份戳 + 烧后回读核对,
|
||||
bench PASS 入 task-worktree 台账;f2→f3 顺带复活 HW 模式看门狗掩码死分支 a9ba8ec,台架记录同文件)。
|
||||
- **约束**:**不建议**扩 scatter 到 192KB(破坏既有克隆芯片兼容决策)。
|
||||
|
||||
## 2. 测试与架构改进专项(S1x / A-x)
|
||||
@@ -23,11 +27,10 @@
|
||||
|
||||
| 编号 | 事项 | 状态 | 详述 |
|
||||
|---|---|---|---|
|
||||
| **S12** | 模块级轻量断言宏 | ⬜ 待做(第 4 波按需) | §2.1 |
|
||||
| **A-4** | ADC / RS485 采集链路的**测试可验证性约束** | ⏸ ADC 侧随 B1 闭环;**RS485 侧随 B2 暂缓(`暂缓-RS485.md`)** | §2.2 |
|
||||
| **A-5 残余** | CI 体积门禁盲区(`mem-numbers` 在 CI 被跳过) | ⬜ 未消除 | §2.3 |
|
||||
|
||||
### 2.1 S12:模块级轻量断言宏 ⬜
|
||||
### 2.1 S12:模块级轻量断言宏 ✅(2026-10-25 销项,实现 `Drivers/BSP/app_assert.h`→658fbe7;
|
||||
落位与示意稿 `App/util/` 的偏离理由 = layer-deps 方向约束,载于该头注释与提交正文)
|
||||
|
||||
**动机**:`configASSERT` 只覆盖 FreeRTOS 内部;自研代码的"不该发生"靠散落的 `if`。
|
||||
|
||||
@@ -69,7 +72,8 @@
|
||||
|
||||
**完成判据**:B2 设计文档体现上述三条;协议解析函数有对应 L0.5 单测。(B1 侧:ADC 无协议解析面,其"同一时刻性"由原子快照保证、已闭环。)
|
||||
|
||||
### 2.3 A-5 残余:CI 体积门禁盲区 ⬜
|
||||
### 2.3 A-5 残余:CI 体积门禁盲区 ✅(2026-10-25 销项,同码凭证 + CI 复核→564715c、
|
||||
跨树稳定修复→7c4628b;口径唯一正文 = `scripts/check_size_gate.py` docstring)
|
||||
|
||||
**现状**:`mem-numbers` 钩子**在 CI 上被跳过**(CI 无 `.map`)→ **CI 不守体积门禁**。
|
||||
S14 已在 workflow 显式提示"体积门禁未执行"(`::notice::`)并在 `../CI/远程CI完整指南.md` 声明,
|
||||
|
||||
@@ -66,7 +66,10 @@ RAM 预算门禁 FAIL:RW_CCM 占用 92.3% > 92%(阈值 92%)
|
||||
"还剩多少才够下一个任务/缓冲"——那是 `docs/内存管理/RAM预算台账.md` 的配额表与人的事。
|
||||
2. **静态视角**:栈峰值、堆低水位、碎片一概看不见(运行时水位要靠串口 `[STACK]` 与 `stack_report.py`)。
|
||||
3. 只看两个区:Flash(`ER_IROM1`)不在本门阈值内,它由 `mem-numbers` 报数、无人卡阈值。
|
||||
4. `.map` 缺失即"通过"式跳过 → **在没有 Keil 构建的环境里绿,不代表有余量**。
|
||||
4. `.map` 缺失即"通过"式跳过 → **在没有 Keil 构建的环境里绿,不代表有余量**。**远端缺口已于
|
||||
2026-10-25 关闭**:`scripts/check_size_gate.py --ci` 用同码凭证按**同一常数**复核红线(runner
|
||||
无需 Keil),`--gate` 无 `.map` 的 SKIP 文案也已改为明说「SKIP 不等于 PASS」;口径正文 =
|
||||
该脚本 docstring。
|
||||
5. 配额对照是"目标态 vs 现状",现状超配(例如 UI)会被如实展示但**不拦提交**——它是台账,不是红线。
|
||||
6. 阈值/配额改动没有双人复核机制,改 `QUOTAS` 或 `THRESHOLD_PCT` 只靠提交说明约束。
|
||||
7. 并行分支约定(Lead 裁决 2026-10-12):**分支不跑 `--write`**,台账由主干统一回填;分支上
|
||||
|
||||
@@ -24,8 +24,9 @@
|
||||
## 3. 触发面与"看不见"的地方
|
||||
|
||||
- 事实源必须是**最新一次 `@build` 产出的 `.map`**;`.map` 不存在(这台机器没做 Keil 构建)
|
||||
→ **自适应跳过**(与 `ram_baseline.py --gate` 同口径)。CI 明确不跑构建,所以这一门在远端
|
||||
CI 是盲区,登记在 `docs/任务规划/` 的专项里。
|
||||
→ **自适应跳过**(与 `ram_baseline.py --gate` 同口径)。CI 明确不跑构建,这一门在远端曾长期
|
||||
是盲区——**2026-10-25 已由同码凭证关闭为强制路径**(`scripts/check_size_gate.py`,口径正文见其
|
||||
docstring;CI 复核同码性 + 按凭证数字复跑红线,不重算绝对值)。
|
||||
- 只覆盖脚本配置里登记的文档与字段;**没进受管区、也没被 `--scan` 认出的数字 = 无人核对**。
|
||||
|
||||
## 4. 报错怎么读
|
||||
@@ -53,7 +54,9 @@
|
||||
4. 依赖最新构建:`@build` 之后没跑 `--write` 与文档同步,就会红;反过来,**先 `--write` 再改代码**
|
||||
会写出与将要提交的代码不一致的漂亮数字。
|
||||
5. 只覆盖已登记的文档:新开一篇写满体积数字的文档,不在名单里就没人管。
|
||||
6. 数字口径 = `.map` 的静态视图,**不含运行时水位**(栈峰值、堆低水位、碎片)——那些要另跑
|
||||
6. 同码凭证(2026-10-25)不重算绝对数字,只复核"代码 == 测量时的代码"与红线复算;编译器选项
|
||||
(`.uvprojx`)不在指纹范围内——换优化等级不改指纹,靠本地 `@build` 纪律兜。
|
||||
7. 数字口径 = `.map` 的静态视图,**不含运行时水位**(栈峰值、堆低水位、碎片)——那些要另跑
|
||||
`scripts/stack_report.py` 与串口 `[STACK]` 读数。
|
||||
|
||||
## 7. 豁免与基线
|
||||
|
||||
Reference in New Issue
Block a user