From 123d80afc77f1f0ba5eb25dc7f7e8f153570ebbf Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Tue, 13 Oct 2026 15:15:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(N34):=20E6=20=E6=8F=92=E6=A1=A9=20NET=5FU1?= =?UTF-8?q?5=5FPROBE=EF=BC=88U15=20=E5=A4=B1=E9=85=8D=E9=A2=91=E7=8E=87?= =?UTF-8?q?=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=85=B3=E9=9B=B6=E6=88=90=E6=9C=AC?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实验方案 docs/网络/N34-自愈审计/实验方案.md §E6:验证「RX 非空但 readable=0」(RECV_OK 中断丢失的数据面形态)是否在生产真实发生, 门禁阶段 3 项 4(U15 内化)做不做。 - net_poll 末尾独立探测环:每 32 轮对在用 fd 发 GET_RECV_LEN, RX>0 且 readable=0 → 计数 + 低频日志(首次必打,此后每小时 ≤1 条) - bring_up 尾部 armed 日志(挂机期间核对烧录身份) - 宏默认 0:产品构建编译剔除,实测体积与上一构建逐字节一致 (Code=211348 RO=18756 RW=1104 ZI=154232) 判据:24h 常态+E1 压测命中>0 → 项 4 立项;=0 → 盲收保留现状、 U15 登记观察项。 --- Drivers/BSP/NET/net_socket.c | 46 ++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index 78873b19..a2f336c8 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -361,6 +361,11 @@ static bool s_mac_is_zero(const uint8_t *p_mac) { s_net_initialized = 1; +#if NET_U15_PROBE + /* E6:确认插桩固件已生效(挂机期间据此核对烧录身份) */ + DBG_INFO("U15 probe armed: period=%u log_per_h=1", (unsigned int)NET_U15_PROBE_PERIOD); +#endif + return 0; } @@ -419,6 +424,21 @@ static void net_bench_cmd_log(char tag, int sock, int detail) { } #endif +/* N34 E6 实验插桩(U15 失配频率,docs/网络/N34-自愈审计/实验方案.md §E6): + * 假设=「RX 非空但 readable=0」(RECV_OK 中断丢失的数据面形态)在生产真实 + * 发生。置 1 烧实验固件:net_poll 每 32 轮对在用 fd 发一条 GET_RECV_LEN, + * 命中计数 + 低频日志(每小时 ≤1 条防刷屏);跑 24h 常态 + E1 压测。 + * 判据:命中 >0 → 阶段 3 项 4(U15 内化)立项;=0(含压测)→ 上层 32 轮 + * 盲收保留现状、U15 登记观察项。**默认 0 = 产品构建零成本(编译剔除)**。 */ +#define NET_U15_PROBE 0 +#if NET_U15_PROBE +#define NET_U15_PROBE_PERIOD 32U /* 每 32 轮 net_poll 探测一次(≈32ms) */ +#define NET_U15_PROBE_LOG_MS 3600000U /* 命中日志每小时至多 1 条 */ +static uint32_t s_u15_round; /* net_poll 轮次计数 */ +static uint32_t s_u15_hits; /* 累计命中次数(判据数据) */ +static uint32_t s_u15_last_log; /* 上次命中日志时刻(tick) */ +#endif + /* * 函数功能:轮询 CH395F 中断状态,更新 Socket 连接状态并处理事件 * 入口参数:无 @@ -555,6 +575,32 @@ int net_poll(void) { } } +#if NET_U15_PROBE + /* E6 探测(宏说明见文件上方):RX 非空而 readable=0 = RECV_OK 中断丢失 + * 的数据面形态。独立于上面的缓存刷新环:GET_RECV_LEN 是独立 SPI。 */ + s_u15_round++; + if ((s_u15_round % NET_U15_PROBE_PERIOD) == 0U) { + for (int i = 0; i < NET_MAX_SOCKETS; i++) { + uint16_t rlen; + + if (s_net_socks[i].in_use == 0U) { + continue; + } + rlen = ch395f_get_recv_len((uint8_t)i); + if ((rlen > 0U) && (s_net_socks[i].readable == 0U)) { + s_u15_hits++; + /* 首次命中必打(last_log=0 会被 uptime<1h 抑制);此后每小时 ≤1 条 */ + if ((s_u15_hits == 1U) || + ((uint32_t)(HAL_GetTick() - s_u15_last_log) >= NET_U15_PROBE_LOG_MS)) { + s_u15_last_log = HAL_GetTick(); + DBG_INFO("U15 probe: sock%d rx=%u readable=0 hits=%lu", + i, (unsigned int)rlen, (unsigned long)s_u15_hits); + } + } + } + } +#endif + /* 返回本次累计发生的事件数量(0 表示无事件) */ return event_count; }