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:
@@ -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 专属"),
|
||||
|
||||
@@ -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,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
|
||||
},
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user