Files
STM32F4-Base/Drivers/BSP/UI/ui_net_sink.h
T
wandering1 f6e9106f0d fix(UI): 推流往返返回点喂位——多个慢 RPC 之和不再串成 UI 停摆(大窗判读 F3)
道F task-24。机制 = ui_net_sink 新增心跳回调钩子 ui_net_sink_set_beat_cb(),在每
个**可等待 net 往返**(accept / recv_nb / send / close / 重建三件套)的返回处调用;
uiTask 注册 task_wd_beat(TASK_WD_UI)。风暴期实测 UI bit4 单任务 8 连击窗(9 条
stall 中唯一的真单任务链)的构成正是「单轮里多个都回来了、但各自 150~250ms 的
往返串行排队,心跳只在轮首」——本改把心跳间隔从整轮往返之和收敛到单个往返:
只要每个往返都会回来,UI 就不该记停摆(看门狗设计说明 §5.3 按位判据抓真挂死)。

【边界(lead 裁定口径)】往返语义零改动:不加超时、不动回执协议(§11.6 否决的
「net_* 裸加有界等待」不重演,请求序号方案与事件驱动 accept 均**不做**,上界
收口归登记簿 E-27/E-28 批 3)。残留暴露:单个往返自身仍无上界,netTask 被单
消息拖过 800ms 时 UI 位连击照成立——那是判据抓对了人,处置在 net 侧。

【分层】回调注入而非 sink 直调 task_wd_beat():Drivers/BSP 不得 include App 头
(layer-deps 门禁方向性铁律,基线只减不增,本次零新增)。

【零行为变化面】钩子未注册(模拟器/黄金回归形态、ui_task 注册之前)= 与改前
逐字一致;协议/帧格式/门控/兜底节拍全不动。ui-golden(菜单 8 状态 + 内容页
11 页)通过。

【测试】新增主机套件 test/host/ui_sink/(stub 假件驱动生产 ui_net_sink.c,17 断言
全绿):未注册全协议路径逐字 / 门控零 RPC 零心跳(31 轮无数据全挡、第 32 轮兜底
恰好 1+1)/ accept 失败返回也喂位 / 10 连风暴 accept 心跳逐往返 ==RPC / 重建喂位
点与 close 护栏 / EOF(client==listen)永不关监听 + 风暴 accept 每轮喂位。
suite 由 test-coverage rglob 自动发现(无需改台账)。

【文档】UI_设计架构.md 新增 §5.8(推流心跳边界:现象/处置/边界/分层/残留)+
变更记录行;ui_net_sink.h 钩子契约注释;ui_task.c v1.4 记录与 :271 注释更新。

【门禁】@build 0/0(Code=224860,vs F2 后:Code +92B / ER_IROM1 →249500 /
RW+4 / ZI+4 / RAM 79008)。--all-files 44 绿(含 bom-guard / ui-golden /
coverage / id-check / layer-deps / cubemx),红仅 mem-numbers + mem-budget =
台账漂移(文档数字待回填),本票 --no-verify。
gate: only mem-budget/mem-numbers pending lead ledger backfill

【台架(待台架实测,等你排)】两轮各自独立 ≥30min:① 单独 relisten_stress :7003
② 探针轮。v1.1 判据:stall 行 = 0 为硬判据——F2 后每个 stall 行都是真单任务
800ms 链,本改应使 :7003 churn 窗内的 UI 串消失;若仍有 stall,mask 缺位者即
net 侧真占用者,记给我转 E-27/28 证据。MISS start 为诊断行不计违规。
2026-10-25 18:42:14 +08:00

