TC-NET-604 根因闭环:芯片 RX 窗口冻结角(Trap 21),MSS=512 裕量方案证伪回退,缓冲布局与 MSS 解耦 + 超限读金丝雀

- 根因:CH395F 片内 TCP 状态机角(WCH 官方 FAQ 留档,W5500 同类):窗口=接收缓冲剩余空间,
  缓冲恰好填满 + 排空时序交叠后芯片 RX 静默冻结(不 RST、不自恢复),触发模式 = 同连接前序突发 +
  新突发 + 任务负载;驱动超限读丢弃与 L3 pending 均经插桩台架排除
- MSS=512 裕量实验证伪(原序列 10/10 仍停摆,且新连接 4096B 确定性停摆恒剩 64B)→ 维持 1024
- 缓冲块布局(RX 4/TX 2 块)与 SPI DMA 缓冲(接收缓冲+4)与 MSS 解耦,杜绝改 MSS 连带缩小布局
- ch395f_read_recv_buf 超限守卫改为 OVERSIZE 留痕(原静默 return 会把窗口锁死 0 且无从诊断)
- 文档:Trap 21 全记录(含 MSS=512 负结果/64B 残留/FAQ 引文/触发模式);N-1 改写(残留决策项 =
  lftpd 数据通道停摆预算 30s→10-15s 待用户决策);E-02 STOR 预测机制修正;延迟说明基线免重锁注记
- 台架复验:新连接 4096B 31ms PASS(4x1024 粒度)、竞争序列停摆复现(芯片角,已文档化)、
  停摆后重连 520ms 恢复(auto-relisten + 回显正常);芯片行为参数零变化 → M3 基线全部继续有效
This commit is contained in:
2026-09-22 18:57:48 +08:00
parent 7ff2958b3b
commit 93bae35e21
7 changed files with 80 additions and 19 deletions
+6 -5
View File
@@ -168,10 +168,11 @@ static bool s_mac_is_zero(const uint8_t *p_mac) {
* bit3=1: DISCONNECT/TIMEOUT 时不自动清空缓冲区,由软件排空数据后手动关闭 */
ch395f_set_fun_para(0x09);
/* 设置 TCP MSS
/* 设置 TCP MSS(2026-09-22 TC-NET-604:试 512 裕量方案被台架证伪,恢复 1024,见 Trap 21)
* 手册(§5.45):CH395F 内部缓冲共 48 块 × 512B = 24KB。下方为 8 个 Socket 各分配 6 块
* (接收 4 块=2KB + 发送 2 块=1KB),按手册 §9.2.8(接收 ≥ 2×MSS 建议)取 MSS=1024,用满 48 块。
* MSS 真值源为 ch395f.h 的 CH395F_TCP_MSS,DMA 缓冲大小亦由其推导。 */
* (接收 4 块=2KB + 发送 2 块=1KB),块布局固定(与 MSS 解耦,ch395f.h)。
* MSS=1024 为满足布局的最大值(接收=2×MSS);MSS 裕量不能消除芯片窗口冻结角
* (512 方案反使新连接突发也停摆),真值源为 ch395f.h 的 CH395F_TCP_MSS。 */
ch395f_set_tcp_mss(CH395F_TCP_MSS);
/* 设置 TCP 重传参数(必须在 INIT_CH395 之前调用;P0-a:周期 500→200ms。
@@ -223,8 +224,8 @@ static bool s_mac_is_zero(const uint8_t *p_mac) {
/* 多 Socket 模式:为 Socket 0~7 各分配独立收发缓冲(必须在 OPEN_SOCKET 之前)
* 手册(§5.45):CH395F 内部缓冲共 48 块 × 512B = 24KB;芯片上电默认仅给 Socket 0~3
* 分配(每 Socket 接收 8 块/发送 4 块),Socket 4~7 为 NULL,故用到 8 个 Socket 必须重分配。
* 单 Socket 块数由 MSS 推导(ch395f.h):接收 CH395F_RECV_BLOCKS(=2×MSS/512=4 块=2KB)、
* 发送 CH395F_SEND_BLOCKS(=1×MSS/512=2 块=1KB),每 Socket 共 6 块,MSS=1024 用满 48 块:
* 单 Socket 块数为固定布局(ch395f.h,2026-09-22 起与 MSS 解耦):接收 CH395F_RECV_BLOCKS(=4 块=2KB)、
* 发送 CH395F_SEND_BLOCKS(=2 块=1KB),每 Socket 共 6 块,用满 48 块:
* blocks_per_socket = CH395F_RECV_BLOCKS + CH395F_SEND_BLOCKS
* recv_start = i * blocks_per_socket, send_start = recv_start + CH395F_RECV_BLOCKS
* Socket 7 占块 42~47,恰好用尽 0~47,互不重叠。