Files
STM32F4-Base/test/board/ch395f_test.h
T
wandering1 db9f256fd0 docs(收口): 批 1 台架记录与门禁/产物分家口径落档(道C 文案兑现)
- test/board/ch395f_test.h:f3 轮台架记录追加——VERDICT PASS,
  task stall 468→14(net 类 431→0,掩码复活实锤),余 13 条为
  netTask 自挂起前喂一次 vs 精确匹配判据的语义打架 + 1 条 uiTask
  瞬态 + 1 条设计内 P2 留痕;lead 裁决不放宽超集判定
- 主机单测覆盖率口径.md:中间产物路径 L80 与坑 12 重写为
  %TEMP%/dtu_host/<工作树哈希>/ 分家 + runs 独占(adabb6a 落地,
  旧固定共享名作废;判据正文指向 harness 顶部)
- 并行任务工作树方案.md §5 表:单测产物一行——不需要锁但必须
  按树分家(对照 build/bench 真独占)
- 门禁说明/cubemx-survival.md §6:新增第 7 条「基线漏项=静默不检」
  (net-msgq-adopt 实证,--write 后抽查新增条目)
- 门禁说明/id-check.md §5:拦下过真事追加——P1-10 注释裸编号被
  校验 6 拦(紧邻写法在 C 注释同样生效)
2026-10-25 06:12:02 +08:00

