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:
2026-11-15 21:51:24 +08:00
parent f5902bcc21
commit 1634088bd7
42 changed files with 131 additions and 259 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
/*
* 模块名称:控制台单写者日志(console_log)主机侧单元测试
* 模块功能:在 PC 上离线验证 App/log/console_log.c 的单写者契约(G1~G5 / K1~K5,见
* docs/子系统设计/控制台单写者日志设计说明.md):环形缓冲入环与分块发送、
* docs/子系统设计/控制台单写者日志设计.md):环形缓冲入环与分块发送、
* 行级原子、192B 截断、写者未注册/ISR 上下文的直发(未注册期自 2026-10-26
* 起是**整行独占**,不再是"无锁":M 族 TC-CONLOG-170 至 TC-CONLOG-179 钉"别的写者插不进
* 一行、让路行逐字节等同直发、让位不丢、真溢出才 [ERR]")、缓冲满有界等待与
+2 -2
View File
@@ -23,7 +23,7 @@
这些在台架上
要么一年一遇、要么现场已被复位冲掉;把 100/250/300ms 三条时间线做成显式量之后,
299ms 与 300ms 的差别就是一行断言。详见
docs/子系统设计/控制台单写者日志设计说明.md(G1~G5 / K1~K5 / §12 ORE 僵尸通道)。
docs/子系统设计/控制台单写者日志设计.md(G1~G5 / K1~K5 / §12 ORE 僵尸通道)。
桩的边界:console_log.h 与 sys_events.h 用真实头(SYS_EVT_CONSOLE_TX 位定义一改即
编译期报错);usart.h 是桩但只暴露本模块访问的 huart5 + MX_UART5_Init,
@@ -38,7 +38,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/子系统设计/控制台单写者日志设计说明.md、docs/测试说明/单元测试/主机单测覆盖率口径.md §9「P2 落地」清单第 3 条
设计依据:docs/子系统设计/控制台单写者日志设计.md、docs/测试说明/单元测试/主机单测覆盖率口径.md §9「P2 落地」清单第 3 条
创建日期:2026-10-24
"""
import os
+1 -1
View File
@@ -30,7 +30,7 @@
退出码:0 = 全程无超时且 CRC 全对;1 = 出现超时/CRC 错/断连;2 = 用法错误。
设计依据:docs/子系统设计/屏板链路设计说明.md §9.1(双通道并发)。
设计依据:docs/子系统设计/屏板链路设计.md §9.1(双通道并发)。
创建日期:2026-10-30
"""
import argparse
+1 -1
View File
@@ -16,7 +16,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误。
设计依据:docs/子系统设计/屏板链路设计说明.md §6(状态灯映射表)。
设计依据:docs/子系统设计/屏板链路设计.md §6(状态灯映射表)。
创建日期:2026-10-29
"""
import os
+1 -1
View File
@@ -28,7 +28,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:docs/子系统设计/屏板链路设计说明.md §2(收中断与错误处理判据、接收只要 16 B);
设计依据:docs/子系统设计/屏板链路设计.md §2(收中断与错误处理判据、接收只要 16 B);
docs/产品需求/产品需求设计文档.md §5.16.2(帧 A 结构)。
创建日期:2026-10-29
"""
+3 -3
View File
@@ -17,7 +17,7 @@
* 3. 坏帧分支(长度不对 / 地址不对 / 功能码不对 / CRC 错)在台架上要造噪声才出现,
* 一出现就被复位冲掉;主机侧是几行断言。
*
* 覆盖点(对应 docs/子系统设计/屏板链路设计说明.md §2 的收中断与错误处理判据):
* 覆盖点(对应 docs/子系统设计/屏板链路设计.md §2 的收中断与错误处理判据):
* TC-SBLINK-001 init 参数守卫:空句柄 / 波特率不是 SB_LINK_BAUD(后者必须不挂接收)
* TC-SBLINK-002 init 正常:挂接收一次、缓冲 = SB_LINK_RX_BUF_SIZE(16 B,不是 4208)
* TC-SBLINK-003 未初始化就重挂接收:BSP_ERR_STATE,且不碰外设
@@ -34,7 +34,7 @@
* TC-SBLINK-013 统计上报的时基回绕:now_ms 跨 0xFFFFFFFF 仍按差值法工作
* TC-SBLINK-014 统计快照:空指针守卫、字段逐项对得上
*
* 覆盖点(对应 docs/子系统设计/屏板链路设计说明.md §4 的组帧与时序判据):
* 覆盖点(对应 docs/子系统设计/屏板链路设计.md §4 的组帧与时序判据):
* TC-SBLINK-016 组帧入口守卫:未初始化 / 空显存指针
* TC-SBLINK-017 帧 B 内容:点阵逐字节、info[0..3] 小端掩码、info[4..7] 非 LOGO、
* 998 B 填充全 0、CRC 覆盖 [0, 4205]
@@ -49,7 +49,7 @@
* TC-SBLINK-026 上报行:fb/tx 列可见;离线行排在周期行之前且不重复
*
* 覆盖点(2026-10-30 按键延迟整治:按键召唤延迟应答,
* docs/子系统设计/屏板链路设计说明.md §7.1):
* docs/子系统设计/屏板链路设计.md §7.1):
* TC-SBLINK-030 按键召唤不立刻起发:扣住本答、键照常进队、不误记丢单
* TC-SBLINK-031 放行链:画面更新 + 组帧 OK + key_rendered 凭据 → 下一拍发一帧、
* dfok 计数、放行后不再复发的
+1 -1
View File
@@ -28,7 +28,7 @@
退出码:0=PASS / 1=测试失败 / 2=环境错误(找不到编译器 / 编译失败 / 无汇总行)。
设计依据:docs/产品需求/产品需求设计文档.md §5.16.2(帧结构);
docs/子系统设计/屏板链路设计说明.md §4(CRC 口径);
docs/子系统设计/屏板链路设计.md §4(CRC 口径);
协议事实源 = 屏板固件工程 D:\\Code\\DTU Code\\DTU-LCD 的 CRC16.c / MODBUS.c。
创建日期:2026-10-29
"""
+3 -50
View File
@@ -12,7 +12,7 @@
* 完全同形,无法归因。主机侧把 CRC 与字节序钉死,才谈得上"发出去的就是对的"。
* 2. 帧 A 的坏帧分支(长度不对 / 地址不对 / 功能码不对 / CRC 错)在台架上要造噪声才可能出现,
* 且一出现就被复位冲掉;主机侧是几行断言。
* 3. 帧 B 4208 B 的边界(填充段参与 CRC、LOGO 宽高装不下点阵)不占 MCU 的 RAM,毫秒级。
* 3. 帧 B 4208 B 的边界(填充段参与 CRC、整帧重写)不占 MCU 的 RAM,毫秒级。
*
* 覆盖点(对应 docs/产品需求/产品需求设计文档.md §5.16.2 帧结构与任务规划 1-1 判据):
* TC-SBPROTO-001 CRC-16/MODBUS 教科书校验值:"123456789" -> 0x4B37
@@ -26,9 +26,7 @@
* TC-SBPROTO-014 帧 A 参数守卫:空指针两路;失败时不动 *p_out
* TC-SBPROTO-020 帧 B 普通图:点阵逐字节、掩码小端、info[4..7] 为 0、填充段全 0、CRC 自校验
* TC-SBPROTO-021 帧 B 普通图:整帧重写(预填 0xAA 的缓冲被清干净)、重复组帧结果一致
* TC-SBPROTO-022 帧 B LOGO:宽高大端、魔数 0x89 0x45、info[6..7] 为 0、CRC 自校验
* TC-SBPROTO-023 帧 B LOGO 宽高守卫:161x159 与 160x161 被拒(按字节数判容量)、宽或高为 0 被拒
* TC-SBPROTO-024 帧 B 参数守卫:空指针三处
* TC-SBPROTO-024 帧 B 参数守卫:空指针两处
* TC-SBPROTO-030 帧 B 自校验:改点阵 / 改填充段 / 改 CRC 自身 / 长度不对
* TC-SBPROTO-040 屏板侧视角:用屏板 Check_CRC 的口径(高低互换后比对)复核本模块组的两种帧
*
@@ -323,7 +321,7 @@ static void tc_frame_b_image(void)
CHECK((s_frame[SB_FRAME_B_INFO_OFF + 4U] == 0U) && (s_frame[SB_FRAME_B_INFO_OFF + 5U] == 0U) &&
(s_frame[SB_FRAME_B_INFO_OFF + 6U] == 0U) && (s_frame[SB_FRAME_B_INFO_OFF + 7U] == 0U),
"TC-SBPROTO-020d info[4..7] stay 0 for a normal picture (the LOGO magic must not leak in)");
"TC-SBPROTO-020d info[4..7] stay 0 for a normal picture (reserved bytes)");
for (i = SB_FRAME_B_PAD_OFF; i < SB_FRAME_B_CRC_OFF; i++)
{
@@ -371,44 +369,7 @@ static void tc_frame_b_rewrite(void)
"TC-SBPROTO-021d the same inputs give a byte-identical frame (idempotent)");
}
static void tc_frame_b_logo(void)
{
fill_bmp_pattern();
CHECK(sb_frame_b_build_logo(s_frame, s_bmp, 160U, 160U) == BSP_OK,
"TC-SBPROTO-022 building a 160x160 LOGO frame succeeds");
CHECK((s_frame[SB_FRAME_B_INFO_OFF + 0U] == 0x00U) && (s_frame[SB_FRAME_B_INFO_OFF + 1U] == 0xA0U) &&
(s_frame[SB_FRAME_B_INFO_OFF + 2U] == 0x00U) && (s_frame[SB_FRAME_B_INFO_OFF + 3U] == 0xA0U),
"TC-SBPROTO-022b width and height go into info[0..3] big-endian");
CHECK((s_frame[SB_FRAME_B_INFO_OFF + 4U] == 0x89U) && (s_frame[SB_FRAME_B_INFO_OFF + 5U] == 0x45U),
"TC-SBPROTO-022c the LOGO magic 0x89 0x45 sits in info[4..5]");
CHECK((s_frame[SB_FRAME_B_INFO_OFF + 6U] == 0U) && (s_frame[SB_FRAME_B_INFO_OFF + 7U] == 0U),
"TC-SBPROTO-022d info[6..7] stay 0 (reserved)");
CHECK(sb_frame_b_verify(s_frame, (uint16_t)SB_FRAME_B_LEN) == BSP_OK,
"TC-SBPROTO-022e the LOGO frame verifies");
CHECK(screen_board_accepts(s_frame, (uint16_t)SB_FRAME_B_LEN) == 1,
"TC-SBPROTO-040b the board side Check_CRC accepts the LOGO frame");
/* 小图也要能组:1x1 只需 1 字节点阵 */
CHECK(sb_frame_b_build_logo(s_frame, s_bmp, 1U, 1U) == BSP_OK,
"TC-SBPROTO-022f a 1x1 LOGO is accepted (the capacity check is about bytes, not pixels)");
}
static void tc_frame_b_logo_guard(void)
{
fill_bmp_pattern();
/* 161x159 = 25599 像素(看起来"装得下"),实际要 21x159 = 3339 B > 3200 B */
CHECK(sb_frame_b_build_logo(s_frame, s_bmp, 161U, 159U) == BSP_ERR_PARAM,
"TC-SBPROTO-023 161x159 is rejected: 3339 bytes of bitmap do not fit in 3200");
CHECK(sb_frame_b_build_logo(s_frame, s_bmp, 160U, 161U) == BSP_ERR_PARAM,
"TC-SBPROTO-023b 160x161 is rejected (3220 bytes)");
CHECK(sb_frame_b_build_logo(s_frame, s_bmp, 168U, 152U) == BSP_OK,
"TC-SBPROTO-023c 168x152 is accepted (exactly 3192 bytes, width not a multiple of 8 is fine)");
CHECK(sb_frame_b_build_logo(s_frame, s_bmp, 0U, 160U) == BSP_ERR_PARAM,
"TC-SBPROTO-023d a zero width is rejected");
CHECK(sb_frame_b_build_logo(s_frame, s_bmp, 160U, 0U) == BSP_ERR_PARAM,
"TC-SBPROTO-023e a zero height is rejected");
}
static void tc_frame_b_guard(void)
{
@@ -418,10 +379,6 @@ static void tc_frame_b_guard(void)
"TC-SBPROTO-024 a null frame buffer is rejected (image)");
CHECK(sb_frame_b_build_image(s_frame, 0, 0U) == BSP_ERR_PARAM,
"TC-SBPROTO-024b a null bitmap is rejected (image)");
CHECK(sb_frame_b_build_logo(0, s_bmp, 160U, 160U) == BSP_ERR_PARAM,
"TC-SBPROTO-024c a null frame buffer is rejected (LOGO)");
CHECK(sb_frame_b_build_logo(s_frame, 0, 160U, 160U) == BSP_ERR_PARAM,
"TC-SBPROTO-024d a null bitmap is rejected (LOGO)");
CHECK(sb_frame_b_verify(0, (uint16_t)SB_FRAME_B_LEN) == BSP_ERR_PARAM,
"TC-SBPROTO-024e a null frame is rejected by verify");
}
@@ -475,10 +432,6 @@ int main(void)
tc_frame_b_image();
printf("-- frame B: full-frame rewrite / idempotence --\n");
tc_frame_b_rewrite();
printf("-- frame B: LOGO (width/height + magic) --\n");
tc_frame_b_logo();
printf("-- frame B: LOGO capacity guard --\n");
tc_frame_b_logo_guard();
printf("-- frame B: argument guards --\n");
tc_frame_b_guard();
printf("-- frame B: self-verification --\n");
+2 -2
View File
@@ -20,7 +20,7 @@
的间隙"(那是屏板断帧的硬约束,只能上逻辑分析仪或接真屏板时看)。别把 span 通过
当成那条判据通过。
接法(docs/子系统设计/屏板链路设计说明.md §3.3):
接法(docs/子系统设计/屏板链路设计.md §3.3):
适配器 TXD -> U5.B10(网络 ST_RX0,PA10) 适配器 RXD -> U5.A10(网络 ST_TX0,PA9)
适配器 GND -> 板地
⚠ 必须交叉接(TX 对 RX);USART1 的 TTL 只从 U5 出去,CN1 上没有 USART1 端子。
@@ -41,7 +41,7 @@
退出码:0 = 按时发完且(`--reply` 时)所有应答都对;1 = 串口打不开 / 发送失败;
2 = 用法错误;3 = 有应答不合格。
设计依据:docs/子系统设计/屏板链路设计说明.md §2(接收判据)、§4(发送口径)、§3.3(台架接法)。
设计依据:docs/子系统设计/屏板链路设计.md §2(接收判据)、§4(发送口径)、§3.3(台架接法)。
创建日期:2026-10-29
"""
import argparse