feat(屏板): 状态灯位映射 sb_led_map + 104 RUN 观测口(批 3);附 4-1 并发压测脚本

批 3(LOGO 按用户裁定出局,不实现、sb_proto 的 LOGO 组帧挂待删标注):
- 新增 App/algo/sb_led_map.c/h:业务状态 → 屏板 LED 位掩码的唯一映射表
  (纯逻辑,主机单测可跑)。ID1 运行心跳 500ms 半周期闪(与主板 LED 同拍)、
  ID2 保护动作、ID3 104 链路 RUN、ID4 采样电平故障(不选 sticky——灯要能灭)、
  ID5 保护启动 picked;bit0 与 ID 6~19 恒 0。这张表参考源码里没有,属自定,
  出处 docs/产品需求/产品需求设计文档.md §5.16.3 ①。
- iec104_serv 新增 iec104_serv_link_run()(透传 link 状态机,不另存镜像量)。
- ui_task.c 帧组装块每拍现采四路状态源(均为任意上下文可读观测口)折算后
  传 sb_link_frame_update——替换批 2 的恒 0 占位;掩码变了帧就重组,
  复用 busy/dirty 机制,无新通路。
- 主机单测 test/host/sb_led_map 17/17(位语义/恒零位/闪烁相位/tick 回绕/
  NULL 契约);注册豁免走 SIM_EXEMPT(模拟器无屏板串口)。

批 4 的 4-1 双通道并发回归(真屏板在线实测):
- 新增 test/host/remolcd_pull_test.py:RemoDispBus 拉帧压测客户端
  (INIT→LCDMEM 10 Hz、逐帧 XOR+长度校验、往返延迟统计、--dump PBM)。
- 实测:网络侧两轮 2200 拉帧零错零超时(min 35/avg 63/max 131 ms);
  屏板侧 60 s 隔离窗口 rx +233 全收、drop 零新增、bad=0、off=0、无
  OFFLINE——两侧互不拖。观察项 len=7(断帧尺寸≠6,累计 7 次)出现窗口
  无法归因压测、隔离窗口零新增、有效帧零损失,已挂设计说明 §5.7 待查。