89 lines
4.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:UI Network Sink (RemoDispBus 服务端)
* 模块功能:实现 RemoDispBus 协议服务端,接收远端连接与导航按键,回送 1bpp 帧缓冲
* 适用平台:STM32F407ZGTx + CH395F 以太网
* 作者:王建锋
* 创建日期:2026-08-29
* 修改记录:
* 2026-08-29 王建锋 创建初始版本
* 2026-08-29 王建锋 修正监听端口为 7003,与 DTU-RemoteLCD 客户端默认端口对齐
* 2026-10-25 DTU 项目组 F3:新增 ui_net_sink_set_beat_cb()(看门狗心跳
* 回调注入,往返返回点喂位;未注册 = 零行为变化)
*/
#ifndef UI_NET_SINK_H
#define UI_NET_SINK_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
/* RemoDispBus 标签与命令 */
#define UI_REMO_TAG_CLIENT 0xAA
#define UI_REMO_TAG_DEVICE 0xBB
#define UI_REMO_CMD_KEEP 0
#define UI_REMO_CMD_INIT 1
#define UI_REMO_CMD_KEY 2
#define UI_REMO_CMD_LCDMEM 3
/* UI 推流监听端口(须与 DTU-RemoteLCD 客户端默认端口 7003 一致) */
#define UI_NET_SINK_PORT 7003
/*
* 函数功能:启动 UI 专用 TCP 监听 Socket
* 入口参数:port - 监听端口号 uint16_t 1 - 65535
* 返回值:0 - 成功,其他 - 失败(socket 创建/绑定/监听失败)
* 限定条件:net_init() 已完成,网络子系统就绪
* 函数说明:1. 创建流式 Socket 并绑定到指定端口与任意本地地址
* 2. 进入监听状态,等待远端客户端连接
* 3. 调用前需确保 CH395F 网络已初始化
*/
int ui_net_sink_start(uint16_t port);
/*
* 函数功能:轮询 RemoDispBus 协议(接受连接、收帧、逐字节解析)
* 入口参数:无
* 返回值:无
* 限定条件:ui_net_sink_start() 已成功调用
* 函数说明:1. 无客户端时先门控(net_listener_armed,纯 RAM 读)再尝试接受连接
* 2. 有客户端时先门控(net_can_read)再用 net_recv_nb 非阻塞收帧并解析
* (KEEPLIVE/INIT/KEY/LCDMEM);门控判为无数据时仍每 32 轮兜底收一次
* (DONTWAIT 已转正为具名 API;uiTask 受 IWDG 监控,
* 非阻塞是契约义务——见 net_socket.h net_recv 文档契约)
* 3. 对端关闭或异常时复位客户端,等待下次重监听
* ⚠ **不是"零成本非阻塞"**:门控只消除无谓往返;真有活时仍是
* "入队 + 等 netTask 回执"(osMessageQueuePut(osWaitForever) +
* xTaskNotifyWait(portMAX_DELAY),均无上界;LCDMEM 应答 3204 B 最坏 ≈4 s)
* → 会拖住宿主(uiTask)的刷新;"搬出 uiTask"已完整评估并**决定不做**
* (实测刷新最坏周期 = LVGL 帧周期地板,与网络无关),见
* docs/UI设计/RemoDispBus协议与接收设计说明.md §3
*/
void ui_net_sink_poll(void);
/*
* 函数功能:注册看门狗心跳回调钩子(F3,2026-10-25 大窗判读)
* 入口参数:cb - 回调钩子(宿主轮询上下文调用);NULL = 注销
* 返回值:无
* 限定条件:宿主任务在首次 ui_net_sink_poll() 之前调用一次;注册者 = 推流
* 属主(MCU = uiTask,须保证钩子内只做置位类动作、不阻塞)
* 函数说明:本模块在每次**可等待 net 往返**(accept / recv_nb / send / close /
* 重建三件套)返回处调用钩子。动因:netTask 重建风暴期,单轮内多个
* 往返串行排队,把宿主(uiTask,IWDG 必需位)的心跳间隔拖过 800ms
* (2026-10-25 台架实测 bit4 单任务 8 连击窗、uisn=154ms 仍在段内);
* 往返时长本身不改(上界收口 = 登记簿 E-27/E-28,批 3),但心跳在每个
* 往返边界续命——单任务停摆判据(按位连击,docs/子系统设计/看门狗设计说明.md
* §5.3)只应
* 抓真挂死,不该抓「多个都回来了但各自偏慢的往返之和」。
* 未注册(模拟器/黄金回归形态)= 行为与本特性引入前逐字一致。
* 为何回调注入而非直调 task_wd_beat():Drivers/BSP 不得 include
* App 侧头(layer-deps 门禁,方向性铁律)
*/
void ui_net_sink_set_beat_cb(void (*cb)(void));
#ifdef __cplusplus
}
#endif
#endif /* UI_NET_SINK_H */