docs(屏板): 回填真屏板 10 min 连续零错实测(§5.5),未测项清单刷新状态

21:30~21:44 挂机窗口末轮计数:rx=4258 ok=4258 crc=0 err=0 bits=0x00
rearm=0(连错误中断都没进过);末段 5 s 18 帧 = 277.8 ms/帧;
tx=4249 done=4248 drop 窗口内零新增 kerr=0 abor=0;keys=53 kq=0
(按压期间零丢弃);fb=902 bad=0、us max=812 µs < 1 ms 改口判据;
窗口内无 OFFLINE/back online 行。验收清单第 1 条主机侧半边闭环。

§7 清单状态同步:第 2 项 ✅;第 1 项拆成"主机侧已测/目视半边待测";
5.5 接线教训顺延为 5.6 并同步三处跨文档引用。
This commit is contained in:
2026-10-29 21:46:47 +08:00
parent dab0d8ba17
commit 9c6d150261
3 changed files with 187 additions and 3 deletions
+1
View File
@@ -93,6 +93,7 @@ docs/
| [`ADC采样节拍设计说明.md`](子系统设计/ADC采样节拍设计说明.md) | **ADC 采集链路采样节拍(现状说明)**:TIM3 1 kHz 更新事件同时触发 TPAFE CONVST 与(经 TRGO)STM32 ADC1 + DMA 乒乓缓冲;节拍源为什么是 TIM3、DMA 硬约束、事件驱动消费与就绪门、实现落点、观测计数、性能特征与设计边界 |
| [docs/子系统设计/故障录波设计说明.md](子系统设计/故障录波设计说明.md) | **故障录波设计与口径属主**:1 kHz 起步与 80 点口径的偏离登记、存原始码值的理由、四段所有权与三条并发陷阱、段文件字节布局、现场单通道回放显示契约、预算与 R6 前置 |
| [`IEC104上行设计说明.md`](子系统设计/IEC104上行设计说明.md) | **B4 上行规约**:IEC 60870-5-104 被控站(TCP 2404)范围/点表(V0.1 有效子集)/链路流程(k/w/t1~t3、总召、COV、遥控两段式、定值)/netTask 接入决策/预算与测试方案;协议核心纯逻辑 + 主机侧纯逻辑单测全栈单测 |
| [`屏板链路设计说明.md`](子系统设计/屏板链路设计说明.md) | **屏板串口链路(`Drivers/BSP/ScreenLink/`)实现记录**:一句话架构与数据流、`sb_proto`/`sb_link` 全部对外接口、八条关键实现决定(不留影子缓冲/busy 冻结/中断起发等)、资源占用实测(`s_frame` 落 RW_IRAM1 非 CCM)、单测与台架/真屏板冒烟证据链、接线教训(排针丝印视角陷阱)、坑账本、**尚未实测项清单**;任务分解与协议事实源仍在 `docs/任务规划/屏板链路.md` |
| [`网络/BSD_Socket_API_使用指南.md`](网络/BSD_Socket_API_使用指南.md) | **上层视图**:BSD Socket API 公开语义、示例、常见问题 |
| [`网络/BSD_Socket_API_函数调用关系.md`](网络/BSD_Socket_API_函数调用关系.md) | **内部视图**:netTask / 消息队列 / 保护判据挂起 / 重试对账的调用关系与设计意图 |
| [`网络/Net层阻塞模型架构设计.md`](网络/Net层阻塞模型架构设计.md) | **等待模型**:recv/send 挂起请求架构、数据结构与挂起槽状态机、recv 五路 + send 四路完成语义、模块接口契约(14 函数)、实现落点(20 集成点)、调用方契约、设计边界与性能特征 |
+12 -3
View File
@@ -112,6 +112,15 @@
| `U5.B10`(网络 `ST_RX0`,PA10) | 屏板 `PA2`(屏板 USART2_TX) | 屏板发 → 主机收 |
| 板地(`CGND`,或板上任一 GND 脚) | 屏板 `GND` | 共地,必须接 |
> ⚠ **本表的"屏板侧 PA 编号"与 2026-10-29 真屏板首通实测相反**:照表接 `rx` 彻底静默,
> **两根信号线对调后立即通**。表里"TX 对 RX"的方向逻辑没错,错的是屏板排针对 PA2/PA3
> 谁是发的假定(未经屏板方确认)。**实操以排针丝印 + 计数为准**:主机 TX 接丝印 **RX**、
> 主机 RX 接丝印 **TX**、GND 必接;接完看主机 `[SBLINK] rx` 是否涨(涨=方向对,与内容无关),
> 不涨当场对调。全证据与推论见 `docs/子系统设计/屏板链路设计说明.md` §5.3/§5.6——
> 对调后屏板出了正确画面,等于屏板按 CRC 验收了主机的发送线**就是**它标 RX 的那根,
> 即**屏板实际发送脚是表中标 `PA3` 的那根**(与屏板固件"USART2 TX=PA2"的常规映射相反,
> 除非它的 USART2 做了重映射)。产品线束定版前向屏板方核实。
三条容易接错的地方:
- **必须交叉**:TX 对 RX。同边对接(`U5.A10` 接屏板 `PA2`)两端口都静默,且没有任何报错可看。
@@ -234,7 +243,7 @@
|---|---|---|---|
| 0-1 ✅ | **台架串口线挪位** | 硬件:**换成 USB 转 RS-232 适配器**(TTL 的 CH340 直连不了),接 RS232#1 的三个端子——适配器 TXD → **CN1.10**(板子 `RS232_RX1`)、RXD → **CN1.12**(板子 `RS232_TX1`)、GND → **CN1.7 或 CN1.8**(`CGND`)。端子号出自 `docs/硬件平台/V0.1.tel`;`U14` 是 RS232#3 的网口座,本通道用不上 | **已完成 2026-10-29**:COM3 在 RS-232 侧可读可抓(`serial-assistant` 正常) |
| 0-2 ✅ | **日志口迁移(USART1 → RS-232)** | `console_log.c` 的 `huart1`、`USART1_IRQn`、`__HAL_RCC_USART1_CLK_*`、`MX_USART1_UART_Init()` 收口成**一处端口宏**,指向 **`huart5`(RS232#1,已定)** | **已完成 2026-10-29**(`f5161e15`):COM3 抓到完整开机日志、8 个锚点全中、启动到 `net init: OK` 661 ms;连续 10 min 1218 行零 `[ERR]`/零 dropped;USART1 已无控制台写入 |
| 0-3 ✅ | **落定 USART1 到屏板的接线** | 按决策一:TTL 直连屏板 UART2 侧(PA2/PA3);接法与验收方式见 §2 决策一下方的「接法与验收」 | **接法已落纸 2026-10-29**:`U5.A10` / `U5.B10` ↔ 屏板 `PA3` / `PA2` + 共地,交叉接。后半条"照此接线后 6 B 召唤帧能被收到"要等 **1-3** 的接收中断落地才测得到,实测随 1-3 一起做 |
| 0-3 ✅ | **落定 USART1 到屏板的接线** | 按决策一:TTL 直连屏板 UART2 侧(PA2/PA3);接法与验收方式见 §2 决策一下方的「接法与验收」 | **接法已落纸 2026-10-29**:`U5.A10` / `U5.B10` ↔ 屏板 TTL 排针 + 共地,交叉接。**真屏板实测(同日):照表对 PA 编号接不通、信号线对调后才通**——验收以"主机 `rx` 计数上涨"为准,屏板侧 PA2/PA3 的实际收发方向待向屏板方核实(见决策一表下 ⚠ 与 `docs/子系统设计/屏板链路设计说明.md` §5.6) |
> PA10 已接线(用户 2026-10-28 确认),屏板链路**不需要额外飞线**。
@@ -271,7 +280,7 @@
> 真出问题的是 ORE(`0x08`)——那是处理不过来,本链路 6 B/280 ms 不该出现。
> 台架上没造出 ORE(CPU 读 DR 太快),那条路径由主机单测按 RM0090 的清除语义覆盖。
### 批 2 · 协议实现(5 项,2026-10-29 全部收尾)
### 批 2 · 协议实现(5 项,2026-10-29 全部收尾;实现记录见 `docs/子系统设计/屏板链路设计说明.md`)
| 序 | 任务 | 改动点 | 判据 |
|---|---|---|---|
@@ -412,7 +421,7 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
| 1 | 协议层单测(`test/host/screenlink/`) | 无硬件 | CRC 与组帧的正确性,可回归 |
| 2 | PC **模拟屏板**:按屏板节拍发 6 B 召唤帧(脚本 `test/host/screenlink_bench.py`,`--port COM6 --key-fixed 2` 可持续改画面以拿多次组帧样本;`--glitch-baud 115200` 灌噪声验自愈;`--reply` 收应答) | **USB 转 TTL 模块**接 U5 的 `ST_RX0`/`ST_TX0`(PA10/PA9)+ 主机板 | 收侧**已做**(`ok == rx`、`crc=0`、`size=6`、噪声后自愈);发侧固件计数**已做**(`tx == done`、`drop=0`、`bad=0`、`fb` 随画面变化增长)。⚠ `--reply` 收不全 4208 B 是 CH340 的限制,不是固件问题,见批 2 下方那条 ⚠ |
| 3 | 反向:PC 收主机帧,用脚本核对 4208 B / CRC / 显存内容 | 同上 | 帧内容正确性(与 `g_ui_fbuf` 逐字节比) |
| 4 | **接真屏板**(TTL 直连屏板 UART2 的 PA2/PA3 一侧) | 屏板实物 + 屏板 TTL 引出 | 出图 + 按键 + 状态灯全链路 |
| 4 | **接真屏板**(TTL 直连屏板 UART2 的 PA2/PA3 一侧) | 屏板实物 + 屏板 TTL 引出 | **冒烟首通 + 10 min 零错 2026-10-29**:出图(用户目视确认)、`rx=4258 ok=4258 crc=0 err=0`、应答 `tx=4249 done=4248 drop=0(窗口内) abor=0`、按键 `keys=53 kq=0`、`off` 自动恢复。⚠ 接线实测教训:**按排针丝印同名直连收不到,必须"主机 TX 接丝印 RX"**(丝印是屏板视角),且两板各供电须接第三根 GND——详见 `docs/子系统设计/屏板链路设计说明.md` §5.6。状态灯/长稳/时序仪器项仍未测 |
| 5 | 产品形态:按最终线束接法定版 | 线束 | 产品形态验证 |
> 第 2、3 步是**性价比最高的两步**:不用屏板、不用改硬件,就能把 90 % 的软件问题挖出来。
@@ -0,0 +1,174 @@
# 屏板链路设计说明(主机侧实现记录)
> 模块:`Drivers/BSP/ScreenLink/`(`sb_proto` + `sb_link`),任务 `screenlink`。
> 本文档记**已实现的内容与实测证据**;任务分解、协议事实源、四个决策的来龙去脉在
> `docs/任务规划/屏板链路.md`(下称规划文档),两边不重复维护同一张表。
> 创建:2026-10-29(真屏板首通当晚落笔)。
---
## 1. 一句话架构
屏板是 Modbus 主站、每 280 ms 发一帧 6 B 召唤(帧 A),主机是从站 `0x01`:
**任务侧组好一帧 4208 B(帧 B)挂在手上,空闲中断校完召唤直接点 TX DMA 回一帧**;
屏板按键骑在召唤帧里上来,主机排给 UI。串口为主出口,7003 网络是同一份显存的镜像。
```
uiTask(10 ms 节拍) USART1 空闲中断(屏板召唤到达)
ui_port_step() 渲染 sb_link_on_rx_event()
sb_link_frame_update(活显存, 掩码) ├─ sb_frame_a_parse 校验 6 B
├─ 点阵 memcmp 没变 → 立刻返回(~20 µs) ├─ 按键 ≠ 0 → 入环形队列
├─ TX busy → BSP_ERR_BUSY,下拍再来 ├─ 帧有效 → sb_tx_kick() 点 TX DMA
└─ 变了 → sb_frame_b_build_image 组整帧 └─ 无条件重挂 ReceiveToIdle_IT
+ sb_frame_b_verify 自校验
→ s_frame_ready = 1 DMA2_Stream7 TC 中断
sb_link_key_take() 出队 sb_link_on_tx_cplt() 清 busy
→ ui_task_board_key_map() 映射 UI_KEY_*
→ ui_port_queue_key()
sb_link_poll(tick) 统计上报 + ≥10 s 无召唤判离线
```
分层铁律:`sb_proto` 纯逻辑(不碰 HAL/寄存器/任务),原样 include 进 `test/host/` 跑单测;
`sb_link` 依赖 HAL 与中断上下文,仅 MCU。
## 2. 对外接口(单一出处在头文件,这里只列形状)
| 接口 | 上下文 | 作用 |
|---|---|---|
| `sb_link_init(&huart1)` | 启动,`app_main.c` 步骤 2b | 交叉核对波特率(对不上报 ERR_STATE)+ 挂首轮接收 + 使能 DWT |
| `sb_link_receive_start()` | 中断/任务 | 重挂 IDLE 接收(一次性 API,漏一次链路永久静默) |
| `sb_link_on_rx_event(huart,size)` | 中断(rs485.c 转发) | 帧 A 校验、计数、按键入队、**点 TX DMA 应答**、重挂 |
| `sb_link_on_error(huart)` | 中断(rs485.c 转发) | 按 SR→DR 顺序清错、按需重挂 RX、按 `gState` 清被打断 TX 的残留 busy |
| `sb_link_on_tx_cplt(huart)` | 中断(rs485.c 转发) | 清 busy、计数;**不在中断里组帧** |
| `sb_link_frame_update(bmp,mask)` | uiTask | 按需组帧(memcmp 判变化),busy 返 BUSY,自校验不过不发 |
| `sb_link_key_take()` | uiTask | 出队屏板原始键号(0=空);映射归 uiTask |
| `sb_link_poll(now_ms)` | uiTask | 离线判定(每拍)+ 5 s 变化才打的 RX/TX 两行统计 |
| `sb_link_get_stats(&st)` | 任意 | 计数快照(rx/ok/crc/keys/tx/done/drop/fb/us/offline…) |
| `sb_crc16` / `sb_frame_a_parse` / `sb_frame_b_build_image` / `sb_frame_b_build_logo` / `sb_frame_b_verify` | 纯逻辑 | 协议层五件套,主机单测 59/59 |
全局回调落点:`HAL_UARTEx_RxEventCallback` / `HAL_UART_ErrorCallback` /
`HAL_UART_TxCpltCallback` 三个的**唯一实现处都在 `rs485.c`**,各含一行
`sb_link_on_*` 转发;按句柄过滤在 `sb_link` 内部做。三个必须收在一处见全——
分开写,下一个加通道的人会以为 TxCplt 没人用而再定义一份(multiple definition)。
## 3. 关键实现决定(为什么是现在这个样子)
1. **不留 3200 B 影子缓冲**:帧里的点阵段就是"上次组进去的那一份",直接拿它跟活显存
memcmp。省下 3200 B SRAM 与每拍 0.15 ms 的 CRC,代价只是每拍一次 memcmp(~20 µs)。
2. **busy 期间冻结帧缓冲**:DMA 读的就是 `s_frame` 本体,中途改写 = 半新半旧的脏帧
(CRC 仍对、屏板照收、画面撕裂,极难归因)。宁可 `BSP_ERR_BUSY` 下一拍再组。
双缓冲被否:一召唤一答的节奏下"下一拍补组"最坏慢 10 ms,屏板 280 ms 周期无感,
不值再花 4208 B。
3. **起发在中断里**(规划文档的决策三):4208 B 线上 59.6 ms,任务里轮询 DR 一次几十 µs
的 ISR 抢占就把帧切断(屏板按 1 字符时间断帧、且坏帧也清超时计数——现场只剩"画面不刷新")。
4. **注键走 `ui_port_queue_key`、不绕 `ui_net_sink_inject_key`**:后者只是 7003 后端对
同一函数的转发,绕过去要多一次 include 且语义不变。两条入口进同一个输入队列。
5. **错误中断顺手收拾 TX**:HAL 的 TX 被错误打断时不调 TxCplt,busy 会永久挂着,
之后每次召唤都被判"上一帧还在发"→ rx 涨 tx 冻结。判据用 `huart->gState != BUSY_TX`。
6. **离线判 10 s 不判 500 ms**:屏板 ≈5000 s 自复位有 ≈1 s 空窗,短窗会把"歇了口气"
判成离线再"恢复",标志反复跳。
7. **LED 掩码暂传 0**:状态灯映射表属批 3;帧结构不变,届时只换 `frame_update` 的实参。
8. **键 9/10 丢弃留痕**:决策四未裁,先按 `docs/任务规划/屏板链路.md` §4.3 的表把
1/2/3/4/7/8 映射到 `UI_KEY_*`,9/10 出日志不注键。
## 4. 资源占用(实测,`.map` 可复核)
| 项 | 值 | 备注 |
|---|---|---|
| `s_frame` | 4208 B @ `0x20006d98` | `Execution Region RW_IRAM1`——**不在 CCM**(DMA1/2 物理不可达 CCM,放错段=静默发旧数据) |
| `s_rx_buf` / `s_stats` 等 | 16 + 84 B | 同段 |
| 整模块增量 | Code 约 +1.5 KB | 批 2 前后 237,464 → 238,936 B |
| 全镜像 | RW_IRAM1 85,904 B (65.5 %) / RW_CCM 57,376 B (87.9 %) | 凭证 `scripts/size_attestation.json` |
| TX DMA | `DMA2_Stream7` CH4,NVIC 优先级 9 | CubeMX 已配好、此前全工程没人用;无需动 `.ioc` |
| 波特率 | USART1 = 700000,BRR=0x0078(误差 0 %) | 写在 `Src/usart.c` 的 `USER CODE BEGIN USART1_Init 2`(`.ioc` 不保存波特率),开机日志自证 |
| RX | 16 B + IDLE 中断 | 不上 RX DMA(屏板只发 6 B) |
## 5. 实测记录
### 5.1 主机单测(可回归)
- `test/host/sb_proto/`:**59/59**,含屏板实测向量与 CRC 表逐字节交叉验证。
- `test/host/sb_link/`:**146/146**(批 2 新增 65 条)。桩把 `SR/DR/CYCCNT` 做成函数指针,
能在主机上钉住:ORE 清除的 SR→DR 顺序(RM0090 语义在桩里真执行)、非阻塞错误**不得**重挂、
busy 期间帧缓冲逐字节冻结、错误中断清残留 busy 但不误杀在发的 TX、帧 B 每个字段、
周期→µs 换算除数、离线 9.999 s/10 s 边界与恢复、按键 FIFO 与溢出丢新。
### 5.2 台架(PC + USB 转 TTL 顶替屏板,2026-10-29 白天)
40 s `--key-fixed 2`:`rx=143 ok=143 keys=143 crc=0` / `tx=143 done=143 drop=0 abor=0
fb=144 bad=0`;杜邦线噪声形态 `bits=0x02`(NE)每帧 ~1.3 次但数据零错——已定口径
"NE/FE 而 rx_ok 照涨 = 能用的告警";错波特率灌 64 B 垃圾后自动恢复;激励停止 10 s
准点 OFFLINE。组帧耗时 **509 µs 典型 / 709 µs 峰值**(成本全在 4206 B 查表 CRC、512 B
表驻 Flash)——原 0.3 ms 估算判据已改口 1 ms,压降路径记录未实施,见规划文档批 2 的 ⚠。
### 5.3 真屏板冒烟首通(2026-10-29 21:24,接 §2 决策一的 TTL 线)
| 证据 | 读数 | 结论 |
|---|---|---|
| `rx=125 ok=125 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0` | 一字节没错、**连错误中断都没进过** | 真屏板线路质量优于台架杜邦线(台架每帧 ~1.3 次 NE) |
| 5 s ≈ 18 帧 → 278 ms | 与屏板固件 280 ms(第 56 拍 × 5 ms)吻合 | 对端确认是屏板本尊的周期召唤 |
| `tx=116 done=116 kerr=0 abor=0`,`drop=9` 集中在开机头两秒 | 一召一答、无双发、无失败 | 2-2/2-4 的时序骨架在真硬件上成立 |
| 错接期间 `off=1` → 对调线后连打三轮 `off=0` | 离线判定与自动恢复走通 | 2-5 判据闭环(全程未重启主机)。⚠ `back online` 那一行本身没取到证据——恢复发生在 21:24 抓日志的 `clear` 之前 ~10 s,行被抹掉了;但 `offline` 字段**只有**恢复分支会清,1→0 的转变即该分支执行过的证明 |
| **屏板出图,用户目视确认"非常完美"** | 见 §5.4 的推论 | 帧 B 的 4208/CRC 口径端到端正确 |
### 5.4 "出图"这两个字的证明力(别低估它)
屏板收帧**只有两种结局**:整包 CRC 过 → 刷屏;不过 → 静默丢弃,且它超时计数照清、
没有任何报错通道(`docs/任务规划/屏板链路.md` §4.4 预言过的"只表现为画面不刷新")。所以肉眼看到正确画面,等于
**屏板亲手验收了**:帧长 4208、CRC 覆盖 [0,4205]、**低字节在前**(两处命名相反的屏板
源码口径)、1 bpp 20 B/行 MSB 在前的显存布局、info 字段布局——全部端到端正确。
这是主机侧任何计数都给不出的一条证据,台架阶段(CH340 收不全)也补不了。
### 5.5 真屏板 10 min 连续零错(2026-10-29 21:30~21:44,验收清单第 1 条的主机侧半边)
挂机窗口内(日志清零后累计)末轮计数:
| 计数 | 读数 | 判据 |
|---|---|---|
| `rx=4258 ok=4258 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0` | **连错误中断都没进过一次** | 10 min 零超时、零 CRC 错帧 ✓ |
| 末段 5 s 采样 4240→4258 = 18 帧 | 277.8 ms/帧 | 与屏板 280 ms 节拍吻合 ✓ |
| `tx=4249 done=4248 drop=9 kerr=0 abor=0` | `drop=9` 全部是开机头两秒(帧未就绪),窗口内零新增;`done` 差 1 是采样瞬间最后一帧还在发(59.6 ms 窗) | 一召一答、无双发、无失败 ✓ |
| `keys=53 kq=0` | 按压期间 53 个按键帧全部入队出队、**零丢弃** | 按键"逐键必到"的主机侧半边 ✓(动作语义合不合菜单树需目视,见 §7-1) |
| `fb=902 bad=0`,`us=687 max=812` | 10 min 组帧 902 次(待机时钟秒跳等 LVGL 自刷新驱动,≈1.5 次/s),自校验全程通过;峰值 812 µs < 1 ms 改口判据 | 常态组帧占空比对 10 ms 节拍 <7 % |
| 窗口内无 `OFFLINE`/`back online` 行 | 连接全程稳定 | — |
### 5.6 接线实测教训(决策一的接法表照接后**不通**,对调才通)
- 按规划文档决策一的表接"主机 A10(PA9)→屏板 PA3、B10(PA10)→屏板 PA2"**rx=0 彻底静默**;
**把两根信号线对调后立即通**。表本身的信号方向逻辑没错(TX 对 RX),错在**屏板侧引脚的
认定**——排针丝印 TX/RX 是"屏板自己发出/接收"的视角,与网表里 PA2=发送/PA3=接收的对应
关系未经屏板方确认。实操判据比丝印可靠:**接完看主机 `rx` 有没有计数**(rx 一动=方向对,
与帧内容无关),不动就当场对调。产品形态线束定版前,以"rx 计数"为唯一验收口径。
- 两块板各自供电必须接第三根线 GND;只连两根信号线时是浮地,形态同样是彻底收不到。
## 6. 坑账本(都已在代码注释/规划文档留痕,这里只汇总)
1. 中文字面量 → ARMCC `#870-D`(源码无 BOM 按本地代码页解)。日志字面量纯 ASCII。
2. `@test` 的 forbidden `FAIL;ERROR;HardFault;[ERR]` **大小写不敏感**——日志字段名带
fail/error/abort 会把启动自检判红(`fail=0` 实测中招,已改 `kerr=`/`abor=`)。
3. `ReceiveToIdle_IT` 一次性:漏重挂 = 链路永久静默;ORE 不自己清 = 一次噪声打死接收。
4. NE/FE 非阻塞、ORE 阻塞:重挂判据用 `RxState==READY`,不看错误位。
5. CH340 收不了 700 kbaud 连续流(4208 B 只到 ~2373 B)——**收不全 ≠ 固件没发**,
同轮 `tx==done` 即自证。
6. `.ioc` 不保存 UART 波特率;改波特率只能在 `USER CODE` 覆盖后重调 `HAL_UART_Init`。
7. 纯注释改动也会让体积凭证报"不同码":先重建、再 `ram_baseline --update`。
## 7. 尚未实测项(按优先级)
| # | 项 | 怎么测 | 状态(2026-10-29 夜) |
|---|---|---|---|
| 1 | **7 个物理键逐个按** | 真屏板已就位:每按一键,日志 `keys=` 应 +1、`kq` 恒 0,画面动作对照 `docs/产品需求/产品需求设计文档.md` §8.2 菜单树;键 9 应只出 `unmapped` 日志 | **半闭环**:10 min 窗口 `keys=53 kq=0`(必到、零丢弃)已实测(§5.5);剩"逐键动作合菜单树 + 键 9 出 unmapped 日志"需边按边看 |
| 2 | **10 min 连续零错**(屏板在线) | 挂机后 `grep SBLINK` 抽末行:`crc=len=fmt=err=rearm=bad=kerr=abor=0`、`tx≈rx`、`done=tx` | ✅ **2026-10-29 实测通过**(§5.5,rx=4258 零错) |
| 3 | **拔插回归**(正式版) | 拔屏板线 ≥10 s → 一条 OFFLINE;插回 ≤2 s 续图、一条 back online;期间 7003 与日志口不受影响 | 冒烟时被动验过一半(对调线前 off=1、对调后自动恢复);主动拔插 + 7003 并发面未测 |
| 4 | **uiTask 单轮增量**(判据"画面静止时 memcmp 成本 ~20 µs") | 画面静止 1 min,对比开屏板前后的 `[PROF] uiw`;按键刷屏时段观察 `uiw` 尖峰 ≈ 组帧 0.7 ms 以内 | 未测(§5.5 已给出组帧侧成本上限 `max=812 µs`,`[PROF]` 对照仍缺) |
| 5 | **2 h 长稳跨自复位** | 挂机 ≥5000 s + 余量:零误判离线(自复位 ≈1 s 空窗不该出 OFFLINE)、零 kerr/abort、恢复自动 | 无 |
| 6 | **召唤→应答延迟 30 µs~5 ms / 帧内无 ≥28 µs 间隙 / 59.6 ms** | 逻辑分析仪挂 `U5.A10/B10`;或 FTDI/CP210x 适配器 + `screenlink_bench.py --reply` 只能验整帧时长与内容(USB 1 ms 粒度量不了间隙) | 仪器 |
| 7 | **帧 B 与 `g_ui_fbuf` 逐字节比** | FTDI/CP210x 收满 4208 后 `--dump` 出 PBM 对 UI 目检;严格逐字节需 PC 收全帧脚本比对(CH340 做不了) | 仪器 |
| 8 | **双通道并发**(批 4) | 挂 DTU-RemoteLCD 持续拉帧 + 屏板同时召唤:两侧画面一致、串口发送期 7003 不超时、7003 拉帧期屏板不超时 | 无 |
| 9 | **7003 拥塞时串口照常应答** | 制造 netTask 往返卡顿(对时风暴/客户端不读),屏板侧应零超时、画面停最后一帧——"起发不在任务态"的直接证据 | 无 |
| 10 | **状态灯逐位**(批 3 功能,测随实现走) | 映射表落地后逐位点亮验证、LED 0 不受掩码影响 | 批 3 |
| 11 | **LOGO 断电留存**(批 3 功能) | 下发后重启屏板仍在、LED 不变;完成后追加"LOGO 写 Flash 期间拔线"负路径 | 批 3 |
| 12 | **键 9/10 语义裁定**(决策四) | 需要产品侧定 RESET/FACTORY 行为,代码已留 unmapped 分支 | 人 |
| 13 | 真屏板 ORE 路径 | 主机侧只能被动等:若某天 `bits` 出现 0x08,看 `rearm` 是否跟涨;台架造不出(CPU 读 DR 太快),已由主机单测按 RM0090 覆盖 | 机会性 |
第 2 项已代跑通过(§5.5);第 3、4 项接线不动就能跑;第 1 项剩下半边需要你手按。