33405a57b5
E13(实验方案.md 新增 + E8/E11/E12 口径修正): - 风暴态根因=僵尸会话,非芯片残渣:PC 网卡禁用/链路断开时 Windows 直接丢弃 socket 不发 FIN/RST → 芯片侧 ESTABLISHED 僵尸 → 单连接监听被占(:21 拒连)→ 下一 PASV 重监听与僵尸竞态 (accept 为垂死僵尸开枪 20ms 后 DISCONNECT)→ lftpd 5s 窗空转 → 425;每失败轮再生僵尸 → 自续数分钟 - "残渣跨烧录存活/需断电冷启动"口径作废:板上 CH395F RSTI 接 MCU NRST(V0.0 网表 :174),每次烧录即芯片硬件复位;"存活"是 锤击再生错觉。正确控制=下一臂前静置 ≥90s 清僵尸窗 - 自愈链端到端验证:TIMEOUT(在途 TX ≈30s)/keepalive(空闲 60/5/3) → pump → relisten → 端口恢复;E11 产品路径验证 17s 判死 PASS - 4 元组复用假设被否(pasv_probe.py:PASV 端口递增、PC 源端口随机) - e02_probe listener=FAIL 重解读:探针挂起 socket 未关(PC 内核 代 ACK keepalive)→ 拒连是单连接正确行为;真缺口=应用无法主动 拆会话 → 阶段 2 sock_reset 职责 Phase 11 测试修复(net_test_task.c,实跑暴露): - 判据 >=60000ms 是按手册公式写的,实测判死 18~31s 会在正确固件 上假 FAIL → 改有界窗 10s~120s(下限防误杀存活空闲会话,上限 防判死缺位) - 报告后不释放 phase_active → 对已死连接 10ms 节奏刷 594 条假 FAIL → phase11_run 返回完成态,主循环释放等新连接再测 - 复跑两轮验证:30137ms 单次 PASS → 自动等新连接 → 二轮 accept 正常 - Test_Guide TC-NET-1101 判据/耗时同步;ch395f_test.h Phase 14 共存安全性注释(有整体超时不永久挡 accept) 工具:test/host/pasv_probe.py(每轮打印 PASV 端口+PC 源端口+结果)
108 lines
5.9 KiB
C
108 lines
5.9 KiB
C
/*
|
||
* 模块名称: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 /* [网] 边界条件测试 */
|
||
#define ENABLE_PHASE11_TESTS /* [网] KeepAlive 超时断开:PC 连 8080 后须制造
|
||
* 死对端(禁用网卡;防火墙规则对已建立连接无效,
|
||
* E11 实证);勿与 Phase 6/9/10/13 混选(recv 互抢数据) */
|
||
/* ---- 链路时延基线(M1;分段/阈值见 docs/测试说明/链路延迟测试说明.md)---- */
|
||
//#define ENABLE_PHASE12_TESTS /* [硬] SPI 字节命令 / DMA 时延基线(L1/L2,无需 PC)—— M1 已完成,基线见说明文档 §6.1 */
|
||
/* ---- 链路时延(M2/M3;分段/阈值见 docs/测试说明/链路延迟测试说明.md)---- */
|
||
//#define ENABLE_PHASE13_TESTS /* [网] 芯片 + 队列时延(L3~L7/L10,需 PC peer)—— M2 已完成,基线见说明文档 §6.2 */
|
||
#define ENABLE_PHASE14_TESTS /* [网] 生产路径时延(L8~L11 + 模拟器 Δ)—— M3,需 peer --mode remo(:7003);
|
||
* 与 Phase 11 共存安全:peer 缺席时有 LAT_P14_TIMEOUT_MS 整体超时
|
||
* 自动 done,不永久挡 accept */
|
||
|
||
#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)
|
||
#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 */
|