docs(screenlink): 屏板链路档去「说明」并瘦身,控制台档收编台架日志口
屏板链路设计说明.md -> 屏板链路设计.md(去档名「说明」,与 ADC 节拍 / 运行与自检记录两篇口径一致);控制台单写者日志设计说明.md 同改。 两档并存期间旧名引用 0 残留。 - 屏板链路 §3.2 台架日志口(RS232#1 / CN1 端子 / COM3)移入控制台档 §3.4:日志口的接线属 UART5 控制台通道,不属屏板链路;屏板档只留 「别去 CN1 找 USART1 端子」这句接线防错提示。 - 屏板链路 §7.1 由「根因账本 + 修复前后对比」改写为现状描述:延迟 应答机制表 + 耗时分解表 + 两个计数口径 + 已知边界,40 行压到 24 行。 顺带修正 §8 的错引:原指 `网络自愈架构设计.md` §8(实为「延后项」, 不含 uiTask 内容)改为 §4.1 `net_reconcile_tick`。 - §9.1 增补长稳行(串口日志 2026-11-13 18:31 -> 2026-11-15 21:43, 单次上电 51.2 h:rx=658262 ok=658262、crc/len/fmt/err 全 0、 drop=7 仅启动期、kerr/abor/bad=0、全程 off=0);§9.2 销项三条 (仪器项、2 h 长稳、len=7 观察项),新增「按键通路」一条——51.2 h 日志 keys=0 kq=0 dfok=0 dfold=0,延迟应答在真机上从未执行过。 - 删除 sb_frame_b_build_logo() 及 SB_LOGO_MAGIC_* / SB_SCREEN_W/H 与对应单测(TC-SBPROTO-022/023 全组、024c/024d),组帧入口只剩 sb_frame_b_build_image()。sb_proto 单测 59 -> 45 条,45/45 通过。 - cfg_file.c 出厂模板三条中文字面量改 \uXXXX 转义:消除全量重编时的 4 条 #870-D invalid multibyte character sequence,运行期字节不变, 源码回到纯 ASCII(符合「字符串字面量必须纯 ASCII」)。 验证:keil-build 0 Error 0 Warning;sb_proto 45/45、sb_link 164/164; pre-commit 48 钩子全 Passed;check_doc_links --sections-strict 通过。
This commit is contained in:
+3
-3
@@ -90,13 +90,13 @@ docs/
|
||||
| [`配置文件设计.md`](子系统设计/配置文件设计.md) | `/config.ini` 配置引擎:分层、解析、原子持久化 |
|
||||
| [`网络配置说明.md`](子系统设计/网络配置说明.md) | 网口设置页:IP/掩码/网关,UI 保存即时生效 |
|
||||
| [`系统墙钟时间维护说明.md`](子系统设计/系统墙钟时间维护说明.md) | `sys_clock`:RTC 基准、tick 回绕防护、30 天惰性再基准化 |
|
||||
| [`控制台单写者日志设计说明.md`](子系统设计/控制台单写者日志设计说明.md) | 控制台日志单写者模型(避免多任务交错输出) |
|
||||
| [`控制台单写者日志设计.md`](子系统设计/控制台单写者日志设计.md) | 控制台日志单写者模型(避免多任务交错输出) |
|
||||
| [`运行与自检记录设计.md`](子系统设计/运行与自检记录设计.md) | `/log/*.log` 七类 64B 定长记录、SOE 二进制记录、控制台日志、待机屏与七个记录页 |
|
||||
| [`看门狗设计说明.md`](子系统设计/看门狗设计说明.md) | IWDG(CubeMX 配置)+ 任务心跳位图:选型与超时推导、掩码与埋点、取证机制、验证记录;已台架闭环(V2/V4/V5)。**§11 = 任务级饥饿的诊断方法与 `[PROF]` 实测基线**(诊断沉淀:判读口径、量化归因、三条脆弱点、明确不做的四条) |
|
||||
| [`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) | **IEC 104 上行规约**:IEC 60870-5-104 被控站(TCP 工厂默认 2404)范围/点表(V0.1 有效子集)/链路流程(k/w/t1~t3、总召、COV、遥控两段式、定值)/netTask 接入决策/预算与测试方案;协议核心纯逻辑 + 主机侧纯逻辑单测全栈单测 |
|
||||
| [`屏板链路设计说明.md`](子系统设计/屏板链路设计说明.md) | **屏板串口链路(主机侧,`Drivers/BSP/ScreenLink/`)设计**:链路与角色、USART1 700 kbaud 配置与中断收发、物理接线(含台架日志口与 PC 顶替屏板)、协议实现口径(CRC 字节序 / 整帧 DMA / 时序)、键值与状态灯映射表、资源与耗时、对外接口表、验证状态与未闭环项、坑账本 |
|
||||
| [`屏板链路设计.md`](子系统设计/屏板链路设计.md) | **屏板串口链路(主机侧,`Drivers/BSP/ScreenLink/`)设计**:链路与角色、USART1 700 kbaud 配置与中断收发、物理接线(含台架日志口与 PC 顶替屏板)、协议实现口径(CRC 字节序 / 整帧 DMA / 时序)、键值与状态灯映射表、资源与耗时、对外接口表、验证状态与未闭环项、坑账本 |
|
||||
| [`网络/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 集成点)、调用方契约、设计边界与性能特征 |
|
||||
@@ -159,7 +159,7 @@ docs/
|
||||
|---|---|
|
||||
| [`ADC前端注入验证流程.md`](测试说明/专项验证/ADC前端注入验证流程.md) | **ADC 前端与两片转换器的台架注入验证**(已知电压注入验证的执行侧,实测证据 → `docs/硬件平台/ADC通道映射说明.md` §8.1):两轮——直流轮(注入点清单 / 期望码值表 / 零点·线性·映射·极性·节奏五步,每步自带现场记录表,**一块万用表即可**)、交流轮(幅值/波形/相位/测频/削顶/谐波六轮执行卡);**标定轮已独立成篇** → `docs/测试说明/专项验证/ADC多点标定执行流程.md` |
|
||||
| [`ADC多点标定执行流程.md`](测试说明/专项验证/ADC多点标定执行流程.md) | **UA/IA 多点(5 点)最小二乘标定的执行卡(UN = 零序电压 U0,本台架未接线、本轮不测)**:开工拍板(保护口径 ≤3~5 %、5 点档位 5/10/25/50/100 V 与 0.5/1/1.25/1.5/2 A、抬压逐点确认纪律、继保仪 ≥0.1 级)→ `meas:` 行读数按「每行一个点」填进文档内 `CALDATA` 长表(5 点 × 3 路)→ `test/host/cal/cal_fit.py --from-doc` 在 **PC 侧**批量做最小二乘求解(亦支持 `--sem/--x/--y` 单路手填;**固件里没有拟合代码**,设备只做折算与写入参数合法带校验)→ `test/host/cal/cal_write.py` 经 104 定值段 0x8050~/0x8048~ 写入置 VALID 自动落盘 → 两路 VALID 置位;保护仍闭锁(UN 缺)(解卡时序红线与回写位置都在卡里);判据属主 `docs/算法/采集与算法层设计说明.md` §13.13 与 `docs/硬件平台/ADC通道映射说明.md` §7.2;**2026-11-12 实跑结果**(两点算法那一轮:UA / IA 已标定、UN 未标 → 保护仍闭锁)登记在 `docs/硬件平台/ADC通道映射说明.md` §7.3 |
|
||||
| [`启动日志原子性复验流程.md`](测试说明/专项验证/启动日志原子性复验流程.md) | **控制台整行独占 / 崩溃遗言原子性**这类**行级完整性**判据的固定动作与口径(`docs/子系统设计/控制台单写者日志设计说明.md` 的验收侧:那边讲怎么修,这边讲怎么证明修好了、以及为什么"标记全中"不等于"日志没坏") |
|
||||
| [`启动日志原子性复验流程.md`](测试说明/专项验证/启动日志原子性复验流程.md) | **控制台整行独占 / 崩溃遗言原子性**这类**行级完整性**判据的固定动作与口径(`docs/子系统设计/控制台单写者日志设计.md` 的验收侧:那边讲怎么修,这边讲怎么证明修好了、以及为什么"标记全中"不等于"日志没坏") |
|
||||
| [`故障录波板级到场轮执行手册.md`](测试说明/专项验证/故障录波板级到场轮执行手册.md) | **录波剩余台架判据的执行手册**(判据属主是 `docs/子系统设计/故障录波设计说明.md` §10,这里只写"人做什么、说哪句话、会看到什么"):四幕(枚举埋点修复 / 注量对表 / 保护触发对时刻(src=P)含两个用户决定 / bench 自抓占卷)各自标清到场与否,配到场检查清单、现场记录表与收工还原清单 |
|
||||
| [`链路延迟测试说明.md`](测试说明/专项验证/链路延迟测试说明.md) | 网络链路时延分段定义、判定基线、执行流程 |
|
||||
| [`模拟器差距清单.md`](测试说明/专项验证/模拟器差距清单.md) | **PC 模拟器 vs 真机差距登记册**(保护判据门禁可信度依据;改动涉及网络/日志/硬件层前必查 §3 决策规则) |
|
||||
|
||||
+11
-11
@@ -191,7 +191,7 @@ flowchart LR
|
||||
|---|---|---|
|
||||
| 平台能力台架验收 | 网络/存储/时间/UI/日志/看门狗/FTP/配置 全部闭环 | ✅ 已达成(§10.4) |
|
||||
| 采集主线到业务出口 | 采样→相量→测频→遥测快照→判据→104/UI 全链路数据同源 | ✅ 软件链路闭环;判据等标定(§9.1.1) |
|
||||
| 屏板独立带屏 | 串口通道交付并台架验收 | ✅ 主机侧交付(§5.16;尾巴见屏板链路设计说明 §9.2) |
|
||||
| 屏板独立带屏 | 串口通道交付并台架验收 | ✅ 主机侧交付(§5.16;尾巴见屏板链路设计 §9.2) |
|
||||
| 送检就绪 | 多点标定 → 保护解卡 → 第三方主站验收 | ⬜ 等标准源与端子变比(§9.2 第 4/5 步) |
|
||||
| 复刻完成 | 复刻明细各项达"做完了"口径 | 🔶 见 [`参考产品复刻明细.md`](参考产品复刻明细.md) §1.2 |
|
||||
|
||||
@@ -840,7 +840,7 @@ CRC-16/MODBUS(多项式 `0xA001` 反转式、初值 `0xFFFF`、查表法),
|
||||
> ⚠ **帧长以代码为准:4208 B**(屏板 readme 与 `BMP_LEN` 写的"3208 字节"不作准):接收侧实参是
|
||||
> `Check_CRC(DR, UART_RX_LEN)`,`UART_RX_LEN = 4208` → CRC 取 `DR[4206]/DR[4207]`、覆盖 `DR[0..4205]`。
|
||||
> 有效载荷只有前 3208 B,其后 998 B 为凑齐 CRC 窗口的填充;**主机只发 3210 B 时屏板会在
|
||||
> `DR[4206]` 读到陈旧字节,CRC 必失败并静默丢弃**。**已台架与真屏板实测固化**(屏板出图 = 端到端证据,`docs/子系统设计/屏板链路设计说明.md` §9.1)。
|
||||
> `DR[4206]` 读到陈旧字节,CRC 必失败并静默丢弃**。**已台架与真屏板实测固化**(屏板出图 = 端到端证据,`docs/子系统设计/屏板链路设计.md` §9.1)。
|
||||
|
||||
> ⚠ **应答帧不是合法 Modbus RTU 响应**:没有地址、没有功能码、没有字节数域,是一段裸二进制块。
|
||||
> 因此**不能套用现成 Modbus 从站栈**,只能按上表手工组帧。
|
||||
@@ -877,7 +877,7 @@ CRC-16/MODBUS(多项式 `0xA001` 反转式、初值 `0xFFFF`、查表法),
|
||||
ISR 抢占,一抢就撞第 1 条,而后果在屏板侧完全不可见。时间预算 4208 × 10 bit ÷ 705 882 ≈ **59.6 ms**
|
||||
(按标称 700 000 算是 60.1 ms),占 280 ms 周期约 21 %;「≤200 ms 内发完」仍是我们对自己的要求——
|
||||
理由是**不与下一轮召唤撞总线、不多一轮画面滞后**,不是因为屏板会把迟到的帧判废。宿主与起发方式见
|
||||
`docs/子系统设计/屏板链路设计说明.md` §1(`uiTask` 组帧 + USART1 空闲中断点 DMA 起发)。
|
||||
`docs/子系统设计/屏板链路设计.md` §1(`uiTask` 组帧 + USART1 空闲中断点 DMA 起发)。
|
||||
|
||||
**主机侧端口重排(2026-10-28 用户裁定)**
|
||||
|
||||
@@ -885,7 +885,7 @@ ISR 抢占,一抢就撞第 1 条,而后果在屏板侧完全不可见。时
|
||||
|---|---|---|---|
|
||||
| **USART1** | PA9 / PA10 | 调试口 + **U5 直连 TTL**(ST_TX0/RX0),**MCU 直出、不经任何收发器** | ✅ **屏板链路**(700 kbaud) |
|
||||
| **USART2** | PD5 / PD6 | **RS232#3**(U10 隔离 → U13 TPT3232E → CN1) | 已初始化、固件未占用(日志最终选了 UART5) |
|
||||
| UART5 | PC12 / PD2 | **RS232#1**(U9 隔离 → U13 → CN1) | ✅ **调试日志**(115200,已迁移、台架在用;端子见 `docs/子系统设计/屏板链路设计说明.md` §3.2) |
|
||||
| UART5 | PC12 / PD2 | **RS232#1**(U9 隔离 → U13 → CN1) | ✅ **调试日志**(115200,已迁移、台架在用;端子见 `docs/子系统设计/控制台单写者日志设计.md` §3.4) |
|
||||
| UART4 | PC10 / PC11,DE = **PA15** | **RS485#4**(U11 隔离 → U15 → A/B → CN1) | 冻结簇,本项不碰 |
|
||||
| USART3 | P第三方送检验收 / PB11 | U5 直连 TTL(ST_TX2/RX2) | 空闲 |
|
||||
|
||||
@@ -1149,9 +1149,9 @@ for (i = 1; i < LED_COUNT; i++) /* LE
|
||||
| 8 | 键值集(网络通道) | 8 键(含 F1 / F2) | 6 键(无 F1 / F2) | 补 F1 / F2;**仅网络通道**——屏板无 F1/F2 物理键(§5.16.3 ②) |
|
||||
| 9 | 任务模型 | 独立任务 prio 111 / 栈 212 KB | `uiTask` 10 ms 轮询(prio BelowNormal / 16 KB) | **形态差异,不追平**(X1 / X2) |
|
||||
| 10 | 接收侧 CRC | 仅 LCDMEM / KEY 校验 | 全帧校验 | **本产品更严,保留** |
|
||||
| 11 | **串口屏板通道** | **有**:显存 3200 B + 状态灯 4 B 下行、键号上行,变化驱动 + 500 ms 兜底 | **已交付**:700000 8N1、一召一答 4208 B、键号上行(docs/子系统设计/屏板链路设计说明.md) | 验收尾巴见该设计说明 §9.2 |
|
||||
| 12 | 双出口并发 | 同一份显存同时喂串口与网络,互不阻塞 | 两出口并存(7003 + 串口通道),60 s 并发台架无互扰 | —(屏板链路设计说明 §9.1) |
|
||||
| 13 | 屏板状态指示灯 | 20 路(ID 0 电源常亮 + ID 1~19 位掩码),**4 B 小端**随每帧下发 | **已交付**:5 位映射 `App/algo/sb_led_map.h`(屏板链路设计说明 §6);主板另有 6 路 GPIO LED(`LED1~6`) | 逐位目视验收未闭环(设计说明 §9.2) |
|
||||
| 11 | **串口屏板通道** | **有**:显存 3200 B + 状态灯 4 B 下行、键号上行,变化驱动 + 500 ms 兜底 | **已交付**:700000 8N1、一召一答 4208 B、键号上行(docs/子系统设计/屏板链路设计.md) | 验收尾巴见该设计说明 §9.2 |
|
||||
| 12 | 双出口并发 | 同一份显存同时喂串口与网络,互不阻塞 | 两出口并存(7003 + 串口通道),60 s 并发台架无互扰 | —(屏板链路设计 §9.1) |
|
||||
| 13 | 屏板状态指示灯 | 20 路(ID 0 电源常亮 + ID 1~19 位掩码),**4 B 小端**随每帧下发 | **已交付**:5 位映射 `App/algo/sb_led_map.h`(屏板链路设计 §6);主板另有 6 路 GPIO LED(`LED1~6`) | 逐位目视验收未闭环(设计说明 §9.2) |
|
||||
| 14 | 背光 / 对比度 | 主机 BSP 有 `Lcd_BackLight` / `Lcd_SetContrast` + 空闲 120 s 熄灭 | 无 | **不做**——屏板固件自管背光,两条路径不能同时启用 |
|
||||
|
||||
**来自屏板固件的新增约束(参考主机侧源码里看不出来,但对实现是硬约束)**:
|
||||
@@ -1168,7 +1168,7 @@ for (i = 1; i < LED_COUNT; i++) /* LE
|
||||
> 注意:**16 B 与参考的 29 B 不是同一口径**——客户端**不得**按 29 B 预留缓冲再截取前 16 B 使用
|
||||
> (**从偏移 4 起含义即不同**:参考偏移 4 是颜色位,本产品偏移 4 是显存大小的高字节)。
|
||||
>
|
||||
> 第 11 / 12 / 13 条(串口通道三件套)**主机侧已交付**(docs/子系统设计/屏板链路设计说明.md)——本产品已可脱离 PC 独立带屏运行;仍开放的是第 2~9 条(7003 网络通道报文口径)。
|
||||
> 第 11 / 12 / 13 条(串口通道三件套)**主机侧已交付**(docs/子系统设计/屏板链路设计.md)——本产品已可脱离 PC 独立带屏运行;仍开放的是第 2~9 条(7003 网络通道报文口径)。
|
||||
>
|
||||
> 第 14 条**已决定不做**:屏板固件自管背光与超时熄灭,主机再插一手会打架。
|
||||
|
||||
@@ -1315,7 +1315,7 @@ mac=00:00:00:00:00:00
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| 端口 | UART5(RS232#1:PC12 TX / PD2 RX,经 U9 隔离 → U13 → CN1 端子),115200 8N1;台架端子接法见 `docs/子系统设计/屏板链路设计说明.md` §3.2 |
|
||||
| 端口 | UART5(RS232#1:PC12 TX / PD2 RX,经 U9 隔离 → U13 → CN1 端子),115200 8N1;台架端子接法见 `docs/子系统设计/控制台单写者日志设计.md` §3.4 |
|
||||
| 用途 | printf 日志 + `/serial-boot-test` 采集通道 |
|
||||
| 配置源 | `.serialtest/config.json`(单一配置源) |
|
||||
| 工具 | 仓库内置 Python 串口助手(`.dsh/skills/serial-assistant/`,常驻 daemon + CLI) |
|
||||
@@ -1687,7 +1687,7 @@ pre-commit run --all-files
|
||||
| **SNTP 对时** | 17 | 参考对时走 SNTP | **SNTP 客户端已落地**(2026-11-04:coreSNTP 序列化器 + `[sntp]` 配置 + UI 设置页 + timeSyncTask 接入,判据 §5.3 FR-TIME-3);另有 104 `C_CS`(私有 TCP 8888 已随 #78 退役删除) | 台架真机对时判据(现场时间源,见 `docs/子系统设计/系统墙钟时间维护说明.md` §16) |
|
||||
| **固有参数** | 1 | `8001H~800AH` 字符串类参数 | 未实现(无法短浮点上送) | 随送检点表设计 |
|
||||
| **遥测增强** | 4、5 | k=1~9 谐波方和根 + 4 点平均 | 仅基波轨 | 谐波 / 等周波调频 / 零序自产外接切换 三条算法轨 |
|
||||
| **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / USART1 TTL 直连、无 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | **串口通道已交付**(4208 B 应答 / 状态灯掩码 / 键上行 / 双出口并发,屏板链路设计说明 §9.1);7003 四命令(INIT **8 B**);无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 7003 报文口径 6 项(`参考产品复刻明细.md` §11 第 2~9 条);串口侧验收尾巴见屏板链路设计说明 §9.2 |
|
||||
| **屏板链路对齐** | 20 | **串口屏板通道**(**700000 8N1 / USART1 TTL 直连、无 DE**,帧 A 6 B 召唤、帧 B **4208 B** 应答:显存 3200 B + **状态灯 4 B 位掩码** + 4 B info)+ **7003 四命令**(INIT **16 B**,单色口径)+ 续传 / 拒绝握手 / 链路监视 / F1·F2 | **串口通道已交付**(4208 B 应答 / 状态灯掩码 / 键上行 / 双出口并发,屏板链路设计 §9.1);7003 四命令(INIT **8 B**);无续传、无 `bNeedFlash` 拒绝、无 1 分钟监视、键值 6 个 | 7003 报文口径 6 项(`参考产品复刻明细.md` §11 第 2~9 条);串口侧验收尾巴见屏板链路设计 §9.2 |
|
||||
|
||||
> **一句话**:**「标定闭锁」是唯一"再排期也没用"的缺口**(等标准源);「出口与开入」「三相与同期」
|
||||
> 「电度计量」等 V0.2 硬件;「对下采集」等用户决策;其余规模型条目**全部可在现有硬件上推进**,
|
||||
@@ -1809,7 +1809,7 @@ pre-commit run --all-files
|
||||
| 网络配置 | [`docs/子系统设计/网络配置说明.md`](../../docs/子系统设计/网络配置说明.md) |
|
||||
| 墙钟时间 | [`docs/子系统设计/系统墙钟时间维护说明.md`](../../docs/子系统设计/系统墙钟时间维护说明.md) |
|
||||
| 运行/自检记录 | [`docs/子系统设计/运行与自检记录设计.md`](../../docs/子系统设计/运行与自检记录设计.md) |
|
||||
| 控制台单写者日志 | [`docs/子系统设计/控制台单写者日志设计说明.md`](../../docs/子系统设计/控制台单写者日志设计说明.md) |
|
||||
| 控制台单写者日志 | [`docs/子系统设计/控制台单写者日志设计.md`](../../docs/子系统设计/控制台单写者日志设计.md) |
|
||||
| 看门狗 | [`docs/子系统设计/看门狗设计说明.md`](../../docs/子系统设计/看门狗设计说明.md) |
|
||||
| BSD Socket API | [`docs/网络/BSD_Socket_API_使用指南.md`](../../docs/网络/BSD_Socket_API_使用指南.md) |
|
||||
| Net 层阻塞模型 | [`docs/网络/Net层阻塞模型架构设计.md`](../../docs/网络/Net层阻塞模型架构设计.md) |
|
||||
|
||||
@@ -165,7 +165,7 @@ tTimer_NoUI 无压无流判据(CN_
|
||||
| **外部资源**(标准源、端子变比) | 定值标定、保护判据解卡 | 多点标定(需求档 §9.2 第 4 步) |
|
||||
| **硬件缺失**(X3 / X4) | 开入 138、开出 31、电度 8、同期、三相通道 | V0.2 硬件 |
|
||||
| **立项未排** | 多规约、SNTP、定值铺开 | 按需求档 §9.2 顺序。**录波最小闭环已交付代码面**(2026-10-29,设计与板级判据 `docs/子系统设计/故障录波设计说明.md` §10;原卡片 2026-10-30 销项并入后删除;1 kHz 起步与本文 80 点/周波口径的偏离在该设计文档 §2 显式登记);**4 kHz 全速、多段、COMTRADE、104 文件传输仍未排**,属二期范围 |
|
||||
| **算力 / 形态**(X1 / X2) | 双核分工、VxWorks | 不解除。**屏板链路已从范围外项移入范围内**(规格见需求档 §5.16,主机侧实现 `docs/子系统设计/屏板链路设计说明.md`;串口通道已实现,网络通道未做):主机侧链路与参考 1:1 同构,不属"替代方案" |
|
||||
| **算力 / 形态**(X1 / X2) | 双核分工、VxWorks | 不解除。**屏板链路已从范围外项移入范围内**(规格见需求档 §5.16,主机侧实现 `docs/子系统设计/屏板链路设计.md`;串口通道已实现,网络通道未做):主机侧链路与参考 1:1 同构,不属"替代方案" |
|
||||
|
||||
> **结论**:本产品与参考产品的差距**全部是"进度"而非"范围"**——没有一项是"参考有而我们不做"。
|
||||
> 已对齐的是**软件骨架**(采样节拍、相量算法、定值模型、104 上行、SOE 落盘、自检闭锁);
|
||||
@@ -745,7 +745,7 @@ tTimer_NoUI 无压无流判据(CN_
|
||||
> 串口用裸二进制 + CRC-16/MODBUS),不能共用组帧代码。
|
||||
>
|
||||
> **实现事实另立**:主机侧的接线、串口配置、协议实现口径、验证状态与未闭环项在
|
||||
> `docs/子系统设计/屏板链路设计说明.md`;本节只保留**需求视角**的缺口与顺序,不复制实现细节。
|
||||
> `docs/子系统设计/屏板链路设计.md`;本节只保留**需求视角**的缺口与顺序,不复制实现细节。
|
||||
|
||||
| 序 | 任务 | 改动点 | 判据 | 跨端 |
|
||||
|---|---|---|---|---|
|
||||
@@ -788,14 +788,14 @@ tTimer_NoUI 无压无流判据(CN_
|
||||
>
|
||||
> **第三批状态**:串口通道(第 10~14、16 条)主机侧已实现并经台架与真屏板验收,屏板实物已上台架;
|
||||
> 帧长**已固化 4208 B**(代码实参为准,屏板 readme 的 3208 B 不作数——真屏板出图为端到端证据)。
|
||||
> 未闭环项(2 h 长稳、仪器项等)见 `docs/子系统设计/屏板链路设计说明.md` §9.2;**网络通道(第 2~9 条)未开工**。
|
||||
> 未闭环项(2 h 长稳、仪器项等)见 `docs/子系统设计/屏板链路设计.md` §9.2;**网络通道(第 2~9 条)未开工**。
|
||||
>
|
||||
> **一条物理前置(已完成 2026-10-29)+ 一条实现纪律**:
|
||||
> ① **台架串口线已挪位**——日志口迁到 RS-232 侧后,台架那根线改接 CN1 的 RS232#1 端子
|
||||
> (`CN1.10` 接适配器 TXD、`CN1.12` 接适配器 RXD、`CN1.7` 或 `CN1.8` 接 GND),台架日志口
|
||||
> 因此由 `COM6` 变为 **`COM3`**,`.serialtest/config.json` 的 `portName` 已同步,`/serial-boot-test` 与
|
||||
> `serial-assistant` 不必再手工指端口。这些端子是 **RS-232 电平**,TTL 的 CH340 直连不了,
|
||||
> 用的是 USB 转 RS-232 适配器;接法与端子出处见 `docs/子系统设计/屏板链路设计说明.md` §3.2。
|
||||
> 用的是 USB 转 RS-232 适配器;接法与端子出处见 `docs/子系统设计/控制台单写者日志设计.md` §3.4。
|
||||
> **这条要在第 16 条动代码之前完成。**
|
||||
> ② **RX 要真的读、ORE 要真的清**——PA10 一直是接线的(需求档 §5.16.2),
|
||||
> 但"RX 使能却不读 `DR`"本身就足以让 ORE 永久锁存。第 11 条实现时必须在
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
# 屏板链路设计说明(主机侧)
|
||||
# 屏板链路设计(主机侧)
|
||||
|
||||
> **模块**:`Drivers/BSP/ScreenLink/`(`sb_proto` 协议层 + `sb_link` 传输层)· `App/algo/sb_led_map`(状态灯折算)· `App/task/ui_task.c`(宿主)。
|
||||
> **需求与屏板侧契约**(这条链路要做什么、屏板行为逐字节)在 `docs/产品需求/产品需求设计文档.md` §5.16,本文不重抄其表;
|
||||
> 本文是**主机侧实现事实**:接线、串口配置、协议口径、键/灯映射、资源、验证状态与未闭环项。
|
||||
> 台架日志口(UART5/RS232#1/CN1 端子)不属本链路,见 `docs/子系统设计/控制台单写者日志设计.md` §3.4。
|
||||
> **屏板固件事实源**:外部工程 `DTU-LCD`(不在本仓,本链路不改它)。
|
||||
|
||||
## 1. 链路与角色
|
||||
@@ -56,7 +57,7 @@ flowchart TB
|
||||
| 错误处理 | 按 **SR → DR 顺序**清 ORE/NE/FE/PE;**重挂判据用 `RxState == READY` 而非错误位**(ORE 阻塞型须重挂,NE/FE 非阻塞、接收还在跑,再挂只拿 `HAL_BUSY`);TX 被错误打断时按 `gState != BUSY_TX` 清残留 busy | ORE 锁存 = 接收再也进不来;残留 busy = 之后每次召唤都被判"上一帧还在发"→ rx 涨 tx 冻结 |
|
||||
| 链路监视 | `rx_ok` 计数 **≥10 s 不前进 → 判离线**(`SB_LINK_OFFLINE_MS`),恢复由下一次有效召唤;5 s 统计行只在计数有变化时打 | 屏板 ≈5000 s 自复位有 ≈1 s 空窗,按 500 ms 判会把"歇口气"判成离线反复跳;屏板无背光 100 s 熄灭也**不是**掉线(按键即复亮) |
|
||||
|
||||
## 3. 物理接线
|
||||
## 3. 屏板接线
|
||||
|
||||
### 3.1 主机 ↔ 屏板(TTL 直连,PA10 已接线、无需飞线)
|
||||
|
||||
@@ -74,15 +75,7 @@ flowchart TB
|
||||
CN1 上的 `RS232_*` 是 UART5 / USART2 经收发器之后的电平。同一个 `U5` 上还挂着 USART3 的 `ST_TX2` / `ST_RX2`
|
||||
(`U5.C7` / `U5.C6`),别抓错针。3.3 V TTL 直连,不串电阻,没有方向控制脚可接。
|
||||
|
||||
### 3.2 台架日志口(RS232#1)
|
||||
|
||||
- 台架须用 **USB 转 RS-232 适配器**(TTL 的 CH340 直连不了,且 RS-232 的 ±电平可能打坏 `U13` TPT3232E 或适配器):
|
||||
适配器 `TXD` → `CN1.10`(板子 `RS232_RX1`)、`RXD` → `CN1.12`(板子 `RS232_TX1`)、`GND` → `CN1.7` 或 `CN1.8`(`CGND`)。
|
||||
- 台架串口因此是 **`COM3`**,`.serialtest/config.json` 的 `portName` 已按此配置,`/serial-boot-test` 与 `serial-assistant` 不必手工指端口。
|
||||
- RS232#1 **没有 TTL 出口**(`ST_TX1`/`ST_RX1` 只连 `U9` 隔离器与 MCU),唯一外部出口是 CN1 的 RS-232 端子;
|
||||
`U14` 是 RS232#3 的网口座,本通道用不上。
|
||||
|
||||
### 3.3 PC 顶替屏板(无屏板实物的台架验证)
|
||||
### 3.2 PC 顶替屏板(无屏板实物的台架验证)
|
||||
|
||||
- USB 转 TTL 适配器:`TXD` → `U5.B10`、`RXD` → `U5.A10`、`GND` → 板地;700000 8N1;
|
||||
激励脚本 `test/host/screenlink_bench.py` 按屏板节拍发 6 B 帧 A(`--key-fixed` 持续改画面取组帧样本、
|
||||
@@ -102,8 +95,8 @@ flowchart TB
|
||||
- **帧 B 正好 4208 B**:3200 显存 + 4 B 灯掩码(小端)+ `info[4] = info[5] = 0x00`(普通图分支)+ `info[6..7]` 保留 +
|
||||
**998 B 填充固定 `0x00`(屏板不读但参与 CRC)** + 2 B CRC。短一字节屏板就在 `DR[4206]` 读到陈旧字节 → CRC 必失败
|
||||
静默丢弃;多发会把它正在处理的那一帧撕裂(收满即回调、缓冲从头再填)。
|
||||
- **LOGO 形态不实现、不下发**(出局):总线上不会出现 `info[4..5] = 0x89 0x45` 的帧;`sb_proto` 里既有的
|
||||
`sb_frame_b_build_logo()` 与魔数常量为待删除遗留(§9.2),勿新增调用。
|
||||
- **LOGO 形态不实现、不下发**(出局):总线上不会出现 `info[4..5] = 0x89 0x45` 的帧。组帧入口只剩
|
||||
`sb_frame_b_build_image()` 一个,`info[4..7]` 恒为 0;LOGO 组帧函数与魔数常量已从 `sb_proto` 删除。
|
||||
- **组帧**(`sb_link_frame_update`,uiTask 每拍):拿帧缓冲里的点阵段与活显存 memcmp,变了才组 + `sb_frame_b_verify`
|
||||
自校验,不过不置 ready(宁可不发旧帧)。**不留显存影子副本**(省 3200 B SRAM 与每拍重算 CRC,代价只是每拍一次
|
||||
~20 µs 的 memcmp)。**TX DMA busy 期间冻结帧缓冲**:DMA 读的就是 `s_frame` 本体,中途改写会发出半新半旧的"脏帧"
|
||||
@@ -129,7 +122,7 @@ flowchart TB
|
||||
`BSP_OK` 后交 `sb_link_key_rendered()` 凭据;TIM3 1 kHz 的 `sb_link_ms_tick()` 见凭据即起发**带键的新帧**。
|
||||
扣满 140 ms 保底发旧帧(140 + 59.6 线上 ≈ 199.6 ms < 205 ms 屏板放弃线,「一召一答」不破);线忙则同旧丢单、
|
||||
**不留扣件**(扣一个没人应答过的召唤 = 之后凭空多发一帧)。起发从此**两个中断源**(IDLE 直答 + TIM3 放行),
|
||||
`sb_tx_kick()` 的"判忙→占位"在 PRIMASK 临界区原子完成——交错起发 = 线上中段叠帧。完整延迟账本见 §7.1。
|
||||
`sb_tx_kick()` 的"判忙→占位"在 PRIMASK 临界区原子完成——交错起发 = 线上中段叠帧。机制与耗时分解见 §7.1。
|
||||
|
||||
## 5. 键值映射(帧 A `key` → `UI_KEY_*`)
|
||||
|
||||
@@ -177,41 +170,32 @@ flowchart TB
|
||||
| 组帧耗时 | **509 µs 典型 / 812 µs 峰值,预算 ≤1 ms**;没变只付 memcmp ≈20 µs | 台架 `us=` / `max=` 字段 |
|
||||
| 耗时结构 | ≈480 µs 全在 CRC:每帧算满 4206 B,168 MHz 查表 ≈19~20 周期/字节,512 B 表驻 Flash(5 等待周期);清零+拷贝只 ≈20 µs。**占空比无约束**:一帧 280 ms ≈0.2 %,3.5 帧/s ≈0.17 % CPU | 压降两条路已评估**未实施**:表搬 SRAM(≈ −125 µs,+512 B SRAM)、998 B 零段 GF(2) 推进变换(≈ −89 µs,需长期维护矩阵代码)——这个占空比换不来收益;另循环变量用 `uint32_t` 防 ARMCC 每轮多一条 `UXTH`(`sb_crc16`) |
|
||||
|
||||
### 7.1 按键反馈延迟:根因账本与 2026-10-30 修复(延迟应答)
|
||||
### 7.1 按键应答:延迟应答机制
|
||||
|
||||
**背景**:用户报告真机 LCD 与模拟器按键反馈都慢(按下→看到画面变化)。模拟器插桩实测
|
||||
(SDL 事件→键回调→REFR_READY,40 键)内部路径 **avg 0.68 ms / max 1.2 ms**——窗口自身的
|
||||
代码路径不是量级来源;若现场 SDL 窗口仍感觉慢,剩余候选是旧构建 / vsync 呈现 /
|
||||
远端查看器(7003 路径),另行取证。**真机的慢是结构性的**,账本如下。
|
||||
按键召唤**不立刻应答**:本答扣住,等主机把按键画进新帧再发。周期召唤照旧直答。
|
||||
|
||||
**修复前(2026-10-29 基线)的账**:键 → 屏板扫描(外部,ms 级)→ 帧 A 立刻发出(屏板按键不等
|
||||
周期轮)→ 主机 IDLE 中断入队并**立刻起发当前帧**——可此刻 `uiTask` 还没消化这个键(10 ms
|
||||
节拍 + 渲染地板 61.3 ms 占住,见 §7 表)→ **这一答发出去的是按键之前的画面(白发)**;
|
||||
新内容只能随下一次召唤带出。三个结构性主因:①键召唤答旧帧;②`uiTask` FULL 整屏渲染地板
|
||||
61.3 ms;③召唤周期 ~275-280 ms(带键最早 205 ms)。放大器④:远端查看器在连时
|
||||
`ui_net_sink_poll()` 可阻塞到秒级(7003 解耦专项,本轮只裁案不做)。
|
||||
典型 **~250-450 ms**、最坏 **~500 ms**;④ 发作时秒级。
|
||||
| 环节 | 现状 |
|
||||
|---|---|
|
||||
| 收按键(IDLE 中断) | 帧 A 校验通过后按键入 `ui_port` 注键环(**8 深**,满丢最旧并计数),只入队、不起发 |
|
||||
| 起发凭据 | `uiTask` 本拍排空注键环 + `ui_port_service_keys()`(立刻 `lv_indev_read` + `lv_refr_now`)→ 组帧成功 → `sb_link_key_rendered()` |
|
||||
| 放行 | TIM3 1 kHz 的 `sb_link_ms_tick()` 见凭据即起发带键的新帧(`dfok` +1),延迟 ≤1 ms |
|
||||
| 截止(`SB_KEY_RESP_MAX_MS = 140`) | uiTask 被饿满 140 ms 仍未交凭据 → 发当前帧保底(`dfold` +1)。140 + 59.6 线上 ≈ 199.6 ms < 205 ms 屏板放弃线,「一召一答」不破 |
|
||||
| 起发闸门 | 起发有 IDLE 直答与 TIM3 放行两个中断源,`sb_tx_kick()` 内 PRIMASK 临界区原子占位;线忙则丢单(`drop`),屏板重问即恢复 |
|
||||
|
||||
**修复后(2026-10-30,用户裁定三处全做)**:
|
||||
**耗时分解**(召唤 → 屏板显示):
|
||||
|
||||
| 面 | 改动 | 省掉 |
|
||||
| 段 | 量值 | 说明 |
|
||||
|---|---|---|
|
||||
| **延迟应答(核心)** | IDLE 中断收按键召唤 → 只入队、**扣住本答不发**;`uiTask` 本拍排空注键 + `ui_port_service_keys()`(立刻 `lv_indev_read`+`lv_refr_now`,各省一个 ≤20 ms 的 LVGL 定时轮)+ 组帧 OK 后交 `sb_link_key_rendered()` 凭据;TIM3 1 kHz 的 `sb_link_ms_tick()` 见凭据即起发**带键的新帧** | 整轮"答旧帧"≈140-280 ms |
|
||||
| 闸门 | 起发从此**两个中断源**(IDLE 直答 + TIM3 放行)→ `sb_tx_kick()` 内 PRIMASK 临界区原子占位;交错起发 = 叠发毁帧,闸必须有 | — |
|
||||
| 截止 | `SB_KEY_RESP_MAX_MS = 140`:uiTask 饿死(对时 reconcile 突发那类)扣满即发旧帧保底——140 + 59.6 线上 ≈ 199.6 ms < 205 ms 屏板放弃线,「一召一答」不破;线忙则同旧丢单不留扣件 | 协议安全边界不动 |
|
||||
| 注键环 | `ui_port` 注键从单槽改 **8 深环**(满丢最旧+计数)——连按不覆盖 | 连按丢键 |
|
||||
| 渲染收窄 | `view_apply_sel()` 选中移动且滚动未变时只 invalidate **两行带**(旧选中行+新选中行),整框 invalidate 退为滚动/首刷兜底 | 选中移动类的整屏重绘(61.3 ms 地板页里的大头) |
|
||||
| 模拟器 | 主循环 sleep 扣掉本轮实际耗时(旧代码在 `lv_refr_now` 前算 sleep_ms,每轮多睡一段工作量) | 每轮一段过冲 |
|
||||
| 召唤 → 下一拍 uiTask | ≤10 ms | 10 ms 节拍 |
|
||||
| 注键 + 重绘 | 选中移动几 ms;换页地板 61.3 ms | `view_apply_sel()` 选中移动且滚动未变时只 invalidate 两行带,整框 invalidate 退为滚动 / 首刷兜底 |
|
||||
| 组帧 | 典型 509 µs / 峰值 812 µs | 见上表 |
|
||||
| 放行 | ≤1 ms | TIM3 节拍 |
|
||||
| 线上 | 59.6 ms | 4208 B @ 700 kbaud |
|
||||
| **典型合计** | **≈70–135 ms** | uiTask 饿死场景 ≈200 ms 保底发旧帧 |
|
||||
|
||||
**修复后的账**:召唤 → 下一拍 ≤10 ms → 注键+重绘(收窄后选中移动为几 ms 级;页面地板仍
|
||||
61.3 ms)→ 组帧 ~0.5 ms → 放行 ≤1 ms → 线上 59.6 ms → **典型 ~70-135 ms**(修复前
|
||||
250-450 ms);uiTask 饿死场景 **~200 ms 保底发旧帧**(修复前同场景秒级且白发一帧)。
|
||||
统计口径:TX 上报行新增 `dfok=`(新帧放行次数)与 `dfold=`(扣满 140 ms 发旧帧次数——
|
||||
**dfold 在涨 = uiTask 被饿 ≥140 ms 的直接证据**,与网络自愈架构设计 §8 的 reconcile 突发饿死 uiTask 一条对拍)。
|
||||
**可观测**:`[SBLINK]` 统计行 `dfok=` 新帧放行次数、`dfold=` 扣满 140 ms 发旧帧次数。**`dfold` 在涨 = uiTask 被饿 ≥140 ms 的直接证据**(对时 reconcile 突发那类,见 `docs/网络/网络自愈架构设计.md` §4.1 `net_reconcile_tick`)。
|
||||
|
||||
**没动的**:屏板固件(外部工程 DTU-LCD,用户裁定不改)、召唤节奏(280 ms 是屏板的,主机
|
||||
单方面把"下一次召唤"的期望值提前不了)、7003 解耦(方案留在本节,未实施)。主机单测
|
||||
`TC-SBLINK-030~033` 钉住扣件/放行/截止/四边界(套件 164/164)。
|
||||
**已知边界**:召唤节奏 280 ms 属屏板固件(外部工程 DTU-LCD,不改);远端查看器在连时 `ui_net_sink_poll()` 可阻塞到秒级,会把上面这段耗时整体放大到秒级(7003 解耦方案未实施)。主机单测 `TC-SBLINK-030~033` 钉住扣件 / 放行 / 截止 / 四边界。
|
||||
|
||||
## 8. 对外接口(单一出处在各头文件,这里只列形状)
|
||||
|
||||
@@ -229,7 +213,6 @@ flowchart TB
|
||||
| `sb_link_poll(now_ms)` | uiTask | 离线判定(每拍)+ 5 s 变化才打的统计行(RX/TX 两行自分频) |
|
||||
| `sb_link_get_stats(&st)` | 任意上下文 | 计数快照(rx/ok/crc/len/fmt/keys/tx/done/drop/fb/bad/us/off/dfok/dfold…) |
|
||||
| `sb_crc16` / `sb_frame_a_parse` / `sb_frame_b_build_image` / `sb_frame_b_verify` | 纯逻辑 | 协议层四件套,主机单测可回归 |
|
||||
| `sb_frame_b_build_logo` | 纯逻辑 | **待删除**(LOGO 出局,勿新增调用,§9.2) |
|
||||
|
||||
## 9. 验证状态
|
||||
|
||||
@@ -242,20 +225,18 @@ flowchart TB
|
||||
| 真屏板冒烟(2026-10-29) | 5 s ≈18 帧 → 278 ms/帧,与屏板 280 ms 节拍吻合;`tx==done`、一召一答无双发;**屏板出图(用户目视确认)**——屏板收帧只有"CRC 过 → 刷屏 / 不过 → 静默丢弃"两种结局且无报错通道,**出图 = 屏板亲手端到端验收了帧长 4208、CRC 覆盖 `[0,4205]`、低字节在前、1 bpp 20 B/行 MSB 在前的布局**,这是任何主机侧计数都给不出的一条证据 |
|
||||
| 真屏板 10 min 连续(2026-10-29) | `rx=4258 ok=4258 crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0`(**连错误中断都没进过**);`tx=4249 done=4248`(`drop=9` 全在开机头两秒帧未就绪期,窗口内零新增);`keys=53 kq=0`(逐键必到、零丢弃);`fb=902 bad=0`(每帧自校验通过);组帧峰值 `us=687 max=812` < 1 ms 预算 |
|
||||
| 双通道并发(2026-10-30,真屏板在线) | 7003 侧 `test/host/remolcd_pull_test.py` INIT→LCDMEM 10 Hz 重压两轮 **1500/1500 + 700/700**、CRC 错 0、超时 0,往返 min 35 / avg 63 / max 131 ms;屏板侧 60 s 隔离窗口 rx +233 全收、**每召必答**、`drop` 零新增、`off=0`;画面一致性由"两出口同一份活显存"机制保证 |
|
||||
| 长稳(串口日志实测,2026-11-13 18:31 → 2026-11-15 21:43) | 单次上电连续运行 **51.2 h**:`rx=658262 ok=658262`、`crc=0 len=0 fmt=0 err=0 bits=0x00 rearm=0`、`drop=7`(仅启动期)、`kerr=0 abor=0 bad=0`,**全程 `off=0` 零误判离线**;跨屏板自复位(≈5000 s 周期)自动续上 |
|
||||
| 离线与恢复 | 断接期间 `off=1`,恢复后 `off=0`——`offline` 标志**只有**恢复分支会清,1→0 的转变即恢复路径执行过的证明(全程未重启主机) |
|
||||
|
||||
### 9.2 未闭环
|
||||
|
||||
| 项 | 内容 |
|
||||
|---|---|
|
||||
| 2 h 长稳 | 跨一次屏板自复位(≈5000 s + 余量):零误判 OFFLINE、零 kerr/abort、自动续上 |
|
||||
| 仪器项 | 逻辑分析仪:整帧期间无 ≥28 µs 间隙、召唤末位→应答首位 ≥30 µs、59.6 ms 整帧时长;FTDI/CP210x 收满 4208 B 后与 `g_ui_fbuf` 逐字节比对 |
|
||||
| uiTask 拥塞面 | 制造 7003/netTask 拥塞(客户端不读、对时 relisten 突发),屏板侧应零超时、画面停最后一帧——"起发不在任务态"的直接证据 |
|
||||
| 按键通路 | 延迟应答(扣件 / 凭据放行 / 140 ms 截止保底)与按键注键环(`ui_port` 8 深,满挤最旧)**尚未在有按键流量的真机上验过**——51.2 h 长稳日志 `keys=0 kq=0 dfok=0 dfold=0`,即整段运行零按键,该路径只有主机单测 `TC-SBLINK-030~033` 覆盖。验证法:接屏板按键连按,看 `keys`/`dfok` 涨、`dfold` 保持 0 |
|
||||
| 目视项 | 7 个物理键逐个按、动作对照 `docs/产品需求/产品需求设计文档.md` §8.2 菜单树 + 键 9 出 `unmapped` 日志;状态灯逐位(bit1 肉眼即见;bit3 挂 104 主站看亮灭;bit4 拔采样前端;bit2/bit5 见 §6 闭锁提示);主动拔插回归(含 7003 并发面) |
|
||||
| 剖析对照 | 画面静止 1 min,开屏板链路前后对比 `[PROF] uiw`(memcmp ~20 µs 成本判据) |
|
||||
| 待删除 | `sb_proto` 的 `sb_frame_b_build_logo()` + 魔数常量与对应单测用例(LOGO 出局遗留,现仅"勿新增调用") |
|
||||
| 待确认 | 屏板排针实际收发脚方向(向屏板方,线束定版前);键 9/10 语义(产品侧) |
|
||||
| 观察项 | 一次上电累计 `len=7` 共 7 次(IDLE 断帧尺寸 ≠ 6),出现窗口夹在"烧录后冒烟"与"首轮 150 s 重压结束"之间、不能排除与重压相关;但同固件上一上电周期 10 min 窗 `len=0`,第二轮 60 s 隔离窗口**零新增**,全程 `crc=0 fmt=0`、`ok` 增速与 `rx` 同频——功能影响为零。若再现首查:那包是否伴随 `err` 位(NE 噪声尾巴粘进下一包 = 无屏蔽杜邦线的正常形态) |
|
||||
|
||||
## 10. 坑账本
|
||||
|
||||
@@ -274,4 +255,4 @@ flowchart TB
|
||||
9. **纯注释改动也会让体积凭证报"不同码"**:先重建、再 `ram_baseline.py --update`。
|
||||
10. **按键召唤"立刻应答"发出去的必然是按键前的帧**(2026-10-30 前的默认行为):屏板按键召唤来得比
|
||||
`uiTask` 消化键快一到两个数量级,"有答"不等于"有新画面"——排查"按了键屏不变化"先对 `dfok=`
|
||||
计数,别顺着协议层找;延迟应答机制与账本见 §4 末条与 §7.1。
|
||||
计数,别顺着协议层找;延迟应答机制与耗时见 §4 末条与 §7.1。
|
||||
@@ -1,7 +1,7 @@
|
||||
# 控制台单写者日志设计说明
|
||||
# 控制台单写者日志设计
|
||||
|
||||
> **版本**:v1.8(已实施;修订史见文末 §11「实施时间线」)
|
||||
> **日期**:2026-10-30(v1.8:控制台端口由 USART1 改为 **UART5/RS232#1**,全文端口口径同步——物理口与台架端子见 `屏板链路设计说明.md` §2 / §3.2;v1.7 于 2026-10-26:崩溃上报归一进单写者 + 多段裸发收口,道G task-26;v1.6 同日:未注册期裸发加「行级单一所有者」;v1.5 于 2026-10-24;初版 v1.0 于 2026-09-25)
|
||||
> **日期**:2026-10-30(v1.8:控制台端口由 USART1 改为 **UART5/RS232#1**,全文端口口径同步——物理口与台架端子见本文 §3.1 / §3.4;v1.7 于 2026-10-26:崩溃上报归一进单写者 + 多段裸发收口,道G task-26;v1.6 同日:未注册期裸发加「行级单一所有者」;v1.5 于 2026-10-24;初版 v1.0 于 2026-09-25)
|
||||
> **状态**:已实施并验证——`/keil-build` 0 错误 0 警告、`/serial-boot-test` 硬件闭环 PASS(2026-09-25,见 §10);设计 2026-09-24 加固实施(当时位于 `Src/usart.c` USER CODE 区),2026-09-25 实现迁出至 `App/log/`(HAL 生成文件不含应用代码);同日写者任务体自 `Src/freertos.c` 迁至 `App/task/default_task.c`(与其余 5 任务文件同址归位)
|
||||
> **关联文档**:`项目架构总览.md` · `运行与自检记录设计.md`(姊妹模块:持久化日志,同一写者任务) · `docs/测试说明/专项验证/链路延迟测试说明.md`(D6 日志税 / 步骤 8 非阻塞日志,需求出处) · AGENTS.md「平台约束」
|
||||
|
||||
@@ -102,7 +102,16 @@ flowchart LR
|
||||
P3 -- "有界直发 ≤256B" --> U
|
||||
```
|
||||
|
||||
### 3.4 并发语义与本设计的配合(实现实测)
|
||||
### 3.4 台架日志口接线(RS232#1 / CN1)
|
||||
|
||||
- 台架须用 **USB 转 RS-232 适配器**(TTL 的 CH340 直连不了,且 RS-232 的 ±电平可能打坏 `U13` TPT3232E 或适配器):
|
||||
适配器 `TXD` → `CN1.10`(板子 `RS232_RX1`)、`RXD` → `CN1.12`(板子 `RS232_TX1`)、`GND` → `CN1.7` 或 `CN1.8`(`CGND`)。
|
||||
- 台架串口因此是 **`COM3`**,`.serialtest/config.json` 的 `portName` 已按此配置,`/serial-boot-test` 与 `serial-assistant` 不必手工指端口。
|
||||
- RS232#1 **没有 TTL 出口**(`ST_TX1`/`ST_RX1` 只连 `U9` 隔离器与 MCU),唯一外部出口是 CN1 的 RS-232 端子;
|
||||
`U14` 是 RS232#3 的网口座,本通道用不上。
|
||||
- 电平链与引脚见 `docs/架构设计/硬件规格与能力边界.md` §2(UART5 = PC12 TX / PD2 RX,经 U9 隔离 → U13 电平转换 → CN1)。
|
||||
|
||||
### 3.5 并发语义与本设计的配合(实现实测)
|
||||
|
||||
写者**已注册**后(稳态):任务上下文唯一调用者 = 写者(`defaultTask`),零竞争;残余窗口 = ISR 直发撞写者发送中(丢失、不挂死,§7)。
|
||||
|
||||
@@ -363,7 +372,7 @@ sequenceDiagram
|
||||
| 2026-10-26 | **崩溃上报归一 + 多段裸发收口(道G task-26,接 task-23 第二段)**:`Src/stm32f4xx_it.c hard_fault_report`(四个 Fault 共用,14 段裸发)原**自行调用 `HAL_UART_Transmit`** ⇒ 绕过本模块行级独占的**第三个写者**,并带两条已实证失效:HAL 超时依赖 `HAL_GetTick()`(TIM7 停摆永不成立)与僵尸通道下恒快速失败(**关键 `[ERR]` 证据整条蒸发**)。现改 `dbg_console_write_raw`(**不包** `tx_begin()/tx_end()`,理由见 §4.4.1);`hard_fault_report` 与栈溢出钩子输出后的 `HAL_Delay(200)` 一并删除(本口已等 TC;少一条 tick 依赖,避免卡在复位之前)。同类收口只落在任务态:`App/util/task_watchdog.c` STALL 行 2 段包进一次独占;`Src/freertos.c` 栈溢出钩子(3 段)与断言钩子(5 段)以及 `hard_fault_report`(14 段)**不包**(异常态空转 + 代价 ×9 条任务链,见 §4.4.1)。**语义**:异常上下文 `tx_begin()` 放行不持有,故障行整行性靠 Fault 优先级与任务冻结,残留 ≤1 个移位寄存器字节(落在行前,不影响 `[ERR]` grep)。**未消除**:ORE/NE/FE 脏标志、极早期(串口未初始化)崩溃静默。主机侧复用既有判据 `TC-CONLOG-100 与 TC-CONLOG-102`(NULL 短路)与 `TC-CONLOG-174`(一次独占内多段连发不自我丢弃),未新增用例;实机验证设计见 §4.4.1 末。**行序口径**:让路行入环后位置后移,台架 5/5 观察到 `[NAND_FTL]` 稳定排在 `[PROT]` 前一行(旧缺陷形态相反)⇒ 行序与时间戳先后**都不再是判据**,只能按整行逐字节锚定(§4.4.1) |
|
||||
| 2026-10-26 | **O1 第二个实例 → 未注册期裸发加「行级单一所有者」(道G task-23)**:台架同镜像两次"仅复位"启动,`[PROT]` 未标定闭锁边沿行内分别多出 `[20`(3 字节)与 `[`(1 字节),而紧随其后的 `[NAND_FTL] Initializing NAND FTL...` 行恰好缺同样那几个字节的**行首**(字节账与三次启动命中两次的频率见 §4.4.1)→ 判据"framing 错不会让行变长"锁定为**两个写者并发裸发**,即 O1 的第二个实例(第一个是 2026-10-12 台架复测)。修法 = 非阻塞行所有权(`con_tx_try_claim`/`con_tx_release`,只在几条指令的临界区里 test-and-set;发送全程**不关中断**)+ 让路整行原文入环延后发(不丢、不补前缀、不重打时间戳)+ drain 每轮先取凭证(堵掉"attach 撞上别人半行")+ `[ERR]` 只在"抢不到且环也满"时红。新增 `dbg_console_tx_begin/tx_end`(多段裸发收口,调用点改造 → task-26)。主机单测 127 → **152** 条(M 族 `TC-CONLOG-170 至 TC-CONLOG-179`,含逐字节相同判据),四处生产码注入反证各自转红(取消独占 11 红 / 让路改静默丢 5 红 / 非属主可归还 1 红 / 把发送包进临界区 3 红)。§3.4 / §4.4 / §7 / §13-O1 同步 |
|
||||
| 2026-10-12 | **纪律盲区台架实证(台架复测)**:`protectTask`(保护任务 接线,台架腿当时未跑)启动锚点行在写者注册前裸发 → 与 defaultTask 启动日志**逐字节交错**(`st[art: cycle=220ms elm=70`,两次开机同形复现 = 启动调度确定性的竞态,非 USB 噪声)→ `@test` 锚点 MISS。修复 = 启动行改 `dbg_console_writer_ready()` 首拍补打(adcTask 首帧同款),`@build` 0/0 + `@test` PASS 复验(锚点完好 +577 ms)。§3.4 纪律示例更新 |
|
||||
| 2026-10-29 | **端口迁移**:控制台从 USART1 迁到 **UART5(RS232#1,PC12 / PD2,经 U9 → U13 → CN1)**,`console_log.c` 收口成 `CON_UART*` 单点宏(句柄 / IRQn / 时钟 / 重初始化一体);USART1 现仅服务屏板链路(700 kbaud,`屏板链路设计说明.md`);台架日志口因此为 `COM3`(USB 转 RS-232 适配器 → CN1 端子,`.serialtest/config.json` 已配) |
|
||||
| 2026-10-29 | **端口迁移**:控制台从 USART1 迁到 **UART5(RS232#1,PC12 / PD2,经 U9 → U13 → CN1)**,`console_log.c` 收口成 `CON_UART*` 单点宏(句柄 / IRQn / 时钟 / 重初始化一体);USART1 现仅服务屏板链路(700 kbaud,`屏板链路设计.md`);台架日志口因此为 `COM3`(USB 转 RS-232 适配器 → CN1 端子,`.serialtest/config.json` 已配;接法见 §3.4) |
|
||||
|
||||
## 12. ORE 僵尸通道(2026-10-02 台架实证;当时端口 USART1,现 UART5 同机理)
|
||||
|
||||
@@ -473,7 +473,7 @@ snapshot == required → miss_streak=0、证据门闩复位、喂狗
|
||||
|---|---|---|
|
||||
| R1 | **启动段无保护**(复位 → `task_wd_start()` 约数秒) | 接受;表现为"无输出 + LED 不闪",人工辨识。要覆盖需"短超时 + 手动多喂",复杂度收益比不划算 |
|
||||
| R2 | **LSI 精度差** | 已按 47 kHz 最坏值校验,停喂到复位仍留 ~900 ms |
|
||||
| R3 | **喂狗节奏饥饿** | 控制台 drain 曾把主循环拉长导致误复位(2026-10-02 台架日志代次 288)。现缓解 = drain 单次 250 ms 预算 + 发送故障 300 ms 冷却;**结构根治(USART1 改只发不收)2026-10-26 已裁定不做 → 现行缓解即长期方案**(机制详述 `控制台单写者日志设计说明.md` §12) |
|
||||
| R3 | **喂狗节奏饥饿** | 控制台 drain 曾把主循环拉长导致误复位(2026-10-02 台架日志代次 288)。现缓解 = drain 单次 250 ms 预算 + 发送故障 300 ms 冷却;**结构根治(USART1 改只发不收)2026-10-26 已裁定不做 → 现行缓解即长期方案**(机制详述 `控制台单写者日志设计.md` §12) |
|
||||
| R4 | **NAND 真实卡死时 FTL 直接喂狗** | 设备存活但存储功能冻结(与 ORE 自愈同类边界)。若要求"NAND 死也必须复位",需给 `nand_ftl_wd_feed()` 加次数/时限上限 |
|
||||
| R5 | **栈溢出与断言在复位原因上不可区分**(都是 `SFTRSTF`) | 可接受;串口分别打 `[ERR] STACK OVERFLOW` / `[ERR] ASSERT FAILED`,`selftest.log` 侧另有记录 |
|
||||
| R6 | **`RCC_CSR` 读后即清** | 已在 `main.c` 统一处理;漏清会让下次软复位读回上次标志 |
|
||||
@@ -493,7 +493,7 @@ snapshot == required → miss_streak=0、证据门闩复位、喂狗
|
||||
|
||||
看门狗是本项目**第一次**把 CubeMX 生成流程引入可靠性关键路径,由此沉淀出与看门狗本身无关的通用方法论。`AGENTS.md`「平台约束」指向本节,改动 `.ioc`/`Src/`/`Inc/` 前请先读。
|
||||
|
||||
> **2026-10-26(道G task-26)一句话登记,机制不在本文复述**:四个 Fault 与栈溢出 / 断言钩子的**崩溃上报发送口已归一**进控制台单写者(`dbg_console_write_raw` + 一次整行独占,不再自行调用 `HAL_UART_Transmit`),机制正文与残余见 `docs/子系统设计/控制台单写者日志设计说明.md` §4.4.1。本节只关心一件事:这些实现仍须整体待在 `Src/freertos.c` 的 `USER CODE BEGIN 4/5` 区与 `Src/stm32f4xx_it.c` 的 `USER CODE BEGIN 0` 区(§10.2 的「搬进 USER CODE 区」条),改完跑 `scripts/check_cubemx_survival.py`(§10.3)。同族另一笔只登记指针:断言钩子与临界区在控制台路径上互达会构成**幻影环**,armlink 的 `In Cycle` 记账随环形状波动(同一 port.o 三棵树实测每链差 0~80 B,休眠≠解耦),三树取证、量化表与「configASSERT 裁空宏 ≠ 优化收益」的钉死句见 `docs/内存管理/RAM使用分析与优化方案.md` §4.0.7(道G task-38)。
|
||||
> **2026-10-26(道G task-26)一句话登记,机制不在本文复述**:四个 Fault 与栈溢出 / 断言钩子的**崩溃上报发送口已归一**进控制台单写者(`dbg_console_write_raw` + 一次整行独占,不再自行调用 `HAL_UART_Transmit`),机制正文与残余见 `docs/子系统设计/控制台单写者日志设计.md` §4.4.1。本节只关心一件事:这些实现仍须整体待在 `Src/freertos.c` 的 `USER CODE BEGIN 4/5` 区与 `Src/stm32f4xx_it.c` 的 `USER CODE BEGIN 0` 区(§10.2 的「搬进 USER CODE 区」条),改完跑 `scripts/check_cubemx_survival.py`(§10.3)。同族另一笔只登记指针:断言钩子与临界区在控制台路径上互达会构成**幻影环**,armlink 的 `In Cycle` 记账随环形状波动(同一 port.o 三棵树实测每链差 0~80 B,休眠≠解耦),三树取证、量化表与「configASSERT 裁空宏 ≠ 优化收益」的钉死句见 `docs/内存管理/RAM使用分析与优化方案.md` §4.0.7(道G task-38)。
|
||||
|
||||
### 10.1 覆盖史(三次重生成)
|
||||
|
||||
@@ -707,7 +707,7 @@ enter/exit 段还能读出"此刻仍在段内已多久"——**永久阻塞的
|
||||
| 2026-10-09 | **4 个 Fault Handler 由审计兜底升级为 USER CODE 区:重生成完全零 diff** | 用与 iwdg 同一招。`Src/stm32f4xx_it.c` 的 4 个 `__asm void X_Handler` 从**生成区**搬进 `USER CODE BEGIN 0`,且必须写在文件头那 4 个 `#define X X_Gen` **之前**(写在之后会被自己的宏改名);配套的 `#undef X` 随之删除(不再需要)。生成区恢复 CubeMX 原样(`void HardFault_Handler(void)` + `HardFault_IRQn 0` / `W1_HardFault_IRQn 0` 标记区),4 个锚点注释(`HARD-FAULT-ANCHOR` / `MEMFAULT-ANCHOR` / `BUSFAULT-ANCHOR` / `USAGEFAULT-ANCHOR`)全部退役。`.map` 复核:`startup_stm32f407xx.o(RESET) refers to stm32f4xx_it.o(.emb_text) for HardFault_Handler`(向量表仍指向我们的 `__asm` 版)、`.emb_text → i.fault_entry_* → i.hard_fault_report`、4 个 `*_Gen` 各 `Removing ... (2 bytes)`。审计项 `hardfault-handler` / `fault-handlers-3` 由 `wholefile`+锚点改为 `protected`(区 `0`)+ 代码符号断言。**审计兜底清单清空**,重生成预期零 diff。`@build` 0 错误 0 警告;审计 21 通过 / 1 警告 / 0 失败 |
|
||||
| 2026-10-10 | **正文按当前代码重写(清理立项前的描述)** | 正文原样保留了大量**立项前(2026-09-29)**的状态取证与已废弃的"路径 C 考古",与现状矛盾,故重写为现状设计说明(1144 → 571 行;**历史与逐次决策全部保留在下方变更记录,未删**)。主要更正:① §1.1"现状:无任何硬件看门狗"改为**历史背景**(IWDG 已在 `.ioc`/`hal_conf`/工程三处就位);② **ftpTask 早已纳入监视**——经 `lftpd_task_wd_beat()` 弱钩子(事件循环 / RETR·STOR 分片 / 连接与卷锁等待),旧正文"首期不埋点、由掩码剔除"及 R3/O1 已作废;③ 补齐正文缺失的三块现状实现:**FTL 心跳路由**(`task_wd_bind()` + `nand_ftl_wd_beat()`)、**FTL 直接喂狗**(`nand_ftl_wd_feed()`,含"设备存活但功能冻结"边界)、**round 7/8/8b 取证机制**(`/log/wdev.log`、`.noinit` 槽 + `UNINIT_CCM`、`PREVRUN`/`TICKRUN`/`MISS start`/`STALL`);④ 掩码改为按代码实况列表(产品 `0x37` / `ENABLE_HW_LAYER_TESTS` `0x35` / **testTask 任何构建都不入掩码**)并写明"精确相等"语义;⑤ 复位原因优先级按 `reset_cause_str()` 实际顺序改写(旧表把 POR 排第一,代码是 **IWDG 最优先**);⑥ §4.6 更正为**已集成**:看门狗复位写 `selftest.log`(旧正文"未改");⑦ §8 预算改用 `.map` 实测(`task_watchdog.o` 1098 B 代码 / 44+104 B RAM / `.noinit` 48 B;`iwdg.o` 仅 28 B,`HAL_IWDG_Init` 94 B 被移除);⑧ 附录 B 自相矛盾修正(旧表把"借助 CubeMX"列为否决,实际已选它);⑨ §7 由"验证计划"改为**验证记录**(V2/V4/V5 ✅、U1 39 断言 ✅,V3/V6/V7 标为未单独注入、V8 未做)。连带同步:`Src/iwdg.c`、`Src/freertos.c`、`App/task/default_task.c` 三处注释的章节引用(旧 §4.5/§4.6 → 新 §4.1/§4.4),`scripts/check_cubemx_survival.py` 提示语(§10.1 → §10.2/§10.3),`实机测试实施指南.md`(§10 → §7 ×3)、`看门狗单元测试说明.md`(§10 → §7)、`模拟器差距清单.md` H-1(§4.9 → §4.7,并更正"模拟器不编译本模块、无 IWDG 桩")、`docs/README.md`("实施中/待验证" → 已闭环)。⚠️ **下方历史行里的 §x.y 引用指当时编号**,不再回溯改写 |
|
||||
| 2026-10-10 | **adcTask 纳入监视(ADC 采集链路):必需掩码 `0x37`→`0x77`** | ADC 采集链路(ADC 采集链路)落地时新增 `adcTask`(`App/task/adc_task.c`:1 ms 采样节拍触发 CONVST + 消费 `tpafe5160_snapshot()`)并纳入 IWDG 监视:`task_wd_id_t` 新增 `TASK_WD_ADC = 6`;`wd_required_mask()` 产品 `0x37`→`0x77`、`ENABLE_HW_LAYER_TESTS` `0x35`→`0x75`(adcTask **不依赖任何就绪屏障** → 任何构建都置位)。adcTask 主循环每 1 ms `task_wd_beat(TASK_WD_ADC)`;**不做 NAND I/O → 不登记 FTL 心跳路由**(无需 `task_wd_bind()`)。主机侧单测 `beat_all()` 与掩码断言(`tc_003`/`tc_005`/`tc_011` 的 `0x37`→`0x77`)同步,39 断言全绿。任务由 `Src/freertos.c` 的 `USER CODE` 区手工创建(同 timeSyncTask,不在 `.ioc` 里),栈 512 words、优先级 Normal,`stack_report.py` 实测最坏链 504 B(余 1544 B / 75%)。见 `docs/算法/继电保护功能复现规划.md` §7 |
|
||||
| 2026-10-10 | **ADC 采集链路 `@test` 实机闭环:adcTask 掩码真机验证** | 台架闭环(`.dsh/skills/serial-boot-test/scripts/run_boot_test.py`)确认 `adcTask` 纳入掩码后**无 adc 相关误复位**:`[STACK] adc peak_used=496/2048 free_min=1552 (75%)`、`frames/seq` 每 10 s 严格 +10000(=1000 Hz)、`idle=0`/`frst_err=0`、全片回读 `No difference found`。启动早期两次 `MISS start snap=0x67 req=0x77` 仅缺 bit4(`timeSync` 未启动,属正常就绪窗;adc 的 bit6 自始置位),掩码随后收敛、全程无复位。同轮另修 `dbg_console_writer_ready()` 门控(adcTask 周期日志在写者注册前抑制,见 `控制台单写者日志设计说明.md`) |
|
||||
| 2026-10-10 | **ADC 采集链路 `@test` 实机闭环:adcTask 掩码真机验证** | 台架闭环(`.dsh/skills/serial-boot-test/scripts/run_boot_test.py`)确认 `adcTask` 纳入掩码后**无 adc 相关误复位**:`[STACK] adc peak_used=496/2048 free_min=1552 (75%)`、`frames/seq` 每 10 s 严格 +10000(=1000 Hz)、`idle=0`/`frst_err=0`、全片回读 `No difference found`。启动早期两次 `MISS start snap=0x67 req=0x77` 仅缺 bit4(`timeSync` 未启动,属正常就绪窗;adc 的 bit6 自始置位),掩码随后收敛、全程无复位。同轮另修 `dbg_console_writer_ready()` 门控(adcTask 周期日志在写者注册前抑制,见 `控制台单写者日志设计.md`) |
|
||||
| 2026-10-10 | **新增 §11:任务级饥饿的诊断方法与实测基线** | 承接 Task #32(`task stall: mask=0x67 req=0x77`,缺 `TASK_WD_UI`)结案后的沉淀——原分析文档 `docs/问题记录/UI任务看门狗停摆分析.md` 按"完成即销项"删除,可复用部分并入本文:**§11.1** 三条易误读的判读口径(启动期 `MISS start 0x67` 良性、`miss=` 是累计不是连续、`reset cause` 不能区分 IWDG 与台架);**§11.2** 诊断四步(先看掩码缺几位 → 量化占空比 → 用计数速率反证空转 → 用 `[PROF]` 指认占用者;本例否掉"CPU 饱和",实测 10%~13%);**§11.3** 三条结构性脆弱点(uiTask 唯一 BelowNormal/心跳依赖 netTask 往返/自定截止期不可恢复)与两个顺带修掉的**正确性**缺陷(无新帧仍压环 ≈3% 频率失配、失败拍静默沿用旧值);**§11.4** `[PROF]`/`[PROF2]` 全字段语义 + v2.8 基线(含 `netp=0` 是真实值、`adcm` 峰值来自心跳日志、`uip` 地板 = LVGL 帧周期)与三机理判读口诀;**§11.5** 三条教训(门控须留低频兜底、门控会消灭暴露路径、事件驱动要核对节拍源与消费者创建时刻);**§11.6** 明确不做的四条及理由。§9.1 的 R7 行改指本文 §11.3 |
|
||||
| 2026-10-11 | **新增 §10.4:ARMCC `__asm` 的三条语法约束** | AGENTS.md 瘦身:「ARMCC 内联汇编语法」条目的完整细节(GCC 语法报 `#18`、块内联把寄存器名当 C 标识符报 `#20`、`__asm` 取不到 C 数据符号 `A1516E`、可用写法 = 整函数 `__asm void f(void)` + `B` 到 C 入口、`#define f f_Gen` 让位机理)迁入本文,AGENTS.md 只留一行禁令与指针 |
|
||||
| 2026-10-12 | **iec104Task / protectTask 纳入监视(IEC 104 上行/保护任务):必需掩码 `0x77`→`0xF7`→`0x1F7`** | 两行合并记录(IEC 104 上行 落地时漏补本文,保护任务 一并纠偏):**IEC 104 上行** 新增 `TASK_WD_IEC104 = 7`(iec104Task 100 ms 服务循环喂位,NET_READY 屏障等待按 100 ms 分片喂位),产品 `0x77`→`0xF7`、HW 层 `0x75`→`0xF5`;**保护任务** 新增 `TASK_WD_PROTECT = 8`(protectTask 20 ms 判据节拍喂位,见 `docs/算法/继电保护功能复现规划.md` §7),产品 `0xF7`→`0x1F7`、HW 层 `0xF5`→`0x1F5`。两任务均**不依赖存储/网络之外的屏障**(protectTask 无任何屏障)→ 任何构建都置位;均不做 NAND I/O → 不登记 FTL 心跳路由。主机侧单测 `beat_all()` 与 `tc_003`/`tc_005`/`tc_011` 掩码断言同步至 `0x1F7`,39 断言全绿。⚠ 注意 `0x1F7` 不含 bit3(testTask 任何构建不入掩码,口径不变) |
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> **读者**:要改日志记录、加自检检查点、调记录页,或排查"设备上为什么没记下来"的人。
|
||||
> **读这一篇能得到什么**:`/log` 下那七个文件与 SOE、控制台日志的**现状设计**——记录长什么样、谁在什么时候写、满了怎么办、屏上怎么呈现、出问题时退到哪儿。
|
||||
> **相关文档**:`docs/架构设计/STM32F4-Base存储架构说明.md`(卷与 FTL)· `docs/子系统设计/系统墙钟时间维护说明.md`(时标来源)· `docs/子系统设计/控制台单写者日志设计说明.md`(串口侧)· `docs/UI设计/内容页架构.md`(记录页框架)
|
||||
> **相关文档**:`docs/架构设计/STM32F4-Base存储架构说明.md`(卷与 FTL)· `docs/子系统设计/系统墙钟时间维护说明.md`(时标来源)· `docs/子系统设计/控制台单写者日志设计.md`(串口侧)· `docs/UI设计/内容页架构.md`(记录页框架)
|
||||
|
||||
本文只描述**现在**的系统。
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
| **USART1(U5 直连 TTL)** | UART | PA9 TX / PA10 RX | **700000 8N1 → 屏板链路**(TTL 直连、无 DE,`../产品需求/产品需求设计文档.md` §5.16.2);PA10 双向均已接线;日志已迁 UART5 |
|
||||
| **UART4(RS-485)** | UART | PC10 TX / PC11 RX / **PA15 DE** | 半双工通信(V0.1 轮换后 RS485#4 = UART4,`../硬件平台/V0.1_网表详细分析报告.md` §4.2) |
|
||||
| **USART2(RS-232 #3)** | UART | PD5 TX / PD6 RX | 经 U10 隔离 → U13 TPT3232E → CN1;固件目前未占用(日志实际走 UART5/RS232#1) |
|
||||
| **UART5(RS-232 #1)** | UART | PC12 TX / PD2 RX | 经 U9 隔离 → U13 → CN1;**日志口**(115200,`/serial-boot-test` 采集通道;台架端子 `../子系统设计/屏板链路设计说明.md` §3.2) |
|
||||
| **UART5(RS-232 #1)** | UART | PC12 TX / PD2 RX | 经 U9 隔离 → U13 → CN1;**日志口**(115200,`/serial-boot-test` 采集通道;台架端子 `../子系统设计/控制台单写者日志设计.md` §3.4) |
|
||||
| **状态 LED ×6** | GPIO | PC5 / PB0 / PB1 / PB2 / PF11 / PF12 | **低电平点亮** |
|
||||
| SWD | — | PA13 SWDIO / PA14 SWCLK | V0.1 已修复 V0.0 的 SWCLK 引脚缺陷 |
|
||||
| 调试口 | — | CN2(XH-3A,1=SWDIO/2=SWCLK/3=GND) | V0.1 由 H2 排针改为 XH 端子 |
|
||||
|
||||
+4
-4
@@ -199,7 +199,7 @@ flowchart LR
|
||||
- **配置文件**:通用 `/config.ini`(cfg_file 引擎,静态态单任务收敛于 defaultTask,外部变更 4s 沉降后自动重载),**多段注册制**:`[network]`(net_cfg)/ `[ftp]`(鉴权)/ `[adc_cal]`(标定系数与零点)/ `[run_par]`(运行参数 + 104 地址映射真源)/ `[comm]`(104 ca/端口);新模块加段=注册 `cfg_file` 段处理器,唯一落盘者不变。→ `docs/子系统设计/配置文件设计.md`
|
||||
- **记录九件**:`sys_log` 引擎按 `App/log/sys_log_mcu.c` 的 `s_paths[]` 写**七本**定长 64B 文本记录——`/log/run.log`、`selftest.log`、`accid.log`、`alarm.log`、`start.log`、`oper.log`、`yk.log`;`soe_store` 同先例落 `/log/soe.log`(64B 定长二进制,容量满删除重建);`/log/wdev.log` 是**变长取证行**(掉电不丢,`App/fs/vol_lock` 侧投,不走 64B 定长格式)。defaultTask 是 `/log` 唯一写者(两条队列在 `syslog_drain` 尾部统一排空),FTP 可直下。→ `docs/子系统设计/运行与自检记录设计.md`
|
||||
- **录波段文件**:`/wave`(首 boot `mkdir`,8.3 短名 WAVE 前缀轮转、启动扫盘重建下标),段头 + 通道表 + 两处 CRC-16/MODBUS + 整段自检;defaultTask 游标**分次搬运**(每次 64B 批)不独占 FatFs,落盘成功回执才解冻录波环。→ `docs/子系统设计/故障录波设计说明.md`
|
||||
- **实时调试流** = 控制台单写者日志(**UART5**/RS232#1,4KB 环形缓冲 + defaultTask 唯一发送;2026-10-29 因屏板占用 USART1 自 UART5 定态),详见 `docs/子系统设计/控制台单写者日志设计说明.md`。
|
||||
- **实时调试流** = 控制台单写者日志(**UART5**/RS232#1,4KB 环形缓冲 + defaultTask 唯一发送;2026-10-29 因屏板占用 USART1 自 UART5 定态),详见 `docs/子系统设计/控制台单写者日志设计.md`。
|
||||
- NAND 坏块表(BBT)持久化在保留块池,不交给 dhara 管理。
|
||||
|
||||
---
|
||||
@@ -293,7 +293,7 @@ flowchart TB
|
||||
- 内容页为**独立全屏屏**,由框架一次性自绘(**零 LVGL 子对象**),ESC 返回菜单屏。
|
||||
- 菜单受保护叶子(行尾 ` #P`):先弹密码页,授权后 `menu_password_ok` **先关页再续进入动作**。
|
||||
- **数据供给**:页面不直接伸手进业务模块,一律读 `ui_data.h` 三帧快照(实时量/参数/装置信息);写侧唯一填充者 `ui_data_feed`(装配层,可双向 include 不违分层)。契约属主 `docs/UI设计/UI_数据供给设计说明.md`。
|
||||
- **显存一份三出**(§5):屏板串口为主出口(4208 B 帧 B 点阵,memcmp 判变才组帧),:7003 为网络镜像,模拟器与固件同一份 UI 源码;屏板按键经 uiTask 映射 `UI_KEY_*` 回注。→ `docs/子系统设计/屏板链路设计说明.md`
|
||||
- **显存一份三出**(§5):屏板串口为主出口(4208 B 帧 B 点阵,memcmp 判变才组帧),:7003 为网络镜像,模拟器与固件同一份 UI 源码;屏板按键经 uiTask 映射 `UI_KEY_*` 回注。→ `docs/子系统设计/屏板链路设计.md`
|
||||
- 录波两页:`wave_manual`(装置上手动触发录波)与 `wave_play`(现场单通道回放)——判据与显示契约见 `docs/子系统设计/故障录波设计说明.md` §8。
|
||||
- 待机屏:空闲超时(默认 60s)自动切入,仅确认键回菜单;数据源同实时量页。
|
||||
- 字体 `ui_font_cn_12.c` 由 `tools/font_gen/` 生成(宋体 12px 1bpp 子集,**224 字/319 字形**,2026-10-29 实测;字形数 = 字符数 + ASCII 95 个)。
|
||||
@@ -391,12 +391,12 @@ flowchart LR
|
||||
| ADC 采样节拍(TIM3 1kHz 同源驱动) | `docs/子系统设计/ADC采样节拍设计.md` |
|
||||
| ADC 通道映射(网名/板级/通道号 13 路置换) | `docs/硬件平台/ADC通道映射说明.md` |
|
||||
| 故障录波(数据面/段格式/回放契约) | `docs/子系统设计/故障录波设计说明.md` |
|
||||
| 屏板链路(USART1 主出口 / 帧 A 帧 B / 实测证据) | `docs/子系统设计/屏板链路设计说明.md` |
|
||||
| 屏板链路(USART1 主出口 / 帧 A 帧 B / 实测证据) | `docs/子系统设计/屏板链路设计.md` |
|
||||
| IEC 60870-5-104 上行(默认 :2404,可经 `[comm]` 改) | `docs/子系统设计/IEC104上行设计说明.md` |
|
||||
| 配置文件引擎(/config.ini 多段注册制) | `docs/子系统设计/配置文件设计.md` |
|
||||
| 运行与自检记录(64B 记录 + SOE) | `docs/子系统设计/运行与自检记录设计.md` |
|
||||
| 墙钟时间维护 | `docs/子系统设计/系统墙钟时间维护说明.md` |
|
||||
| 控制台单写者日志(UART5 调试流) | `docs/子系统设计/控制台单写者日志设计说明.md` |
|
||||
| 控制台单写者日志(UART5 调试流) | `docs/子系统设计/控制台单写者日志设计.md` |
|
||||
| 看门狗 / CubeMX 重生成存活方法论 | `docs/子系统设计/看门狗设计说明.md` §10 |
|
||||
| RAM 预算与优化 | `docs/内存管理/RAM使用分析与优化方案.md` |
|
||||
| 栈/内存观测工具 | `scripts/stack_report.py`(Keil 静态调用图 × 串口 `[STACK]` 水位,判定取两者更坏者)· `scripts/ram_report.py`(.map 静态占用)—— 用法与基线见内存方案 §4.0.6 |
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# 启动日志原子性复验流程(台架)
|
||||
|
||||
> **这篇是什么**:验证"控制台整行独占 / 崩溃遗言原子性"这类**行级完整性**判据的固定动作与口径。
|
||||
> 它补的是 `../../子系统设计/控制台单写者日志设计说明.md` 的**验收侧**:那边讲怎么修,这边讲怎么证明修好了、
|
||||
> 它补的是 `../../子系统设计/控制台单写者日志设计.md` 的**验收侧**:那边讲怎么修,这边讲怎么证明修好了、
|
||||
> 以及**为什么"标记全中"不等于"日志没坏"**。
|
||||
> 来源:2026-10-26 台架实测(缺陷立项 task-23、收口复验 task-30、工具与流程吸收 task-36)。
|
||||
|
||||
@@ -154,7 +154,7 @@ SHA 只当坐标(2026-10-26 那天 SHA 被 amend 挪了三轮)。同镜像
|
||||
|
||||
## 8. 关联
|
||||
|
||||
- 修法与设计口径:`../../子系统设计/控制台单写者日志设计说明.md`(O1 两实例与字节账、§4.4.1 崩溃路径验证设计)
|
||||
- 修法与设计口径:`../../子系统设计/控制台单写者日志设计.md`(O1 两实例与字节账、§4.4.1 崩溃路径验证设计)
|
||||
- 闭环与标记口径:`../流程与规范/自动化测试流程.md`
|
||||
- 证据归档与命名:`../测试数据/boot_log_data/README.md`
|
||||
- 复位语义与回读次序:`../测试工具/ST-LINK_CLI_复位使用说明.md`
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
| 差距 | 模拟器行为 | 真机行为 | 影响 | 回归补测 |
|
||||
|---|---|---|---|---|
|
||||
| **控制台单写者无对应实现** | `simulator/dbg_log.h` 把 `DBG_*` 映射到 `printf`;**不编译** `console_log.c` | 单写者环形缓冲 + defaultTask 唯一发送 | `console_log` 的环形缓冲溢出/丢弃计数逻辑**模拟器测不到**;共享代码若误调 `console_log.h` 声明,模拟器链接失败(已被此约束捕获) | `/serial-boot-test` + 板端串口观测;`docs/子系统设计/控制台单写者日志设计说明.md` §4.1 |
|
||||
| **控制台单写者无对应实现** | `simulator/dbg_log.h` 把 `DBG_*` 映射到 `printf`;**不编译** `console_log.c` | 单写者环形缓冲 + defaultTask 唯一发送 | `console_log` 的环形缓冲溢出/丢弃计数逻辑**模拟器测不到**;共享代码若误调 `console_log.h` 声明,模拟器链接失败(已被此约束捕获) | `/serial-boot-test` + 板端串口观测;`docs/子系统设计/控制台单写者日志设计.md` §4.1 |
|
||||
| **mtime 粒度不同** | 宿主文件 mtime(**秒级**) | FAT 打包时间(`fdate<<16\|ftime`,**分钟级**) | `cfg_file_poll` 的 `(size, mtime)` 变更令牌在两端触发时机不同;分钟级粒度下的"同分钟内两次改动"在真机可能被判为无变化 | 板端 STORAGE 套件;`配置文件设计.md` §3.3 |
|
||||
| **无应用回调(空操作)** | 模拟器不注册段回调,`cfg_file_poll` 重载后回调为空 | 各段回调真正执行(如网络重配置) | "配置变更 → 触发回调 → 副作用"链路在模拟器上**只验证到写盘**,回调逻辑不覆盖 | `/serial-boot-test`(配置保存 → UI 生效) |
|
||||
| **「清除记录」两端时序不同** | `syslog_request_clear()` 在调用内**同步**删除宿主文件(`sim_syslog.c` 单线程,没有卷锁、没有队列),返回后状态立刻是 `OK`/`FAIL`,`SYSLOG_CLEAR_WAIT` 永不出现 | 非写者上下文只置标志,真正的 `f_unlink` 排在 defaultTask 的 `syslog_drain()` 尾部(卷锁 try:拿不到锁就顺延,见 `App/log/sys_log_mcu.c`) | 「按了按钮 → 下一拍才见结果」这条异步链、卷占用顺延、以及删除与写者重建的交错,在模拟器上**结构上不存在**;UI 页面若把 WAIT 当失败,模拟器上看不出来 | 主机单测 `test/host/sys_log_mcu/`(TC-SYSLOG-110..122:请求侧零盘触点 / 落地只在 drain / 卷占用顺延 / 幂等 / 不误删;TC-SYSLOG-133/133b:清除成功投一条操作记录、清 oper 自己时不投)+ 台架装置维护页目检 |
|
||||
|
||||
@@ -709,7 +709,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复
|
||||
9. **日志非阻塞化:已实施·形态变更(生产者侧 2026-09-24 单写者;2026-10-25 与日志静默观察项合并评估收口)**:
|
||||
`fputc` → 环形缓冲**已落地**(4KB 环 + 单写者 + 事件位;4402µs/行 → µs 级入环,
|
||||
溢出 = 有界 200ms + dropped 账 + `[ERR]` 留痕;冲刷 = 有界裸发,见
|
||||
`../../子系统设计/控制台单写者日志设计说明.md` §4);**TX 中断/DMA 维持否决**
|
||||
`../../子系统设计/控制台单写者日志设计.md` §4);**TX 中断/DMA 维持否决**
|
||||
(该文档 D4),原绑定的复议条件(根治项落地后实测 `tx_timeout`)已随 2026-10-26 裁定不做而失效——日志静默观察项 × 日志单写者化合并评估全文
|
||||
结论见同文档文末附录;
|
||||
10. **S9** 客户端侧(DTU-RemtoeLCD):按键后立即取帧、不传 PNG(直接发 1bpp/差量 + canvas 绘制)、
|
||||
@@ -723,7 +723,7 @@ sock4 auto-relisten ok / relisten retry ok ← 监听器随后自行恢复
|
||||
+ 中断/DMA,溢出丢弃策略需定义)。
|
||||
**现状(2026-10-25)**:根治已随单写者落地——行级原子 = 临界区整行入环、单写者发出,
|
||||
交错/丢行结构性消除;「写者注册前」窗口为裸发例外,纪律 = `dbg_console_writer_ready()`
|
||||
门控(`../../子系统设计/控制台单写者日志设计说明.md` §3.4)。
|
||||
门控(`../../子系统设计/控制台单写者日志设计.md` §3.4)。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -428,7 +428,7 @@ uint16_t ch395f_link_change_count(void);
|
||||
(读侧 8 条窗口 + 写者代数失效 + API 不变)。
|
||||
这块的历史教训就是"日志读写放大"与"`mkdir` 失败静默不再重试"。
|
||||
3. **`console_log.c`(265)** —— 单写者契约 K1/K2 已经写成表,照抄成用例最省力:
|
||||
`docs/子系统设计/控制台单写者日志设计说明.md`。
|
||||
`docs/子系统设计/控制台单写者日志设计.md`。
|
||||
|
||||
### P2 落地(2026-10-24,5 个文件全部进分母,套件 28 → 33 全绿)
|
||||
|
||||
@@ -507,7 +507,7 @@ uint16_t ch395f_link_change_count(void);
|
||||
| 6 | `App/log/soe_store.c` 函数头 ④ | 注释写"打开/写入结构性错误 → `unlink` 重试一次(同 run.log)",实现里 `f_open` 失败**直接 return -1、不重试**(只有 `f_write` 失败才重试);且 `run.log` 侧 `s_append_rec` 的重试码集合还含 `FR_INVALID_NAME`/`FR_NO_PATH` → 两套自愈集合不一致。属"注释夸大实现"还是"实现少一半"待裁 | TC-SOESTORE-022 |
|
||||
| 7 | `App/cfg/cfg_file_store_mcu.c:50` | 函数头写"未挂载时 `f_open` 返回 `FR_NO_SYSTEM`"——**`FRESULT` 里没有这个码**(`Lib/FatFs/ff.h` 共 20 个码,未挂载实际是 `FR_NOT_READY`/`FR_NO_FILESYSTEM`)。只在注释里不参与编译,危害是后人照它写判据会写出永不成立的分支 | —(注释面) |
|
||||
| 8 | `App/log/console_log.c:317` vs `:285` | 冷却起点用 `s_con_cool_until = (uint32_t)HAL_GetTick()`,而判据拿 `!= 0U` 当哨兵 → 故障恰好落在 `HAL_GetTick()==0` 那一拍(开机头 1 ms,或 49.7 天回绕到 0)时**冷却等于没记**,下一轮 drain 立刻再耗一次 100 ms 块超时。撞的正是控制台域那条已登记的"背靠背块超时拖长主循环 → 喂狗节奏饥饿"。建议:另用一个"在冷却"标志,别拿 tick 值当哨兵 | TC-CONLOG-081 / 082(按现状钉) |
|
||||
| 9 | `App/log/console_log.c:394~412` | `con_append` 的**空位判据在 `taskENTER_CRITICAL` 之外**(check-then-act)。生产者按 `docs/子系统设计/控制台单写者日志设计说明.md` §3.1 是"全部任务 + 内核前主线程 + ISR",而同文档 §4.1 的 head/tail 行写作"单生产者/单写者"——**两处口径互斥,后者需要更正**。多生产者可在环 >95% 满时同时过判据 → `head` 各自推进后合计越过容量 → `con_used()` 回绕变小 → 写者少发一段,被覆盖的行**既不打 `[ERR]` 也不进 `dropped`**(静默损坏;索引恒取模,不会越界)。**这条没有用例、只报推断**:单线程宿主构造不出真抢占点(把注入点挂在 `taskENTER_CRITICAL` 上已在区内,不算抢占点) | —(无用例,仅登记) |
|
||||
| 9 | `App/log/console_log.c:394~412` | `con_append` 的**空位判据在 `taskENTER_CRITICAL` 之外**(check-then-act)。生产者按 `docs/子系统设计/控制台单写者日志设计.md` §3.1 是"全部任务 + 内核前主线程 + ISR",而同文档 §4.1 的 head/tail 行写作"单生产者/单写者"——**两处口径互斥,后者需要更正**。多生产者可在环 >95% 满时同时过判据 → `head` 各自推进后合计越过容量 → `con_used()` 回绕变小 → 写者少发一段,被覆盖的行**既不打 `[ERR]` 也不进 `dropped`**(静默损坏;索引恒取模,不会越界)。**这条没有用例、只报推断**:单线程宿主构造不出真抢占点(把注入点挂在 `taskENTER_CRITICAL` 上已在区内,不算抢占点) | —(无用例,仅登记) |
|
||||
| 10 | `App/log/console_log.c:181~183` + `:306~331` | `huart1.Instance == NULL`(HAL 早期 / 断言-故障上报路径的专用短路,返回 `HAL_ERROR`)在 drain 里被当成**僵尸通道**走 `con_uart_reinit()` → `MX_USART1_UART_Init()`(含 MspInit 的 RCC/GPIO 重配)。当前接线顺序(`MX_USART1_UART_Init` 早于 `dbg_console_writer_attach`)挡住了,但"未初始化"与"通道卡死"共用一条自愈支路,attach 时机一旦被提前就会在 HAL 未就绪时重配外设 | TC-CONLOG-103(钉现状) |
|
||||
|
||||
### 第 1 轮修复处置(2026-10-24,同日;生产码改动 + 用例翻正向)
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
> **约定**:本文事项完成后**先销上游登记**,再把结论写进正文对应小节(本文不再记流水,过程查 `git log`);
|
||||
> 结论与证据沉淀进对应模块文档/问题记录(2026-10-02 台架窗口的完整取证链——
|
||||
> IWDG PR/RLR 静默错配 / dhara resume 回滚 / ORE 僵尸通道——见 `看门狗设计说明.md` 2026-10-02 变更记录、
|
||||
> `STM32F4-Base存储架构说明.md` §5.4.1、`控制台单写者日志设计说明.md` §12;修复已随 `930215f` 提交)。
|
||||
> `STM32F4-Base存储架构说明.md` §5.4.1、`控制台单写者日志设计.md` §12;修复已随 `930215f` 提交)。
|
||||
|
||||
---
|
||||
|
||||
@@ -275,7 +275,7 @@ time_sync 触发形态,退役后该触发场景不再存在。
|
||||
- **后续(2026-10-25,道F 第二轮 合并评估)**:窗内静默的同源阻塞机制
|
||||
(`drop_conn` 同步占用 netTask 400-600ms)已随「登记式拆链」修复
|
||||
(`../../网络/网络自愈架构设计.md` §4.6);日志静默观察项与日志单写者化的合并评估已完成,结论与「无源 vs
|
||||
真停滞」判别口径落 `../../子系统设计/控制台单写者日志设计说明.md` 文末附录——
|
||||
真停滞」判别口径落 `../../子系统设计/控制台单写者日志设计.md` 文末附录——
|
||||
再现静默先按三本账(`dbg_console_dropped/_tx_fault/_tx_timeout`)+ syslog 丢弃
|
||||
账对照定性,再决定是否开卡;销项条件 = 探针窗口心跳缺口修复版 V5 复跑(e02_probe + FTP
|
||||
≥30 min)运行期 `task stall` 与真停滞嫌疑静默段双零(2026-10-25 v1.1 起
|
||||
@@ -295,7 +295,7 @@ time_sync 触发形态,退役后该触发场景不再存在。
|
||||
与传输窗抖动),予以纠正;② `task stall` 行语义 = v1.5 起「同一任务 800ms
|
||||
单串真停摆」(行文本不变,`../../子系统设计/看门狗设计说明.md` §5.3),每行都是
|
||||
真猎物;开机豁免口径(§9 第 8 条)保留、仅作用于 MISS 诊断分类。口径唯一
|
||||
来源 = `../../子系统设计/控制台单写者日志设计说明.md` 文末附录 + §9 第 8 条 +
|
||||
来源 = `../../子系统设计/控制台单写者日志设计.md` 文末附录 + §9 第 8 条 +
|
||||
看门狗设计说明——改口径先改文档再改脚本(自检断言会拦漂移)。
|
||||
|
||||
**执行步骤**:长跑(§4.2 V5)期间周期性打点 + 对照 `CH395F` 无关的 SD2506 侧日志判别卡点。
|
||||
@@ -467,7 +467,7 @@ CH395F / STORAGE / GD5F,未含 RTC;怀疑 RTC 构建下 `testTask` 不被创
|
||||
| **A2** 网络重建失败恢复 | ✅ 已闭环(正常路径零回归;故障分支见「网络负向场景台架验证」) | `网络/Net层阻塞模型架构设计.md` |
|
||||
| **A3** CH395F 字节命令超时 | ✅ 已闭环(正常路径零回归;故障分支待专项窗口) | — |
|
||||
| **A4** `remo_send` 返回值 | ✅ 已闭环(正常路径零回归;推流压测待专项窗口) | — |
|
||||
| 2026-10-02 台架取证链(IWDG PR/RLR 错配 / dhara resume 回滚 / ORE 僵尸通道) | ✅ 已修 | `子系统设计/看门狗设计说明.md` 2026-10-02 变更记录 · `架构设计/STM32F4-Base存储架构说明.md` §5.4.1 · `子系统设计/控制台单写者日志设计说明.md` §12;提交 `930215f` |
|
||||
| 2026-10-02 台架取证链(IWDG PR/RLR 错配 / dhara resume 回滚 / ORE 僵尸通道) | ✅ 已修 | `子系统设计/看门狗设计说明.md` 2026-10-02 变更记录 · `架构设计/STM32F4-Base存储架构说明.md` §5.4.1 · `子系统设计/控制台单写者日志设计.md` §12;提交 `930215f` |
|
||||
|
||||
> **真机判定汇总**(2026-10-03,本机 MCU,新固件全闭环 `@test` PASS 7/7):A1 ✅ PASS(含配置持久化);
|
||||
> A2/A3/A4 正常路径零回归;芯片级失败分支 / 短写 / 拔线负向场景待专项台架窗口(判据见 §7.1)。
|
||||
|
||||
@@ -63,7 +63,7 @@ git add -f docs/测试说明/测试数据/boot_log_data/20261012_B9_soe_after_po
|
||||
| 2026-10-10 | `prod_adc_l1` / 开机 + 30 s 空载 | `adc` **584/2048(71%)**(+56 B,语义取数与有效性层 adc_input_poll/raw 上链);`default` 2164/4096(47%);heap free=15088 min_ever=7152 | `20261010_prod_adc_l1_boot_log.txt` |
|
||||
| 2026-10-11 | `prod_phasor` / 开机 + 30 s 空载(全周傅氏相量台架闭环) | `adc` **928/2048(54%)**(+344 B,压环 + `phasor_run` + `log_phasors` 上链);`default` 2152/4096(47%);heap free=15088 min_ever=7152 | `20261011_prod_phasor_boot_log.txt` |
|
||||
| 2026-10-11 | `prod_adc_health` / 开机 + 30 s 空载(L1-6 + 抬栈 640 words) | `adc` **952/2560(62%)**(静态最坏链 1080 B,`adc_health_report`→`syslog_post` 回显尾);`default` 2152/4096(47%);heap free=14576 **min_ever=6640**(抬栈 -512 B,符合预算) | `20261011_prod_adc_health_boot_log.txt` |
|
||||
| 2026-10-12 | `prod`(HEAD d3107f3,B4/B5 验收窗口 B6)/ 开机 + 30 s 空载 | **首采**:`iec104` 424/2560(83%);`protect` 828/2048(59%,free_min 1220);新 56 KB 堆 heap free=17936 **min_ever=10000**(>3072 告警线,无 `[HEAP]` 告警);⚠ **@test FAIL(缺陷证据快照)**:`protect task start` 锚点行字节级交错损坏(`st[art: cycle=220ms elm=70`,两次开机同形复现)= protectTask 违反控制台写者注册前门控纪律(`控制台单写者日志设计说明.md` §3.4),其余 8 Required / 零 `[ERR]` / 锚点×1 / 回读一致全过;**缺陷已修**(启动行改 writer-ready 首拍补打),修复后 PASS 见下行 | `20261012_B6_prod_boot_log_PROTECT_MISS.txt` |
|
||||
| 2026-10-12 | `prod`(HEAD d3107f3,B4/B5 验收窗口 B6)/ 开机 + 30 s 空载 | **首采**:`iec104` 424/2560(83%);`protect` 828/2048(59%,free_min 1220);新 56 KB 堆 heap free=17936 **min_ever=10000**(>3072 告警线,无 `[HEAP]` 告警);⚠ **@test FAIL(缺陷证据快照)**:`protect task start` 锚点行字节级交错损坏(`st[art: cycle=220ms elm=70`,两次开机同形复现)= protectTask 违反控制台写者注册前门控纪律(`控制台单写者日志设计.md` §3.4),其余 8 Required / 零 `[ERR]` / 锚点×1 / 回读一致全过;**缺陷已修**(启动行改 writer-ready 首拍补打),修复后 PASS 见下行 | `20261012_B6_prod_boot_log_PROTECT_MISS.txt` |
|
||||
| 2026-10-12 | `prod`(B7 `1fe163b` + B6 门控修复)/ 开机 + 30 s 空载(**B6 复测 PASS**) | `protect` 828/2048(59%,free_min 1220);`iec104` 424/2560(83%);heap free=17936 **min_ever=10000**(**N-33 抬栈 min_ever 背书就绪**);锚点行完好 `cycle=20ms elm=7`(+577 ms,写者 attach 后首拍);零 `[ERR]`、采样闭锁不误报 | `20261012_B6_prod_boot_log.txt` |
|
||||
| 2026-10-12 | 同 MISS 固件(d3107f3)/ **PC 主站 2404 往返**(`test/host/iec104_master.py`) | STARTDT/总召四组+actterm/C_SE 两段写触发 YX15·16 变位(COT=3)/恢复复归/YK11 两段正答/C_RD 读回 10.000 → **18/18 PASS**(104 链与锚点缺陷无关,验收窗口固件本身上先行闭环) | `20261012_B6_iec104_roundtrip_pre-fix_log.txt` |
|
||||
| 2026-10-12 | 同 PASS 固件(B7+fix)/ **PC 主站 2404 往返**(复测) | 同上全链 18/18 PASS——B7 `set_sealed`+持久化写路径下 C_SE→YX 联动仍成立(B5 遗留"104 YX 联动"腿闭环) | `20261012_B6_iec104_roundtrip_log.txt` |
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
## 2. 为什么要它
|
||||
|
||||
2026-10-29 落库的 `docs/子系统设计/屏板链路设计说明.md` §1 flowchart 里,一行带文字点线写成:
|
||||
2026-10-29 落库的 `docs/子系统设计/屏板链路设计.md` §1 flowchart 里,一行带文字点线写成:
|
||||
|
||||
```
|
||||
S -.|"组帧 OK 且本拍注过键 → 交凭据"| T ← 坏:`-.` 后直接跟管道,`-.|` 不是箭头 token
|
||||
|
||||
Reference in New Issue
Block a user