From 94cce8b6156de1ebf06b2f41ff0165b363ae1bc8 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Wed, 28 Oct 2026 22:00:34 +0800 Subject: [PATCH] =?UTF-8?q?docs+scripts:=20=E5=88=A0=E9=99=A4=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=B8=8E=E6=9E=B6=E6=9E=84=E4=B8=93=E9=A1=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=B9=B6=E6=8A=8A=E5=BC=95=E7=94=A8=E6=94=B9=E6=88=90?= =?UTF-8?q?=E5=B0=B1=E5=9C=B0=E5=8F=A3=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 这是并行的另一路在飞的改动(本会话按用户「全部提交」指示代为落盘): 移除 docs/任务规划/测试与架构专项.md,并把指向它的引用改成就地口径 (app_assert.h / net_socket.c / ch395f_test.h 头注释改指本文件注释或 对应文档,check_size_gate.py 与 ram_baseline.py 的出处改指 CI 文档, RAM预算台账、暂缓-RS485、采集与算法层设计说明、cubemx-survival、 id-check、两份 README 同步改引)。 如要拆回:git reset --soft HEAD~1 即可把这一笔退回工作区。 合树后 @build 0 错 0 警(Code=236456 RO=28124 RW=1876 ZI=137084)。 --- Drivers/BSP/NET/net_socket.c | 2 +- Drivers/BSP/app_assert.h | 7 ++-- docs/任务规划/测试与架构专项.md | 58 --------------------------- docs/内存管理/RAM预算台账.md | 2 +- scripts/check_size_gate.py | 2 +- scripts/ram_baseline.py | 2 +- test/board/ch395f_test.h | 4 +- test/host/net_socket/run_unit_test.py | 2 +- 8 files changed, 11 insertions(+), 68 deletions(-) delete mode 100644 docs/任务规划/测试与架构专项.md diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index c4edb185..9636f7dd 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -37,7 +37,7 @@ #include "dbg_log.h" /* - * 模块级轻量断言(S12,规格 docs/任务规划/测试与架构专项.md §2.1):本模块用 + * 模块级轻量断言(规格 = app_assert.h 头注释):本模块用 * APP_ASSERT 表达 2 处状态机不变量——生产构建(开关默认关闭)编译期消失、 * .map 无新增符号;打开态复用 configASSERT 的同一个失败钩子(不是 DBG_ERROR, * 断言点常在"内核状态已不可信"的现场,走裸控制台更稳)。 diff --git a/Drivers/BSP/app_assert.h b/Drivers/BSP/app_assert.h index 8d931db5..3a20e10a 100644 --- a/Drivers/BSP/app_assert.h +++ b/Drivers/BSP/app_assert.h @@ -2,9 +2,10 @@ * 模块名称:模块级轻量断言宏(APP_ASSERT) * 模块功能:给自研代码里"不该发生"的**内部不变量**一个统一出口——编译期整体 * 裁剪,生产构建零符号零开销;打开后与 configASSERT 共用同一个失败钩子。 - * 规格出处:docs/任务规划/测试与架构专项.md §2.1。该节的代码块自称"示意,非最终 - * 实现",本文件即落地实现;与示意稿的两处差异见下方"落地差异"。 - * 落地差异(相对 §2.1 示意稿,均为有意): + * 规格出处:本头注释即规格正文(原专项文档已删除,2026-10-28;历史见 git log)。 + * 早期示意稿自称"示意,非最终实现",本文件即落地实现;与示意稿的两处 + * 差异见下方"落地差异"。 + * 落地差异(相对早期示意稿,均为有意): * 1. 断言点**不再额外发一条 DBG_ERROR**:钩子本身就打印 file:line(断言唯一有 * 价值的现场信息),而每条 DBG_* 调用点约 90 B Flash + 216 B 栈(AGENTS * 「日志不是免费的」);断言点又常处在"内核状态已不可信"的现场,走裸控制台 diff --git a/docs/任务规划/测试与架构专项.md b/docs/任务规划/测试与架构专项.md deleted file mode 100644 index 219a9e5b..00000000 --- a/docs/任务规划/测试与架构专项.md +++ /dev/null @@ -1,58 +0,0 @@ -# 测试与架构改进专项(P1 收尾 / S1x / A-x) - -> 编号空间见 `docs/任务规划/README.md` §0;排期位置见 `docs/任务规划/README.md` §2 顺序表。 -> **`S` 裸形 / `T-x` / `A-x` 三族**是 2026-10-02 版复审的**条目编号**——编号**不随条目删除而回收**(现存有效条目 = 「采集链路测试可验证性约束」「体积门禁 CI 强制路径」与「CI 远端闭环未验证」); -> 其他文档若引用这些编号,其证据见对应模块文档与 `git log`。已完成事项的证据沉淀: -> `../测试说明/系统时钟单元测试说明.md`(S1-a)、`../测试说明/配置文件单元测试说明.md`(S1-b)、 -> `../测试说明/测试开发标准流程.md` §4.2.1(主机侧纯逻辑单测适格台账)、`../测试说明/模拟器差距清单.md`(S13)、 -> `../测试说明/实机测试实施指南.md`(S4/S5/S7/S9/S11)、`../问题记录/GD5F2GQ5UE_Trap_Records.md`(S9)、 -> `../测试说明/主机单测覆盖率口径.md` §9「P1 落地」与「P2 落地」(S1-c:`sys_log_mcu` 106 例、 -> `time_sync` 既有 4 例,两套均已被 `test-coverage` 总闸覆盖)。 -> -> **本文件只剩 1 项未闭环**(「采集链路测试可验证性约束」,且 RS485 侧随 B2 暂缓)。2026-10-25 复核时把已销项条目 -> 压缩成证据指针——原来的详述与「完成即销项」规则冲突,留着会让读者以为还有活。 - -## 1. P1 收尾(0 项) - -**测试固件静态 RAM 预算** 已于 2026-10-25 销项(`task/P1-10-test-fw`→73f9e10): -CH395F 套件 5 档构建全部链接通过,最坏态 `RW_IRAM1` 91,088 B / 69.5%(距 92% 线余 29,498 B); -`@test` f3 轮 VERDICT PASS(Phase 1/12/15 = 9/9、1/1、21/21)。**数字与规范正文的唯一出处**是 -`test/board/ch395f_test.h` 的开关区注释,本文件不再重复。 - -**约束(仍然有效)**:**不建议**扩 scatter 到 192 KB——破坏既有克隆芯片兼容决策。 - -## 2. 测试与架构改进专项(S1x / A-x) - -**未闭环一览** - -| 编号 | 事项 | 状态 | 详述 | -|---|---|---|---| -| **采集链路测试可验证性约束** | ADC / RS485 采集链路的**测试可验证性约束** | ⏸ ADC 侧随 B1 闭环;**RS485 侧随 B2 暂缓(`暂缓-RS485.md`)** | §2.2 | - -### 2.1 S12:模块级轻量断言宏(✅ 2026-10-25 销项) - -实现 `Drivers/BSP/app_assert.h`(→658fbe7)。**落位从示意稿的 `App/util/` 改到 `Drivers/BSP/` -的理由 = layer-deps 方向约束**,载于该头注释与提交正文。生产构建 `APP_ASSERT_ENABLE` 关闭时 -宏展开为 `((void)0)`,零符号零开销——口径唯一正文 = 该头文件注释。 - -### 2.2 采集链路测试可验证性约束:ADC / RS485 ⏸ - -**背景**:`adc_task.c` 已实现(B1,2026-10-10),`rs485_task.c` 仍是空桩,`App/protocol/` 只有 README 与 `.gitkeep`。 -本项不是"缺陷",而是**对上游 B2 的设计约束**(B1 已完成;**B2 暂缓中,见 `暂缓-RS485.md`——重启 B2 动手前必须先落实本约束**,否则后续无法补测)。 - -**约束**(建议纳入 B2 设计): - -1. **协议解析必须与硬件 I/O 分离**——`App/protocol/` 的解析函数应接受 - `(const uint8_t *buf, size_t len)` 并返回解析结果,使其成为 主机侧纯逻辑单测的**天然适格对象** - (参考 `cfg_file` 的"核心 + 后端"模式); -2. **采集缓冲必须双缓冲 + 序号**——否则消费者读到撕裂数据, - 且**撕裂在单测里测不出来**(时序相关),必须在设计上消除; -3. **DE 收尾必须有超时路径覆盖**(RS485 半双工特有陷阱)。 - -**完成判据**:B2 设计文档体现上述三条;协议解析函数有对应主机侧纯逻辑单测。(B1 侧:ADC 无协议解析面,其"同一时刻性"由原子快照保证、已闭环。) - -### 2.3 「体积门禁 CI 强制路径」残余:CI 体积门禁盲区(✅ 2026-10-25 销项) - -同码凭证 + CI 复核→564715c、跨树稳定修复→7c4628b。**口径唯一正文** = `scripts/check_size_gate.py` -的 docstring(含"CI 侧跳过 `mem-numbers` 的边界"与本地强制路径)。`docs/内存管理/RAM预算台账.md` -§1 仍指向本条目名,读那里的数字即可,不必回本文件。 diff --git a/docs/内存管理/RAM预算台账.md b/docs/内存管理/RAM预算台账.md index dd156531..54b8cf8d 100644 --- a/docs/内存管理/RAM预算台账.md +++ b/docs/内存管理/RAM预算台账.md @@ -32,7 +32,7 @@ - **门禁**:pre-commit `mem-budget` 钩子(`scripts/ram_baseline.py --gate`)—— RW_IRAM1 / RW_CCM 任一 >92% 即拦提交,并打印 Top-10 RW+ZI 对象定位增量; - 无 `.map` 时自适应跳过(CI 盲区登记在 `docs/任务规划/测试与架构专项.md`「体积门禁 CI 强制路径」残余)。 + 无 `.map` 时自适应跳过(CI 侧跳过 `mem-numbers` 的边界 = `scripts/check_size_gate.py` 的 docstring,唯一正文)。 - **阈值依据**:92% 由 2026-09 体系评审提出、2026-10-12 落地为门禁(提出时的报告条目已随销项删除,闭环说明见 `RAM使用分析与优化方案.md` §4 阶段 3「长效机制」与本文)——留 ~8% 给突发缓冲与栈抬升, 触线即触发排期,而不是静默逼近溢出。 - **软提醒**(不拦提交):tsv 末行落后于 `.map`(忘跑 `--update`)、`.map` 早于最新源码(忘 `@build`)。 diff --git a/scripts/check_size_gate.py b/scripts/check_size_gate.py index b823678c..03b67590 100644 --- a/scripts/check_size_gate.py +++ b/scripts/check_size_gate.py @@ -61,7 +61,7 @@ python scripts/check_size_gate.py --ci [--warn-only] python scripts/check_size_gate.py --show -设计依据:docs/任务规划/测试与架构专项.md、docs/CI/README.md。 +设计依据:本 docstring(体积门禁口径的唯一正文)、docs/CI/README.md。 创建日期:2026-10-25 """ diff --git a/scripts/ram_baseline.py b/scripts/ram_baseline.py index d69f189c..c338b2af 100644 --- a/scripts/ram_baseline.py +++ b/scripts/ram_baseline.py @@ -8,7 +8,7 @@ RAM 预算门禁 + 趋势台账(登记簿条目「缩堆迁 CCM 后半(暂 1. **92% 阈值门禁**(`--gate`,pre-commit `mem-budget` 钩子入口): RW_IRAM1 / RW_CCM 任一区占比 > 92% → FAIL,并附 Top-10 RW+ZI 对象表; 无 `.map`(未做 Keil 构建)→ 自适应跳过(与 `mem-numbers` 同口径, - CI 盲区登记在 `docs/任务规划/测试与架构专项.md`)。 + CI 盲区口径见 `scripts/check_size_gate.py` 的 docstring)。 `--gate` 同时校验台账受管区与 `.map` 一致(防漂移,同 `mem-numbers` 思路)。 2. **趋势基线** `scripts/ram_baseline.tsv`(`--update` 每次 @build 后追加一行; `--trend` 看趋势并高亮 RW+ZI 较上一行增长 >1 KB 的对象——方案 §4.0.3 diff --git a/test/board/ch395f_test.h b/test/board/ch395f_test.h index 99a1868a..ef79bc22 100644 --- a/test/board/ch395f_test.h +++ b/test/board/ch395f_test.h @@ -86,7 +86,7 @@ extern "C" { * test/run_all_suites.py 的 _rewrite_config 只改 TEST_SUITE_* 行(那些行没有行尾 * 跨行注释)所以一直没炸;本文件是"人手工切阶段"的入口,必须自身安全。 * - * 链接余量构建实测(条目属主 docs/任务规划/测试与架构专项.md;2026-10-25, + * 链接余量构建实测(2026-10-25,本文件即数字与结论的唯一出处;2026-10-28 复核: * RW_IRAM1 = 128 KB 的 .sct 区,92% 红线 = 120,586 B): * 配置(TEST_SUITE_CH395F + 阶段) Code ZI RW_IRAM1 距红线余量 * 产品基线(阶段全关) 214,104 131,852 75,632 57.7% 44,954 B @@ -122,7 +122,7 @@ extern "C" { * 该条目关心的 PHASE5 三块静态缓冲(3 x PHASE5_CHUNK_SIZE = 4093)确实进了链接: * hw_full 的 ch395f_test_task.o 数据段 = 12,285 B(3 x 4093 = 12,279 + 其余 6 B)。 * "理论余量足够"由未实测转为已实测:最坏态还余 29,634 B,不必把 .sct 扩到 192 KB - * (与该条目"不建议扩 scatter"的约束一致)。RW_CCM 四档恒为 57,376 B / 87.9%—— + * (**约束:不建议把 scatter 扩到 192 KB**——会破坏既有克隆芯片兼容决策)。RW_CCM 四档恒为 57,376 B / 87.9%—— * 但该区已贴着 92% 线,任何往 CCM 加东西的改动都得单独核算。 */ #if defined(ENABLE_PHASE1_TESTS) || defined(ENABLE_PHASE2_TESTS) || \ diff --git a/test/host/net_socket/run_unit_test.py b/test/host/net_socket/run_unit_test.py index cf901376..eaf83d8b 100644 --- a/test/host/net_socket/run_unit_test.py +++ b/test/host/net_socket/run_unit_test.py @@ -69,7 +69,7 @@ from unit_test_harness import TestBuild, run_host_unit_test # noqa: E402 # net_socket.c 的 S12 断言试点(2 处 APP_ASSERT)要包含它。这里刻意**用真头不造桩**—— # 桩与真头漂移正是本 runner「常量闸」要防的那类自洽假绿(stub/dbg_log.h 那种必须做桩 # 的是平台层,断言宏不是平台层:它无状态、开关默认关,真头在宿主下只剩一条 #define)。 -# 依据 docs/任务规划/测试与架构专项.md §2.1。 +# 规格正文 = Drivers/BSP/app_assert.h 头注释(原专项文档已删除)。 BUILD = TestBuild( name="NET Socket Tests", src=os.path.join(HERE, "net_socket_test.c"),