Files
STM32F4-Base/test/board/ch395f_test.h
T
wandering1 33405a57b5 docs(N34)+test: E13 僵尸会话根因坐实;Phase 11 判据修正+一次性报告
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 源端口+结果)
2026-10-13 11:23:40 +08:00

108 lines
5.9 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 /* [网] 边界条件测试 */
#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 */