161 lines
11 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:CH395F Driver Test Suite
* 模块功能:CH395F 驱动各功能模块的测试入口,分阶段组织测试用例,
* 覆盖 SPI 命令路径、协议栈配置、Socket 状态机、大文件传输、
* 边界条件、KeepAlive、PHY 链路恢复等,基于单连接 socket 模式
* 适用平台:STM32F4 系列(CH395F 以太网芯片)
* 作者:王建锋
* 创建日期:2026-07-19
* 修改记录:
* 2026-07-22 全面重构为单连接模式,增加大文件传输、边界条件等测试
*
* === 测试阶段一览(硬件层 1~5/12 → NET 层 6~11/13/14,严格顺序执行) ===
* Phase | 层 | 描述
* ---------|----------|-----------------------------------------------
* Phase 1 | 硬件层 | 独立运行:寄存器读写 + SPI 命令路径验证
* Phase 2 | 硬件层 | PC 配合:TCP Client 收发 + 关闭重连
* Phase 3 | 硬件层 | PC 配合:UDP Server Echo(60 轮动态源地址回显,HELLO 探针不计数)
* Phase 4 | 硬件层 | PC 配合:DHCP 自动获取 IP
* Phase 5 | 硬件层 | PC 配合:大文件分块回传(裸命令,tcp_server 配合)
* Phase 6 | NET 层 | testTask:TCP Echo(单连接模式,基础收发验证)
* Phase 7 | NET 层 | testTask:TCP Client 主动连接(回显收发 + 关闭重连 + 连接超时)
* Phase 8 | NET 层 | testTask:大文件传输(20KB+ 分块收发)
* Phase 9 | NET 层 | testTask:Select/Poll I/O 多路复用
* Phase 10 | NET 层 | testTask:边界条件测试(零长度、DMA 边界、缓冲溢出)
* Phase 11 | NET 层 | testTask:KeepAlive 超时断开测试
* Phase 12 | 硬件层 | 独立运行:SPI 字节命令 / DMA 时延基线(L1/L2,无需 PC)
* Phase 13 | NET 层 | testTask:芯片 + 队列时延(L3~L7/L10,需 PC peer,独立运行)
* Phase 14 | NET 层 | testTask:生产路径时延(L8~L11 + 模拟器 A/B,需 PC peer)〔M3 规划〕
* 时延分段定义/判定基线/执行流程:docs/测试说明/链路延迟测试说明.md
*/
#ifndef CH395F_TEST_H
#define CH395F_TEST_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include "test_common.h"
/*
* 阶段使能开关(取消注释即启用对应阶段)
*
* 构建模式互斥(详见 docs/测试说明/CH395F_Test_Guide.md「构建模式与执行顺序」):
* 硬件层模式(阶段 1~5):netTask 入口自挂起(创建但不运行),testTask 独占 CH395F
* NET 层模式 (阶段 6~11):完整网络栈,netTask 轮询 + testTask 监听循环
*
* 注意:同层内可多选(Phase 6~10 共享 testTask 循环);
* Phase 4 (DHCP) 会改变 IP,必须独立运行;
* 两层同时启用会在下方触发 #error。
*/
/* ---- 硬件层(阶段 1~5/12)---- */
//#define ENABLE_PHASE1_TESTS /* [硬] 寄存器读写 + SPI 命令路径 */
//#define ENABLE_PHASE2_TESTS /* [硬] TCP Client 收发 + 关闭重连 */
//#define ENABLE_PHASE3_TESTS /* [硬] UDP Server Echo */
//#define ENABLE_PHASE4_TESTS /* [硬] DHCP 自动获取 IP(会改 IP!独立运行) */
//#define ENABLE_PHASE5_TESTS /* [硬] 大文件传输(硬件层,PC 配合) */
/* ---- NET 层(阶段 6~11)---- */
//#define ENABLE_PHASE6_TESTS /* [网] TCP Echo(单连接基础收发) */
//#define ENABLE_PHASE7_TESTS /* [网] TCP Client 主动连接(回显收发 + 关闭重连 + 连接超时) */
//#define ENABLE_PHASE8_TESTS /* [网] 大文件传输(100KB 文件收发) */
//#define ENABLE_PHASE9_TESTS /* [网] Select/Poll I/O 多路复用 */
//#define ENABLE_PHASE10_TESTS /* [网] 边界条件测试 */
/* [网] KeepAlive 超时断开:PC 连 8080 后须制造死对端(禁用网卡;防火墙规则对已建立
* 连接无效,E11 实证);勿与 Phase 6/9/10/13 混选(recv 互抢数据)。
* ⚠ 说明写在**上一行**而不是挂在 #define 行尾:见本节末尾的"开关行注释规范" */
#define ENABLE_PHASE11_TESTS /* [网] KeepAlive 超时断开(判据见 CH395F_Test_Guide) */
/* ---- 链路时延基线(M1;分段/阈值见 docs/测试说明/链路延迟测试说明.md)---- */
//#define ENABLE_PHASE12_TESTS /* [硬] SPI 字节命令 / DMA 时延基线(L1/L2,无需 PC)—— M1 已完成,基线见说明文档 §6.1 */
//#define ENABLE_PHASE15_TESTS /* [硬] 自愈驱动原语:状态回读一致性/cmd_done/sock_reset 状态机跑通/链路缓存(无需 PC)——TC 详见 docs/测试说明/CH395F_Test_Guide.md 阶段 15;台架 21/21 PASS */
/* ---- 链路时延(M2/M3;分段/阈值见 docs/测试说明/链路延迟测试说明.md)---- */
//#define ENABLE_PHASE13_TESTS /* [网] 芯片 + 队列时延(L3~L7/L10,需 PC peer)—— M2 已完成,基线见说明文档 §6.2 */
/* [网] 生产路径时延(L8~L11 + 模拟器 Δ)—— M3,需 peer --mode remo(:7003);
* 与 Phase 11 共存安全:peer 缺席时有 LAT_P14_TIMEOUT_MS 整体超时,自动 done,
* 不永久挡 accept */
#define ENABLE_PHASE14_TESTS /* [网] 生产路径时延(L8~L11) */
/*
* 开关行注释规范(2026-10-25 构建矩阵实测踩出来的,别改回去):
* 每个 ENABLE_PHASE*_TESTS 行只许带"同一行内闭合"的行尾注释,或不写注释;
* 需要多行说明就挪到该行的**上一段**。原因:关一个阶段的动作是在行首加两个
* 斜杠,而它只注释到行尾——挂在行尾的跨行注释会从第二行起**变成裸代码**(实测
* 188 条 error #7: unrecognized token,报点落在注释的续行上,看着像头文件坏了,
* 其实只是注释被腰斩)。开阶段是同一个坑的反面:去掉行首斜杠并不会把注释拼回来。
* test/run_all_suites.py 的 _rewrite_config 只改 TEST_SUITE_* 行(那些行没有行尾
* 跨行注释)所以一直没炸;本文件是"人手工切阶段"的入口,必须自身安全。
*
* 链接余量构建实测(条目属主 docs/任务规划/测试与架构专项.md P1-10;2026-10-25,
* 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
* 默认阶段 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
*
* 同日 sync 追平后的复测(合入 59da40b 与 891ca81 两笔之后,产品基线前进到
* Code=215,744 / RO=21,396 / RW=1,224 / ZI=131,984,RW_IRAM1 75,784 B / 57.82%):
* 配置 Code ZI RW_IRAM1 距红线余量
* 默认阶段 11/14 219,112 134,208 78,072 59.6% 42,514 B
* NET 层全开 6~10/13/14 220,636 141,804 85,688 65.4% 34,898 B
* HW 层全开 1~5/12/15(最坏态) 230,900 147,300 91,088 69.5% 29,498 B
* HW 层无需 PC 1/12/15 216,888 135,020 78,808 60.1% 41,778 B
* 四档仍全部 0 错误 0 警告、链接通过;PHASE5 三块缓冲依旧在链(hw_full 的
* ch395f_test_task.o 数据段仍是 12,285 B)。上表 04 点那组的产品基线已前进,
* 作为当日历史记录保留、不追改(两组差值都在 +136~+152 B 量级,来自新增的
* adc_cal 数据段;结论"最坏态仍余约 29 KB、不必扩 scatter"不变)。
* 台架冒烟(2026-10-25,_wt 同树构建 → 主树烧录,boot log 20261025_050539):
* 镜像 ch395f_hw_nopc_v2.hex(戳 suite=CH395F dstr=off)单次开机跑完 1/12/15 三段,
* 汇总行 Phase 1: 9/9、Phase 12: 1/1、Phase 15: **21/21**(failed=0),全程无 Fault。
* 同轮暴露两类设计外/设计内 [ERR]:P2 越界守卫留痕(设计内,见 ch395f.c)与
* [WD] task stall 刷屏 468 条(**设计外**:HW 层构建的必需心跳掩码没生效,
* 因为 App/util/task_watchdog.c 未 include test_config.h,看不到本文件的
* ENABLE_HW_LAYER_TESTS → 那段剔除 netTask 的分支自加入起就是死代码)。
* 修复后复跑(同日 f3 镜像 05:51:31 戳,boot log 20261025_055725):VERDICT PASS——
* 三段汇总 9/9、1/1、21/21,身份戳核对 + 烧后回读一致,六标签判据零命中;
* [WD] task stall 468→14:net 类 431→0(task_watchdog.c 补 include 后掩码复活实锤),
* 余 14 条 = 13 x mask=0x1F7(netTask 自挂起前喂那一次 vs 精确匹配判据的语义打架,
* 非缺喂)+ 1 x mask=0x1E5(uiTask 首个喂狗窗未到的瞬态),另有 1 条设计内 P2 留痕。
* Lead 裁决不放宽超集判定:全部属测试固件态,产品判据 req=0x1F7 无死分支不误报。
* 该条目关心的 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%——
* 但该区已贴着 92% 线,任何往 CCM 加东西的改动都得单独核算。
*/
#if defined(ENABLE_PHASE1_TESTS) || defined(ENABLE_PHASE2_TESTS) || \
defined(ENABLE_PHASE3_TESTS) || defined(ENABLE_PHASE4_TESTS) || \
defined(ENABLE_PHASE5_TESTS) || defined(ENABLE_PHASE12_TESTS) || \
defined(ENABLE_PHASE15_TESTS)
#define ENABLE_HW_LAYER_TESTS 1
#endif
#if defined(ENABLE_PHASE6_TESTS) || defined(ENABLE_PHASE7_TESTS) || \
defined(ENABLE_PHASE8_TESTS) || defined(ENABLE_PHASE9_TESTS) || \
defined(ENABLE_PHASE10_TESTS) || defined(ENABLE_PHASE11_TESTS) || \
defined(ENABLE_PHASE13_TESTS) || defined(ENABLE_PHASE14_TESTS)
#define ENABLE_NET_LAYER_TESTS 1
#endif
#if defined(ENABLE_HW_LAYER_TESTS) && defined(ENABLE_NET_LAYER_TESTS)
#error "硬件层(1~5)与NET层(6~11)测试互斥:请分两次构建,见 CH395F_Test_Guide 构建模式与执行顺序"
#endif
/* 测试统计(本套件独立,防跨套件串数;内核见 test_common.h) */
typedef test_stats_t ch395f_stats_t;
extern ch395f_stats_t g_test_stats;
#define TEST_CHECK(cond, fmt, ...) \
TEST_CHECK_IMPL(g_test_stats, cond, fmt, ##__VA_ARGS__)
#define TEST_REPORT(name) TEST_REPORT_IMPL(g_test_stats, name)
#ifdef __cplusplus
}
#endif
#endif /* CH395F_TEST_H */