附带:sb_link.h frame_update 注释回填实测耗时(509/688 µs 取代旧估算)。
Keil 0 错误 0 警告;ci_local 全绿(SKIP=nested-comment,主树脚本另查 0 新发);
Code=239,064 B / RW_IRAM1 65.5 % / RW_CCM 87.9 %;覆盖率 90.1 % / 44 套件。
This commit is contained in:
2026-10-30 00:39:57 +08:00
parent 9c6d150261
commit 0b84c43d2e
17 changed files with 768 additions and 39 deletions
+1
View File
@@ -98,6 +98,7 @@ SIM_EXEMPT = [
("App/algo/adc_cal.c", "标定折算纯算法 + cfg 段注册(消费者 = MCU 侧 adcTask 每拍;模拟器不跑采样任务),模拟器无消费路径"),
("App/algo/meas.c", "测频与遥测快照发布纯算法(唯一发布者 = MCU 侧 adcTask 200 ms 分频;104 改读快照与 UI 侧消费属另一波次另行接线,模拟器无消费路径;主机侧纯逻辑单测 test/host/meas 覆盖),模拟器无消费路径"),
("App/algo/run_par.c", "运行参数段纯算法 + [run_par] cfg 段注册 + 104 地址映射(写者 = iec104Task 直通、属主落盘 defaultTask;模拟器不跑 104 协议,模拟器无消费路径;主机侧纯逻辑单测 test/host/run_par 覆盖),模拟器无消费路径"),
("App/algo/sb_led_map.c", "屏板状态灯位映射纯算法(唯一消费者 = MCU 侧 uiTask 经 sb_link 组帧;模拟器无屏板串口,模拟器无消费路径;主机侧纯逻辑单测 test/host/sb_led_map 覆盖),模拟器无消费路径"),
("App/app/app_main.c", "固件启动/就绪屏障,MCU 专属"),
("App/app/ui_data_feed.c", "UI 快照装配器(依赖 phasor/prot_set/iec104 端口常量等固件侧数据源);模拟器不跑装配链,快照由 simulator/main.c 直接发布固定帧,模拟器无消费路径"),
("App/fs/vol_lock.c", "FreeRTOS 互斥量卷锁,MCU 专属"),
+1
View File
@@ -12,3 +12,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
2026-10-27 235372 26392 1572 136924 261764 25.0 81072 61.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055;default_task.o=2736
2026-10-28 236456 28124 1876 137084 264580 25.2 81536 62.2 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055;default_task.o=2736
2026-10-29 238936 29140 1932 141396 268076 25.6 85904 65.5 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;sb_link.o=4364;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055
2026-10-30 239064 29156 1932 141396 268220 25.6 85904 65.5 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;sb_link.o=4364;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055
1 date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
12 2026-10-27 235372 26392 1572 136924 261764 25.0 81072 61.9 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055;default_task.o=2736
13 2026-10-28 236456 28124 1876 137084 264580 25.2 81536 62.2 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055;default_task.o=2736
14 2026-10-29 238936 29140 1932 141396 268076 25.6 85904 65.5 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;sb_link.o=4364;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055
15 2026-10-30 239064 29156 1932 141396 268220 25.6 85904 65.5 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;sb_link.o=4364;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055
+9 -9
View File
@@ -1,17 +1,17 @@
{
"built_at": "2026-10-29T20:54:02+08:00",
"fingerprint": "1297b04cfaed4c9b8c30a1fcc64608932d3d047a32ad687274a6eac40bc4ca45",
"fingerprint_files": 1456,
"built_at": "2026-10-30T00:21:57+08:00",
"fingerprint": "1cbc1bc0c030169d1851e6303e0d643ae1f01632f03883215557416e7f3eb4ee",
"fingerprint_files": 1458,
"fingerprint_source": "git-index",
"gated_regions": [
"RW_IRAM1",
"RW_CCM"
],
"git_head": "e5b4182a9f02dfe9f1f06dd58d086f64a157cc5c",
"git_head": "9c6d150261caacd1a3ff835d2830f706e9de2bf7",
"map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map",
"map_mtime": 1793278440,
"map_mtime": 1793290914,
"pct": {
"ER_IROM1": 25.57,
"ER_IROM1": 25.58,
"RW_CCM": 87.89,
"RW_IRAM1": 65.54,
"UNINIT_CCM": 18.75
@@ -19,7 +19,7 @@
"regions": {
"ER_IROM1": {
"max": 1048576,
"size": 268076
"size": 268220
},
"RW_CCM": {
"max": 65280,
@@ -37,8 +37,8 @@
"schema": 2,
"scope_note": "\u540c\u7801\u51ed\u8bc1\uff1a\u6307\u7eb9\u8986\u76d6\u56fa\u4ef6\u4f53\u79ef\u76f8\u5173\u6e90\u7801\uff0c\u53e3\u5f84\u89c1\u672c\u811a\u672c docstring",
"sizes": {
"code": 238936,
"ro_data": 29140,
"code": 239064,
"ro_data": 29156,
"rw_data": 1932,
"zi_data": 141396
},
+41 -21
View File
@@ -80,6 +80,14 @@
"lines_covered": 41,
"lines_valid": 41
},
"App/algo/sb_led_map.c": {
"func_rate": 1.0,
"funcs_covered": 1,
"funcs_valid": 1,
"line_rate": 1.0,
"lines_covered": 15,
"lines_valid": 15
},
"App/cfg/cfg_file.c": {
"func_rate": 0.963,
"funcs_covered": 26,
@@ -193,12 +201,12 @@
"lines_valid": 100
},
"App/task/iec104_serv.c": {
"func_rate": 0.8182,
"func_rate": 0.75,
"funcs_covered": 9,
"funcs_valid": 11,
"line_rate": 0.7706,
"funcs_valid": 12,
"line_rate": 0.7572,
"lines_covered": 131,
"lines_valid": 170
"lines_valid": 173
},
"App/util/boot_stats.c": {
"func_rate": 1.0,
@@ -482,9 +490,9 @@
},
"iec104_serv": {
"files": {
"App/task/iec104_serv.c": 170
"App/task/iec104_serv.c": 173
},
"lines_total": 170,
"lines_total": 173,
"ok": true
},
"lftpd": {
@@ -623,6 +631,13 @@
"lines_total": 961,
"ok": true
},
"sb_led_map": {
"files": {
"App/algo/sb_led_map.c": 15
},
"lines_total": 15,
"ok": true
},
"sb_link": {
"files": {
"Drivers/BSP/ScreenLink/sb_link.c": 207,
@@ -739,6 +754,7 @@
"App/algo/prot_set.c",
"App/algo/run_par.c",
"App/algo/sample_ring.c",
"App/algo/sb_led_map.c",
"App/cfg/cfg_file.c",
"App/cfg/cfg_file_store_mcu.c",
"App/cfg/prot_set_store.c",
@@ -780,16 +796,16 @@
],
"totals": {
"files_generated_excluded": 5,
"files_tested": 48,
"files_untested": 165,
"func_rate": 0.9339,
"funcs_covered": 551,
"funcs_valid": 590,
"line_rate": 0.9011,
"lines_covered": 7334,
"lines_valid": 8139,
"modules_ok": 43,
"modules_total": 43
"files_tested": 49,
"files_untested": 166,
"func_rate": 0.9324,
"funcs_covered": 552,
"funcs_valid": 592,
"line_rate": 0.9009,
"lines_covered": 7349,
"lines_valid": 8157,
"modules_ok": 44,
"modules_total": 44
},
"untested_sources": [
{
@@ -833,7 +849,7 @@
"path": "App/task/adc_task.c"
},
{
"code_lines": 245,
"code_lines": 253,
"path": "App/task/ui_task.c"
},
{
@@ -1116,6 +1132,10 @@
"code_lines": 27,
"path": "Drivers/BSP/UI/ui_w_setview.h"
},
{
"code_lines": 26,
"path": "App/algo/sb_led_map.h"
},
{
"code_lines": 26,
"path": "App/util/task_prof.h"
@@ -1264,6 +1284,10 @@
"code_lines": 12,
"path": "App/app/app_main.h"
},
{
"code_lines": 12,
"path": "App/task/iec104_serv.h"
},
{
"code_lines": 12,
"path": "Drivers/BSP/GD5F2GQ5UE/nand_ftl.h"
@@ -1280,10 +1304,6 @@
"code_lines": 11,
"path": "App/sync/time_sync.h"
},
{
"code_lines": 11,
"path": "App/task/iec104_serv.h"
},
{
"code_lines": 11,
"path": "App/task/net_task.h"