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; }