From 894b51feb376b3349400cfae8df1af233f0febed Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Tue, 22 Sep 2026 12:03:11 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=20P0-a=20=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E6=8E=A2=E9=92=88=EF=BC=88=E5=8F=B0=E6=9E=B6=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E5=AE=8C=E6=88=90=EF=BC=89=EF=BC=8C=E5=BC=80=E6=9C=BA=E7=9C=81?= =?UTF-8?q?=E5=8E=BB=2060ms=20=E7=8A=B6=E6=80=81=E8=BD=AE=E8=AF=A2?= =?UTF-8?q?=E4=B8=8E=E8=AF=81=E6=8D=AE=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/task/net_task.c | 4 --- Drivers/BSP/NET/net_socket.c | 56 +++---------------------------- Drivers/BSP/NET/net_socket.h | 11 ------ docs/测试说明/链路延迟测试说明.md | 8 ++--- 4 files changed, 8 insertions(+), 71 deletions(-) diff --git a/App/task/net_task.c b/App/task/net_task.c index 42f18115..76541549 100644 --- a/App/task/net_task.c +++ b/App/task/net_task.c @@ -121,10 +121,6 @@ int net_stack_bring_up(void) { (phy == CH395F_PHY_10M_HALF) ? "10M HALF" : (phy == CH395F_PHY_DISCONN) ? "DISCONNECT" : "UNKNOWN"); - /* P0-a 证据行:重传周期芯片验收状态(net_init 静默采集,此处延迟打印—— - * 本位置与 testTask 启动日志无并发窗口,不会触发 UART 丢行) */ - net_retrans_status_log(); - /* 自检埋点:链路超时未建立 → 记入自检记录(仅故障才写) */ if (phy == CH395F_PHY_DISCONN) { syslog_post(SYSLOG_SELFTEST, "comms fault"); diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index feec57c1..b738fd00 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -40,7 +40,6 @@ static net_sock_t s_net_socks[NET_MAX_SOCKETS]; /* Socket 控制块数组 */ static int s_net_errno = 0; /* 最后错误码 */ static uint8_t s_net_initialized = 0; /* 初始化标志 */ -static uint8_t s_retrans_cmd_status = 0xFFU; /* P0-a:重传周期 GET_CMD_STATUS 验收结果(0xFF=未采集) */ static uint8_t s_local_ip[4]; /* 本机 IP 缓存(网络序,net_getsockname 用) */ static uint16_t s_dynamic_port = 49152; /* 动态端口分配起始值 */ static volatile uint32_t s_net_generation = 0; /* 网络代次号:网络重建完成时递增(服务据此重建监听) */ @@ -147,31 +146,12 @@ static bool s_mac_is_zero(const uint8_t *p_mac) { * MSS 真值源为 ch395f.h 的 CH395F_TCP_MSS,DMA 缓冲大小亦由其推导。 */ ch395f_set_tcp_mss(CH395F_TCP_MSS); - /* 设置 TCP 重传参数(必须在 INIT_CH395 之前调用*/ + /* 设置 TCP 重传参数(必须在 INIT_CH395 之前调用;P0-a:周期 500→200ms。 + * 台架验收 2026-09-22 完成:GET_CMD_STATUS 对 SET 类命令无判别力(500/2000ms + * 行为一致,均为 RESET_ALL 的陈旧 BUSY 残留),值的接受性以手册范围(≤1000ms) + * + 全套件无回归为准——验收探针已移除,结论见《链路延迟测试说明》§10.1 D1 */ ch395f_set_retrans_count(NET_RETRANS_COUNT); ch395f_set_retrans_period(NET_RETRANS_PERIOD_MS); - /* P0-a 一次性验收(手册无重传参数回读命令):设置命令之后查 GET_CMD_STATUS。 - * 实测(2026-09-22 台架,500ms 合法值与 2000ms 超限值行为完全一致): - * SET 类命令不更新状态寄存器——读到的是 RESET_ALL 的 0x10(BUSY) 陈旧残留 - * (ch395f_reset 只延时 20ms、不轮询状态);INIT 类长命令才重写寄存器。 - * 故 3 次 × 20ms 轮询即可捕获真正的值/参数错误码(0x19/0x1A 等), - * 0x10 只证明"寄存器未更新",不构成值判据——值的接受性以 - * 手册范围(≤1000ms)+ 全套件无回归 + 与 500ms 行为一致为准。 - * 注意:此处只静默捕获状态,不打日志——本窗口与 testTask 启动日志并发, - * 并发 printf 会因非重入 UART 发送丢整行(2026-09-22 台架实测); - * 打印延迟到 net_stack_bring_up 的 PHY 行之后(net_retrans_status_log)。 */ - { - uint8_t rto_st = CH395F_ERR_BUSY; - - for (uint32_t i = 0U; i < 3U; i++) { - osDelay(20U); - rto_st = ch395f_get_cmd_status(); - if (rto_st != CH395F_ERR_BUSY) { - break; - } - } - s_retrans_cmd_status = rto_st; - } /* 设置 TCP KeepAlive 参数(必须在 INIT_CH395 之前,单位 ms,必须为 500 的倍数,且 IDLE > INTVL) * 值来自 net_config.h 的 NET_KEEPALIVE_*(60s/5s/3)*/ @@ -239,34 +219,6 @@ static bool s_mac_is_zero(const uint8_t *p_mac) { return 0; } -/* - * 函数功能:打印 P0-a 重传周期芯片验收证据行(一次性) - * 入口参数:无 - * 返 回 值:无 - * 限定条件:net_init 之后调用;建议放在 net_stack_bring_up 的 PHY 行之后 - * (启动日志低并发窗口)——net_init 尾部与其它任务启动日志并发时, - * 非重入 UART 发送会丢整行(2026-09-22 台架实测) - * 函数说明:三分支判读(实测 2026-09-22:SET 类命令不更新状态寄存器): - * 0x00 = 芯片明确报告接受;0x10 = 陈旧 BUSY 残留(无判别力,INFO 级, - * 避免健康启动误触 [ERR] 标记);其它状态码 = 真值/参数错误(ERROR 级) - */ -void net_retrans_status_log(void) { - if (s_retrans_cmd_status == 0xFFU) { - return; /* 本次启动未走 NET 层 bring_up(如硬件层测试模式) */ - } - if (s_retrans_cmd_status == CH395F_ERR_SUCCESS) { - DBG_INFO("net_init: retrans %u x %u ms accepted by chip (status=0x00)", - (unsigned)NET_RETRANS_COUNT, (unsigned)NET_RETRANS_PERIOD_MS); - } else if (s_retrans_cmd_status == CH395F_ERR_BUSY) { - DBG_INFO("net_init: retrans %u x %u ms set (status 0x10 = stale residue, inconclusive)", - (unsigned)NET_RETRANS_COUNT, (unsigned)NET_RETRANS_PERIOD_MS); - } else { - DBG_ERROR("net_init: retrans period %u ms REJECTED by chip (cmd status=0x%02X)", - (unsigned)NET_RETRANS_PERIOD_MS, (unsigned)s_retrans_cmd_status); - } - s_retrans_cmd_status = 0xFFU; /* 只打印一次 */ -} - /* * 函数功能:取网络代次号 * 入口参数:无 diff --git a/Drivers/BSP/NET/net_socket.h b/Drivers/BSP/NET/net_socket.h index e24f2aad..d11c12b0 100644 --- a/Drivers/BSP/NET/net_socket.h +++ b/Drivers/BSP/NET/net_socket.h @@ -74,17 +74,6 @@ typedef struct { */ int net_init(const char *ip, const char *mask, const char *gateway, const uint8_t *mac); -/* - * 函数功能:打印 P0-a 重传周期芯片验收证据行(一次性) - * 入口参数:无 - * 返回值:无 - * 限定条件:net_init() 之后;建议放在 net_stack_bring_up() 的 PHY 行之后 - * 函数说明:net_init 在设置重传参数后立即静默查询 GET_CMD_STATUS(手册无回读 - * 命令,此状态是"芯片是否接受该周期"的唯一证据);打印延迟到 PHY 行 - * 之后,避开启动期多任务并发 printf 丢行 - */ -void net_retrans_status_log(void); - /* * 函数功能:取网络代次号 * 入口参数:无 diff --git a/docs/测试说明/链路延迟测试说明.md b/docs/测试说明/链路延迟测试说明.md index 9000ef89..59113b93 100644 --- a/docs/测试说明/链路延迟测试说明.md +++ b/docs/测试说明/链路延迟测试说明.md @@ -634,7 +634,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复 | **L7 一直超时 / peer 报 `l7_crc.fail`** | **D15**:帧格式不一致 / peer 超读 | 对照 `ui_net_sink.c` 的 `remo_send`/`remo_handle`(§8.1 D15) | | **会话跑完一段后无限循环、peer 空等 300s** | **D16**:Phase 13 状态机迁移目标错 | 核对顺序 L5→L3→L10→L6→L7→DONE(§8.1 D16) | | **`[LAT]` 段行缺失/截断、wait-idle 判不出空闲** | **D12-b**:热路径日志洪水 | 删除 net 热路径逐调用日志(§8.1 D12-b) | -| **开机日志连续丢行**(含必检标记 `net init: OK` 等)但系统健康 | **日志并发竞态**:多任务并发 `printf` → 非重入 `fputc`/`HAL_UART_Transmit` 丢整行、UART 状态短暂卡住(2026-09-22 台架实证:boot 时 testTask 启动行与 netTask 日志并发 → 连续 4 行丢失、~2s 后自恢复) | 必现证据行采用"静默采集 + 延迟到安静窗口打印"模式(范例:`net_retrans_status_log` 在 PHY 行之后打印);根治 = S8 日志非阻塞/串行化(§10.2) | +| **开机日志连续丢行**(含必检标记 `net init: OK` 等)但系统健康 | **日志并发竞态**:多任务并发 `printf` → 非重入 `fputc`/`HAL_UART_Transmit` 丢整行、UART 状态短暂卡住(2026-09-22 台架实证:boot 时 testTask 启动行与 netTask 日志并发 → 连续 4 行丢失、~2s 后自恢复) | 必现证据行采用"静默采集 + 延迟到安静窗口打印"模式(范例:P0-a 验收行曾按此模式实装,验收完成后探针已移除);根治 = S8 日志非阻塞/串行化(§10.2) | | **`relisten` 段 FAIL、断线固定 ~588ms** | **D10** 回归(退回 `osDelay(500)`) | 核对 `net_relisten_try`/`net_relisten_retry_tick` 非阻塞重试在位(§8.1 D10) | | **远端显示整帧卡住十几秒后自恢复** | **E-02** 回归 | 核对 `net_recv_to` 5ms 分片 + 让出在位(§8.1 E-02) | | **INIT 应答帧字节数字段恒为 0** | **D17** 回归 | 核对 `remo_send_init` 发满 8B(§8.1 D17) | @@ -653,7 +653,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复 | # | 原因 | 实测验证(2026-09-22 台架) | 当前状态 | |---|---|---|---| -| D1 | CH395F TCP 重传固定周期(非 RTT 自适应) | 台架链路(有线 100M 全双工)多轮零重传尖峰 → 台架无丢包;**弱网(Wi-Fi/双工不匹配)仍是秒级卡顿首要嫌疑**,200ms 粒度台阶 = 重传指纹(旧固件 500ms) | **已修(P0-a,2026-09-22)**:`NET_RETRANS_PERIOD_MS` 500→**200**(窗口 8×200=1.6s,原 4s)。台架验收说明:`GET_CMD_STATUS` 对 SET 类命令无判别力(500/2000ms 超限对照均读 0x10 陈旧残留,§9.2)→ 接受性以手册范围(≤1000ms)+ 全套件零回归(§6.2/§6.3)+ 与 500ms 行为同构为准 | +| D1 | CH395F TCP 重传固定周期(非 RTT 自适应) | 台架链路(有线 100M 全双工)多轮零重传尖峰 → 台架无丢包;**弱网(Wi-Fi/双工不匹配)仍是秒级卡顿首要嫌疑**,200ms 粒度台阶 = 重传指纹(旧固件 500ms) | **已修(P0-a,2026-09-22)**:`NET_RETRANS_PERIOD_MS` 500→**200**(窗口 8×200=1.6s,原 4s)。台架验收说明:`GET_CMD_STATUS` 对 SET 类命令无判别力(500/2000ms 超限对照均读 0x10 陈旧残留,§9.2)→ 接受性以手册范围(≤1000ms)+ 全套件零回归(§6.2/§6.3)+ 与 500ms 行为同构为准。验收探针(3×20ms 状态轮询 + 证据行)验收完成后已从代码移除,结论保留于本文档 | | D2 | 3209B × 1KB 发送 FIFO 停止等待(4 次串行分块握手,期间 netTask 全程占用) | `chunk_wait` 219µs/块 ≈ SPI 搬运成本的 1/7 → 握手本身**不是瓶颈**;每帧固定成本小(MCU 净 7.1ms) | 基线成本,可接受;根治 = 差量/RLE + 帧版本号(待办 S2) | | D3 | netMsgQueue 头阻塞(= §8.1 E-02) | 已量化:一条空闲 FTP 控制连接冻结全网 17.7s | **已修复**(5ms 分片有界读 + 让出,§8.1) | | D4 | PC 端延迟 ACK 与"每段等 ACK"停止等待交互 | `--ack-fast` 带内实验证实:关掉延迟 ACK 尾批自行消失(52→3.9ms) | **已客户端侧解决**(生产客户端关延迟 ACK/轻推兜底,§7.4) | @@ -666,7 +666,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复 1. **D20 数据 Socket 轮换**(§8.2)——唯一未修的功能性缺陷;现场可用客户端重试 425 规避; 2. **~~P0-a~~ 已实施(2026-09-22)**:`NET_RETRANS_PERIOD_MS` 500→200 + `GET_CMD_STATUS` 一次性验收检查 - (实测该状态对 SET 类命令无判别力,见 §10.1 D1);全套件复验零回归(§6.2/§6.3); + (实测该状态对 SET 类命令无判别力,见 §10.1 D1);全套件复验零回归(§6.2/§6.3);验收完成后探针已移除; 3. **~~P0-b~~ 已实施(2026-09-22)**:删除 `net_socket.c` per-recv `DBG_INFO`;实测 `queue_rt_recv` −80% (5997→1223µs)、生产帧周期 −4.4ms(66.0→61.6ms)、首字节 −4.3ms(13.9→9.6ms); 4. **S1** 超时参数分档:`NET_SEND/RECV_TIMEOUT_MS` 全局一刀切 → 按服务分离(远显短超时+非阻塞,FTP 保留长超时); @@ -685,7 +685,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复 13. 协议补位(尾批退路,仅当客户端无法改动时;见 §7.4)。 14. **日志并发保护(2026-09-22 新增,与 S8 同源、优先级上调)**:开机多任务并发 `printf` 丢整行 (实测 §9.2:必检标记 `net init: OK` 曾被竞态吞掉 → 影响开机验收可靠性)。过渡:必现证据行按 - "静默采集 + 延迟到安静窗口打印"模式(范例 `net_retrans_status_log`);根治 = S8(串口 TX 环形缓冲 + "静默采集 + 延迟到安静窗口打印"模式(范例:P0-a 验收行,验收完成后已移除);根治 = S8(串口 TX 环形缓冲 + 中断/DMA,溢出丢弃策略需定义)。 ---