net/ui: UI 推流加就绪门控,刷新脱离 netTask 往返(销项 N-10)
新增 net_can_accept() / net_can_read():纯 RAM 读 Socket 控制块,不入队、 不等 netTask 回执,供实时性敏感任务在发 RPC 前判断"有没有活"。 ui_net_sink_poll() 改为先门控再 RPC;无客户端时 RPC 从 100 msg/s 降到 0。 两条兜底(门控引入的新卡死路径,设计阶段未预见): - I-2 每 32 轮无条件 recv:readable 仅由 RECV_OK 中断置位,Trap 22 三类 对账不含"RX 非空但 readable=0",纯门控会把已到达的数据永久藏住; - I-3 门控返 0 时查监听控制块,消失即 g_listen=-1 重建(改前靠每轮 accept 撞 BADF 暴露,门控会连这条暴露路径一起消掉)。 net_can_read() 对非 ESTABLISHED / 非法 fd 故意返 1,让上层必得 EOF/BADF 走既有错误分支——返 0 会把死连接永久藏住。 模拟器后端恒返 1(Winsock 无 RPC 成本,行为逐位不变)。 实测:uis 50ms→1µs、uiw 50ms→11.4ms(只剩 LVGL);@build 0 错 0 警、 @test 10/10 PASS(uis≤1µs、uisn≡0、0 task stall、0 [ERR])、 check_remo_sink.py e2e 0/25600 位差异、内容页文本断言 50/50。 uip 最坏 61ms 是 LVGL 帧周期地板、与网络无关,判据已按实测修订。 方案 B(把推流搬出 uiTask + 帧 seqlock)已评估并决定不做:搬任务不会 让刷新变快,收益只剩极端并发下的观感隔离,成本含必改 .ioc 的 CubeMX 重生成。残留暴露与观测手段(uis/uisn)如实记录在 §9.4。 N-19 / C7 不入登记簿(当日结案),结论沉淀进问题记录 §9。
This commit is contained in:
@@ -347,6 +347,39 @@ int net_accept(int sockfd, struct net_sockaddr *addr, int *addrlen)
|
||||
return nidx;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:查询监听 Socket 是否有可接受的连接(与 MCU 端同名 API)
|
||||
* 入口参数:sockfd - 监听 socket 描述符
|
||||
* 返回值:1 - 可尝试 accept;0 - 描述符无效
|
||||
* 限定条件:socket 已创建
|
||||
* 函数说明:Winsock 后端无"零成本预知"手段(要嘛真调 accept、要嘛 select()),
|
||||
* 而 accept 本就是非阻塞的、**没有 MCU 端的 RPC 成本** → 恒返回 1,
|
||||
* 使上层门控在模拟器上等价于"改前行为"(逐位一致,不引入新语义)
|
||||
*/
|
||||
int net_can_accept(int sockfd)
|
||||
{
|
||||
if (sockfd < 0 || sockfd >= NET_MAX_SOCKETS || s_socks[sockfd].in_use == 0) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:查询 Socket 是否"值得发一次 recv"(与 MCU 端同名 API)
|
||||
* 入口参数:sockfd - socket 描述符
|
||||
* 返回值:1 - 可尝试 recv;0 - 描述符无效
|
||||
* 限定条件:socket 已创建
|
||||
* 函数说明:同 net_can_accept——Winsock recv 非阻塞、无 RPC 成本 → 恒返回 1,
|
||||
* 上层门控在模拟器上不改变既有行为(含"每轮都 recv"的自愈特性)
|
||||
*/
|
||||
int net_can_read(int sockfd)
|
||||
{
|
||||
if (sockfd < 0 || sockfd >= NET_MAX_SOCKETS || s_socks[sockfd].in_use == 0) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* 函数功能:TCP Client 发起连接
|
||||
* 入口参数:sockfd - socket 描述符
|
||||
|
||||
Reference in New Issue
Block a user