docs(屏板): 批 3 改写(LOGO 出局)+ 4-1 双通道并发实测回填

- 规划批 3 表改两项(3-1 映射表 / 3-2 下发),3-3 LOGO 标 ❌ 出局
  (用户裁定 2026-10-29:LOGO 功能无用、不实现,sb_proto 组帧函数列待删);
  §0 执行序、验收清单第 8 条、另测三项(LOGO 那条连同串进去的残句一并清)
  → 两项、风险表两行同步。风险表"const 数组"防返工手段按实际实现改口
  (位宏 + 单点纯函数 + 单测钉定义集——5 路输入判据形态各异,表统一不了谓词)。
- 设计说明 §3 决定 7 改写(LED 掩码独立纯逻辑模块折算)+ 新增决定 9(LOGO 出局);
  新增 §5.7 双通道并发回归实测(7003 侧 2200 拉帧零错零超时 / 屏板侧隔离窗口
  每召必答零丢弃 / 画面一致性由同一份活显存机制保证 / len=7 观察项如实记);
  §7 清单第 8 项销项、第 10 项状态灯改为"已实现待目视"(含 ID2/ID5 在未标定
  闭锁下恒灭的口径提示)、第 11 项 LOGO 划掉。
- 裸 §5.7 跨文档引用改全路径(--sections-strict 自引用判据)。
This commit is contained in:
2026-10-30 00:40:45 +08:00
parent 0b84c43d2e
commit f405c8994f
2 changed files with 44 additions and 21 deletions
+12 -16
View File
@@ -24,7 +24,8 @@
前两步**已于 2026-10-29 完成**(§3 批 0 的 0-1 / 0-2:台架线接 CN1 的 RS232#1,日志口迁到 UART5,
台架串口由 `COM6` 变成 `COM3`,`.serialtest/config.json` 已同步);第三项 0-3 的接法也已落纸。
**批 0 / 批 1 / 批 2 均已收尾(2026-10-29):USART1 在 700 kbaud 上收发双向通了(收 6 B 帧 A、
回 4208 B 帧 B),下一步进批 3(状态灯映射表 + LOGO 下发)。**
回 4208 B 帧 B)。批 3 按用户裁定(2026-10-29)缩为两项:状态灯映射表 + 下发;
**LOGO 功能出局**(不实现,`sb_proto` 里既有 LOGO 组帧函数列为待删除)。**
---
@@ -306,22 +307,19 @@
> 或者按 §5 直接接真屏板。`screenlink_bench.py --reply` 已内置这条提示。
### 批 3 · 状态灯与 LOGO(3 项)
### 批 3 · 状态灯(3-1 / 3-2 两项,2026-10-29 收尾;LOGO 出局)
| 序 | 任务 | 改动点 | 判据 |
|---|---|---|---|
| 3-1 | **状态灯位映射表** | 定义"业务状态 → 屏板 LED 位"的表(**参考源码里没有这张表,必须自定**)。建议:ID 1 = 运行、ID 2 = 告警、ID 3 = 通信、其余按 `docs/产品需求/产品需求设计文档.md` §5.8 的 6 路语义扩展;**bit0 恒 0**(ID 0 是硬件常亮的电源灯)、**bit20~31 恒 0** | 表落纸并进代码;每位点亮/熄灭可单独验证 |
| 3-2 | **状态灯下发** | 32 位小端填进 `info[0..3]`(`info[0]` = bit0~7) | 主机改掩码 → 屏板对应 LED 变化,**LED 0 不受掩码影响** |
| 3-3 | **LOGO 下发(一次性)** | 独立入口(不进常规刷新):`info[4..5] = 0x89 0x45`、`info[0..1]` = 宽、`info[2..3]` = 高(大端) | 下发后屏板显示 2 s 并写 Flash;**断电重启后 LOGO 仍在**;这帧不改 LED 状态 |
> ⚠ LOGO 帧会把屏板 Flash `0x0803F000`(扇区 126)**整块覆盖**,且屏板固件不校验是否同一张图。
> 建议只在出厂配置/联调流程里提供,**不要挂到菜单上**。
| 3-1 | **状态灯位映射表** | 落 `App/algo/sb_led_map.c/h`(纯逻辑,主机单测 17/17):**ID 1 = 运行心跳**(500 ms 半周期闪烁,与主板 LED1~3 同拍)、**ID 2 = 告警**(`prot_elm_active_mask != 0`)、**ID 3 = 通信**(104 链路 RUN,新增 `iec104_serv_link_run()`)、**ID 4 = 采样故障**(`adc_health_flags()` 电平位,不选 sticky——灯要能灭)、**ID 5 = 保护启动**(`prot_elm_pick_mask`);**bit0 恒 0**(ID 0 硬件常亮、屏板不看位)、**ID 6~19 恒 0**(保留,扩展从 ID 6 顺序取) | 表落纸并进代码 ✓;主机单测用「掩码 & ~定义集 == 0」钉住无表外位 ✓;每位点亮可单独验证(真屏板目视,见 §5) |
| 3-2 | **状态灯下发** | `ui_task.c` 帧组装块每拍现采四路状态源(全部是"任意上下文可读"观测口)→ `sb_led_map_eval()` → 掩码进 `sb_link_frame_update()` 的 `info[0..3]`(小端);**掩码变了帧就重组**,走批 2 已有的 busy/dirty 机制,无新通路 | 主机改掩码 → 屏板对应 LED 变化;**LED 0 不受掩码影响**(真屏板目视待验,见 §7 清单) |
| 3-3 ❌ | ~~LOGO 下发~~ **出局**(用户裁定 2026-10-29:LOGO 功能无用,不实现、不接线) | 不做下发入口;`sb_proto.c/h` 里既有的 `sb_frame_b_build_logo()` + `SB_LOGO_MAGIC_*` 常量与 `test/host/sb_proto` 的相应用例**列为待删除**(删除时连同 `docs/子系统设计/屏板链路设计说明.md` 的 LOGO 段落一并清)。帧 B 的 `info[4..5]` 常规图像路径恒填 0,屏板按普通图分支处理,与 LOGO 无冲突 | 无——本项不产生代码改动 |
### 批 4 · 并发与验收(3 项)
| 序 | 任务 | 改动点 | 判据 |
|---|---|---|---|
| 4-1 | **双通道并发回归** | 7003 客户端拉帧 + 屏板召唤同时进行 | 两侧画面一致;串口 4208 B 发送期间 7003 不超时;7003 拉帧期间屏板不超时 |
| 4-1 ✅ | **双通道并发回归** | 7003 客户端拉帧 + 屏板召唤同时进行 | **已完成 2026-10-30(真屏板 + 新脚本 `test/host/remolcd_pull_test.py`,7003 侧 INIT→LCDMEM 10 Hz 重压)**:网络侧两轮(150 s / 60 s 隔离窗口)请求应答 **1500/1500 + 700/700、CRC 错 0、超时 0**,往返 min 35 / avg ~63 / max 131 ms(远小于 LCDMEM 应答"最坏 ≈4 s"的口径上限)。屏板侧 60 s 隔离窗口(clear 后开窗,计数只读窗口内):**rx +233 帧全收、`drop` 零新增、`kerr=0 abor=0 bad=0`、`off=0`、无 OFFLINE 行**,`tx` 追平 `rx`(末帧 59.6 ms 采样窗差 1)→ **7003 拉帧期间屏板每召必答**(屏板的 205 ms 超时计数在屏侧看不到,但"每召必答"是其不超时的充分证据)。"两侧画面一致"由机制保证:两出口读**同一份活显存**(`ui_net_sink_get_lcdmem` 与 `sb_link_frame_update` 的入参同为 `ui_port_get_framebuffer()`),无第二份账可漂;目视对图为机会性复核项。⚠ 观察项(不属 4-1 判据):`len=7` 的出现窗口夹在"烧录后冒烟(23:49 时 len=0)"与"第一轮 150 s 重压结束(00:15:26 已 len=7)"之间,**不能排除与首轮重压相关**;但第二轮 60 s 隔离窗口零新增、全程 `crc=0 fmt=0`、有效帧一帧没少(ok 增速与 rx 同频),功能影响为零。挂设计说明观察,若再现再查 |
| 4-2 | **长稳与自复位** | 连续跑 ≥2 h(跨过屏板一次自复位) | 零帧错误、零误判离线、UI 无可见卡顿 |
| 4-3 | **文档收口** | 把实测结论回填 `docs/产品需求/产品需求设计文档.md` §5.16.2(尤其**帧长 4208 vs 3208 那条待复核项**)与 §9.13 | 待复核项清零;§9.13 对应行销项 |
@@ -421,7 +419,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 引出 | **冒烟首通 + 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。状态灯/长稳/时序仪器项仍未测 |
| 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。状态灯已实现(批 3)待目视、双通道并发**已过(4-1,见 `docs/子系统设计/屏板链路设计说明.md` §5.7)**;长稳/时序仪器项仍未测 |
| 5 | 产品形态:按最终线束接法定版 | 线束 | 产品形态验证 |
> 第 2、3 步是**性价比最高的两步**:不用屏板、不用改硬件,就能把 90 % 的软件问题挖出来。
@@ -440,10 +438,10 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
| 帧长按 3208 实现 | 照 readme 写 | CRC 全失败、屏板不亮 | 已写进 §4.2 警示;联调第一步就核 4208 |
| 中断回调漏加分支 | 只改自己模块,忘了那三个全局 UART 回调里唯一的一处实现只分发另一条通道的句柄(§1.3) | 收不到召唤帧,表象像协议错 | 批 1 的 1-3 已列为判据 |
| 屏板自复位被误判离线 | 链路监视窗口设得太小 | 每 83 分钟误报一次 | 判据定为"连续 ≥10 s 无帧" |
| 状态灯语义返工 | 映射表拍脑袋定的 | 后期改表要重测 | 把表做成一张 `const` 数组,改表不改逻辑 |
| 状态灯语义返工 | 映射表拍脑袋定的 | 后期改表要重测 | 表 = `App/algo/sb_led_map.h` 位宏 + 单点 `sb_led_map_eval()`(唯一出处),折算不散落调用点;主机单测钉「掩码 & ~定义集 == 0」,改表漏测会被套件拦住(3-1 落纸时的口径微调:5 路输入判据形态各异——电平/闪烁——const 数组统一不了谓词,纯函数分支更直白) |
| RAM 超门禁 | 误把 RX 缓冲也做成 4208 B | `RW_IRAM1` 逼近 92 % | RX 只要 16 B(§1.3) |
| **整帧被 ISR 切断** | 在任务里轮询发送,中途被采样 / 网口 / 系统节拍 ISR 抢走 ≥2 个字符时间 | 一帧拆两包、两半 CRC 全错;症状只是「画面偶尔不刷新」,而**屏板不报超时** | 决策三:整帧 TX DMA + 中断起发;2-2 判据含「无 28 µs 以上间隙」 |
| **屏板接收溢出后永久静默** | 主机提前发 / 超发 / 叠发,或 LOGO 帧撞上屏板自己的 Flash 写 | 屏板再也收不到,画面与状态灯一起冻死,**它自己毫无指示**,只能断电重上 | 严格一召唤一应答、正好 4208 B;LOGO 只走出厂 / 联调流程(3-3),下发前先确认能给屏板断电 |
| **屏板接收溢出后永久静默** | 主机提前发 / 超发 / 叠发 | 屏板再也收不到,画面与状态灯一起冻死,**它自己毫无指示**,只能断电重上 | 严格一召唤一应答、正好 4208 B(LOGO 出局后总线上不会再有其它帧形态,风险源只剩叠发/提前发,批 2 的 busy 冻结已挡) |
| **把 200 ms 当成「帧作废」线** | 误读屏板那个放弃计时 | 白加一层重试与加急逻辑;或反过来以为迟到无害,撞上 205 ms 的按键召唤 | 屏板真实规则:迟到的完整帧照样显示;**有按键待报时最早 205 ms 就再召唤** → 仍按 ≤200 ms 完成,理由换成「防撞 + 不滞后」(决策三) |
| **按键被当成偶发失灵** | 那一轮窗口被错过 | 屏板的键**只发一次不重试**(发完立刻清备份)→ 该次按键直接丢失 | 起发留在中断里(µs 级);2-3 按「逐键必到」测,不看统计均值 |
| **屏板背光 100 s 熄灭被当成掉线** | 现场长时间没人按键 | 误报链路故障 | 按任意键即复亮;判离线只看召唤帧有无(2-5 的 10 s 窗口) |
@@ -463,16 +461,14 @@ stub 提供 HAL)。屏板侧 CRC 有查表实现,**用同一张表做交叉
5. **双通道并发**:7003 与串口同时跑,互不拖超时、画面一致。
6. **屏板自复位**(≈5000 s)不被误判离线,约 1 s 后自动续上。
7. 拔插屏板:7003 侧不受影响,插回自动恢复,不用复位主机。
8. LOGO 下发后断电重启仍在,且不改变 LED 状态。
8. ~~LOGO 下发后断电重启仍在,且不改变 LED 状态~~ **随 LOGO 出局划掉**(用户裁定 2026-10-29,见批 3 的 3-3)。
**另测三项**(属本方案的实现判据,不在 §5.16.10 编号内):
**另测两项**(属本方案的实现判据,不在 §5.16.10 编号内):
- 逻辑分析仪量整帧发送期间**不得出现 ≥2 个字符时间(约 28 µs)的间隙**——这是断帧安全性的直接证据,
也是必须用 DMA 的理由(决策三);同时记下召唤帧末位到应答首位的实测值,确认 30 µs 的切换留量够用。
- 跑一遍 LOGO 下发(3-3)之后,验证「给屏板断电重上」仍能恢复通信:屏板在写它自己那块 Flash 时若被打断,
- **7003 拥塞时串口侧照常应答**:挂着 7003 客户端不读、或制造对时 / relisten 突发把 `uiTask` 卡住,
屏板侧应**零超时**、画面停在最后一帧(这就是「起发不在任务态」的直接证据);`uiTask` 一醒画面立刻续上、总线无对撞。
可能进入它自己救不回来的状态(它的错误回调与重初始化都被注释掉了)。
---
@@ -44,7 +44,7 @@ uiTask(10 ms 节拍) USART1 空闲中断(屏板召
| `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 |
| `sb_crc16` / `sb_frame_a_parse` / `sb_frame_b_build_image` / `sb_frame_b_build_logo`(⚠ 待删除,LOGO 出局见批 3 的 3-3)/ `sb_frame_b_verify` | 纯逻辑 | 协议层五件套,主机单测 59/59 |
全局回调落点:`HAL_UARTEx_RxEventCallback` / `HAL_UART_ErrorCallback` /
`HAL_UART_TxCpltCallback` 三个的**唯一实现处都在 `rs485.c`**,各含一行
@@ -67,9 +67,16 @@ uiTask(10 ms 节拍) USART1 空闲中断(屏板召
之后每次召唤都被判"上一帧还在发"→ rx 涨 tx 冻结。判据用 `huart->gState != BUSY_TX`。
6. **离线判 10 s 不判 500 ms**:屏板 ≈5000 s 自复位有 ≈1 s 空窗,短窗会把"歇了口气"
判成离线再"恢复",标志反复跳。
7. **LED 掩码暂传 0**:状态灯映射表属批 3;帧结构不变,届时只换 `frame_update` 的实参。
7. **LED 掩码走独立纯逻辑模块折算**(批 3 落地):位定义 + 求值收在 `App/algo/sb_led_map.c/h`
(映射表唯一出处),`uiTask` 每拍现采四路状态源(`prot_elm_active_mask` / `prot_elm_pick_mask` /
`adc_health_flags` / `iec104_serv_link_run`)喂进去,掩码变了帧就重组——复用批 2 的 busy/dirty
机制,无新通路。折算不做成 const 表:5 路输入判据形态各异(电平 4 路 + 心跳 1 路),
纯函数分支比"表 + 谓词回调"直白,且主机单测能钉「掩码 & ~定义集 == 0」。
8. **键 9/10 丢弃留痕**:决策四未裁,先按 `docs/任务规划/屏板链路.md` §4.3 的表把
1/2/3/4/7/8 映射到 `UI_KEY_*`,9/10 出日志不注键。
9. **LOGO 出局**(用户裁定 2026-10-29):不做下发入口。`sb_proto` 的 `sb_frame_b_build_logo()`
与魔数常量**列为待删除**(头文件已挂 ⚠ 勿新增调用);常规图像路径 `info[4..5]` 恒 0,
屏板按普通图分支处理,总线上不会再出现 LOGO 形态——「屏板接收溢出」风险表随之只剩叠发一源。
## 4. 资源占用(实测,`.map` 可复核)
@@ -141,6 +148,26 @@ fb=144 bad=0`;杜邦线噪声形态 `bits=0x02`(NE)每帧 ~1.3 次但数
与帧内容无关),不动就当场对调。产品形态线束定版前,以"rx 计数"为唯一验收口径。
- 两块板各自供电必须接第三根线 GND;只连两根信号线时是浮地,形态同样是彻底收不到。
### 5.7 双通道并发回归(批 4 的 4-1,2026-10-30 00:10~00:18,真屏板在线)
激励脚本 `test/host/remolcd_pull_test.py`(新):INIT(8 B:宽/高/帧字节数,大端)→ LCDMEM
偏移 0 以 **10 Hz** 重压拉整帧 3200 B,逐帧 XOR 校验 + 长度核对。每轮 LCDMEM 在固件侧都是
「uiTask 入队 + 等 netTask 回执」的真往返——这就是"7003 在真实占用 uiTask"的压力形态。
| 侧 | 读数 | 判据 |
|---|---|---|
| 网络侧·第一轮 | 150 s:请求 1500 / 应答 1500、CRC 错 0、超时 0,往返 min 35 / avg 63 / max 88 ms | **串口发送期间 7003 不超时** ✓(4208 B 线上 59.6 ms 与拉帧并行,应答照样 100 % 到手) |
| 网络侧·第二轮 | 60 s 隔离窗口:700 / 700、零错零超时,max 131 ms | 同上,重复性 ✓ |
| 屏板侧·60 s 隔离窗口(日志 clear 后开窗,计数只读窗口内) | rx +233 帧(278 ms/帧节拍精确)、**`drop` 零新增、`kerr=0 abor=0 bad=0`、`off=0`、全程无 OFFLINE**,`tx` 追平 `rx`(末帧 59.6 ms 采样窗差 1) | **7003 拉帧期间屏板每召必答** ✓(屏板 205 ms 超时计数在主机侧看不到,每召必答是其不超时的充分证据) |
| 画面一致性 | 机制证明:两出口读**同一份活显存**(`ui_port_get_framebuffer()` 单点),无第二份账可漂;7003 末帧已 `--dump` 成 PBM/PNG 留档(`ci-artifacts/`,不入库) | 目视对图为机会性复核 |
**观察项(不属 4-1 判据,如实记)**:本轮上电累计 `len=7`(7 次 IDLE 断帧尺寸 ≠ 6)。
出现窗口夹在"烧录后冒烟 23:49(未截 len 字段)"与"首轮重压结束 00:15(已 len=7)"之间,
**不能排除与首轮 150 s 重压相关**;但上一上电周期 10 min 窗(§5.5)`len=0`,同一份固件,
说明非确定性、疑瞬态;第二轮 60 s 隔离窗口**零新增**,且全程 `crc=0 fmt=0`、`ok` 增速与
`rx` 同频——有效帧一帧没少,功能影响为零。若后续再现再查(首查方向:断帧尺寸 7 的那一包
是否伴随 `err` 位——若是 NE 噪声尾巴粘进下一包,属杜邦级线噪的正常形态)。
## 6. 坑账本(都已在代码注释/规划文档留痕,这里只汇总)
1. 中文字面量 → ARMCC `#870-D`(源码无 BOM 按本地代码页解)。日志字面量纯 ASCII。
@@ -164,10 +191,10 @@ fb=144 bad=0`;杜邦线噪声形态 `bits=0x02`(NE)每帧 ~1.3 次但数
| 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 拉帧期屏板不超时 | 无 |
| 8 | **双通道并发**(批 4 的 4-1) | 挂 DTU-RemoteLCD 持续拉帧 + 屏板同时召唤:两侧画面一致、串口发送期 7003 不超时、7003 拉帧期屏板不超时 | ✅ **2026-10-30 实测通过**(§5.7:7003 侧 2200 拉帧零错零超时;屏板侧隔离窗口每召必答、零新增丢弃;画面一致由"同一份活显存"机制保证) |
| 9 | **7003 拥塞时串口照常应答** | 制造 netTask 往返卡顿(对时风暴/客户端不读),屏板侧应零超时、画面停最后一帧——"起发不在任务态"的直接证据 | 无 |
| 10 | **状态灯逐位**(批 3 功能,测随实现走) | 映射表落地后逐位点亮验证、LED 0 不受掩码影响 | 批 3 |
| 11 | **LOGO 断电留存**(批 3 功能) | 下发后重启屏板仍在、LED 不变;完成后追加"LOGO 写 Flash 期间拔线"负路径 | 批 3 |
| 10 | **状态灯逐位**(批 3 已实现,待目视) | ID 1 运行灯 1 Hz 闪(肉眼即见);ID 3 = 挂 104 主站(`test/host/iec104_master.py`)后亮、拆线灭;ID 4 = 拔采样前端后亮、插回灭;**ID 2 / ID 5 在产品构建恒灭**(未标定闭锁,`protect_task.c` 的 VALID 门禁——与屏上"保护动作 N"同一已知口径),要验证这两路得等标准源标定后或临时构建 | 真屏板已就位 |
| 11 | ~~LOGO 断电留存~~ | **随 LOGO 出局划掉**(用户裁定 2026-10-29):不下发 LOGO,`sb_proto` 的 LOGO 组帧函数列为待删除 | — |
| 12 | **键 9/10 语义裁定**(决策四) | 需要产品侧定 RESET/FACTORY 行为,代码已留 unmapped 分支 | 人 |
| 13 | 真屏板 ORE 路径 | 主机侧只能被动等:若某天 `bits` 出现 0x08,看 `rearm` 是否跟涨;台架造不出(CPU 读 DR 太快),已由主机单测按 RM0090 覆盖 | 机会性 |