16917bf165
P1-10 剩余①「CH395F 套件实际构建确认链接通过」今天才真正有数:产品基线 + 三档 测试配置(ARMCC,全部 0 错误 0 警告;.sct 保持 128 KB 未动,符合 P1-10 写的 "不建议扩到 192KB"): 配置(TEST_SUITE_CH395F + 阶段) Code ZI RW_IRAM1 距 92% 余量 产品基线(阶段全关) 214,104 131,852 75,632 57.7% 44,954 B 默认阶段 11/14(只切套件宏) 217,468 134,076 77,920 59.5% 42,666 B NET 层全开 6~11/13/14 218,992 141,688 85,552 65.3% 35,034 B HW 层全开 1~5/12/15(最坏态) 229,256 147,176 90,952 69.4% 29,634 B HW 层无需 PC 1/12/15(冒烟用) 215,244 134,896 78,672 60.0% 41,914 B P1-10 specifically 关心的 PHASE5 三块静态缓冲(3 x PHASE5_CHUNK_SIZE = 3 x 4093) 确实进了链接,不是"理论上会在":hw_full 的 ch395f_test_task.o 数据段 = 12,285 B (12,279 + 该 TU 其余 6 B)。于是"理论余量足够但未实测"改成了实测:最坏态仍余 29,634 B(RW_IRAM1 上限 131,072 B,92% 线 120,586 B)。RW_CCM 四档恒为 57,376 B / 87.9%——测试代码不进 CCM,但该区已经贴着红线,将来往 CCM 加东西要单独核算。 顺手修掉一个把实测挡了三年的坑(就是它让第一轮 hw 配置炸掉的): ENABLE_PHASE11/14 两行的说明是**挂在行尾的跨行块注释**。而"关掉一个阶段"的标准动 作是在行首加 //,// 只注释到行尾 → 块注释从第二行起变成裸代码,实测 188 条 error #7: unrecognized token,报点落在注释续行上,看着像头文件坏了、其实只是注释 被腰斩。run_all_suites.py 的 _rewrite_config 只改 TEST_SUITE_* 行(那些行没有行尾 跨行注释)所以一直没暴露;ch395f_test.h 恰是"人手工切阶段"的入口,必须自身安全。 修法:把两段说明挪到 #define 行的上一段,行尾只留同行闭合的短注释;并在开关区后面 写清"开关行注释规范"+ 上面这张实测表(同一事实只在这一处,销项时文档引它)。 验证(_wt/P1-10-test-fw,每步都实跑 @build): - V1 产品态(改注释后):0/0,Code/RO/RW/ZI = 214104/20388/1204/131852,与主干 2026-10-25 台账行逐项相同 → 本改动零体积增量。 - V2 只切套件宏(默认阶段 11/14):0/0,RW_IRAM1 77,920 B / 59.5%。 - V3 **朴素行注释切换**(正是炸掉第一轮的那个动作)改到 HW 1/12/15:0/0,且尺寸与 用 #undef/#define 覆盖法得到的 hw_nopc 逐字节相同(215244/23656/1200/134896) → 陷阱确认已消除,两条改法等价。 - V4 还原后产品重建:0/0,数字回到基线;test_config.h 与 ch395f_test.h 均按字节还原 (git status 只剩本文件这一处改动,测试宏没有留在树里,test-suite-switch 无需放行)。 - 产物身份戳实测:hw_nopc = "Oct 25 2026 04:32:16 suite=CH395F dstr=off"、产品态 = "Oct 25 2026 04:32:25 suite=NONE dstr=off" → dstr=off 三档一致,破坏性开关全程关。 RAM 增量:0 B。gate:改动只命中 no-mojibake / trailing-whitespace / end-of-file-fixer / check-added-large-files / id-check / mem-budget,全部 0;未用 --no-verify。 P1-10 剩余②(@test 烧录抓日志)需要 bench 锁,已把镜像与锚点清单交给 lead 执行; 真机跑 Phase 2~5 / 8 / 11 / 13 / 14 需 PC 端 tcp_server / peer 配合(Phase 11 还要 制造死对端,E11),属"实际测量采样"类,按用户指示本轮跳过,不在本提交声称做过。
test/board/ — 板端测试套件
⚠️ 编入固件的测试代码(由 testTask 执行)。这些
.c已注册到 Keil 工程MDK-ARM/STM32F4-Demo.uvprojx,占用 MCU 的 RAM/Flash。
文件一览
| 文件 | 测试对象 / 作用 |
|---|---|
test_config.c/h |
测试任务配置:TEST_SUITE_* 套件选择开关(互斥)+ ENABLE_DESTRUCTIVE_TESTS |
test_common.h |
公共断言内核:test_stats_t + TEST_CHECK_IMPL/TEST_REPORT_IMPL;各套件用一行宏绑定自身统计变量(T-4) |
ch395f_test_task.c/h + ch395f_test.h |
CH395F 以太网(硬件层 Phase 1 |
gd5f_test_task.c/h + gd5f_test.h |
GD5F2GQ5UE SPI NAND 存储 |
sd2506_test_task.c/h + sd2506_test.h |
SD2506 RTC |
storage_test_task.c/h + storage_test.h |
存储性能 |
net_test_task.c/h |
网络层测试 |
net_latency_test.c/h |
链路时延探针(DWT CYCCNT 时基,MCU 专属) |
⚠️ 构建约束(AGENTS.md 详述)
- 套件互斥:
test_config.h的TEST_SUITE_CH395F/STORAGE/GD5F/RTC一次只能启用一个 (违反则#error);全部注释 = 产品构建 - ⚠️ 测试固件不得静默提交:
TEST_SUITE_*开关受 pre-commit 钩子test-suite-switch门禁——默认要求全部注释。跑完套件回归务必改回产品构建再提交(2026-10-01 实测已提交 HEAD 里TEST_SUITE_CH395F就是开启状态,纯靠人记得改;故补此门禁)。确需提交测试构建时用ALLOW_TEST_BUILD=1 git commit ...或python scripts/check_test_suite.py --allow-test-build显式放行 - 破坏性用例默认关闭:
ENABLE_DESTRUCTIVE_TESTS(默认注释)控制写/擦 NAND、格式化、 坏块注入。关闭时为只读模式(横幅mode: READ-ONLY),可随时在在用设备上跑 - ⚠️ 实测一轮破坏性 GD5F 运行即让 dhara 多记一个坏块(容量下降且需全片擦除恢复)—— 只在产线首启或明确需要时打开
- CH395F 套件:硬件层与 NET 层模式互斥
- 总线独占:CH395F 硬件层模式下 netTask 自挂起,testTask 独占 CH395F
添加新测试套件
- 在
test_config.h加开关(并入互斥#error检查) - 新建
<模块>_test_task.c/h - 注册进 Keil 工程(
<FilePath>..\test\board\xxx.c</FilePath>) - 跑回归:
@test(.dsh/skills/serial-boot-test/scripts/run_boot_test.py)
相关文档
- 测试指南:
docs/测试说明/CH395F_Test_Guide.md、GD5F2GQ5UE_Test_Guide.md、SD2506_Test_Guide.md、FTP_Test_Guide.md - 套件配置:
AGENTS.md「测试与验证」章 - 容量恢复:
docs/测试说明/存储维护与容量恢复.md