diff --git a/App/task/ui_task.c b/App/task/ui_task.c index 2149ecc9..823feff1 100644 --- a/App/task/ui_task.c +++ b/App/task/ui_task.c @@ -32,6 +32,13 @@ * /clear_state 直通)并在 ui_menu_init 之前注入;记录 * reader 的 2 条 if 链改成 7 条映射表 s_log_map,并加 * 编译期守卫把 UI_W_REC_LOG_* == syslog_id_t 枚举序钉死 + * v1.6 2026-11-02 DTU 项目组 修复「回放页段表枚举恒空」第一幕(登记簿同名 + * 条目 + docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3): + * ui_task_wave_scan 失败不再无条件钉 s_wave_scanned—— + * opendir/readdir 失败本轮返 -1(卷忙语义),下一次进页/ + * 按键自然重试;失败分支与「FR_OK 零条目」补带 FR 码留痕 + * (DBG_TAG [UIWAVE])供板级远程定性根因。FR_NO_PATH + * (从未录过波)归 0 段并钉表的设计原口径不动。 */ #include "ui_task.h" @@ -73,6 +80,14 @@ #include "task_prof.h" /* P2 常开探针:循环周期 / 工作耗时 / 推流往返 */ #include "sb_link.h" /* 屏板链路:帧 B 组帧 / 按键出队 / 统计与离线判定(批 2) */ +/* 枚举留痕(v1.6,第一幕埋点):dbg_log.h 原在文件后段(s_wave_ops 之后)才 + * 被包含,随本波把 DBG_TAG 定义 + 包含一并上收到包含区(原后段两处删除, + * 同标签同宏,不构成行为改动);本波只在原先静默返回的黑洞处补锚点, + * 不新增重复日志(DBG_* 每条调用点约 90B Flash + 行缓冲栈)。 + * 留痕行以「ui wave scan」正文前缀区分来源。 */ +#define DBG_TAG "[UI_TASK]" +#include "dbg_log.h" + /* * 函数功能:待机屏底部时钟提供回调(平台差异:MCU = sys_clock_get_str) * 入口参数:buf - 时间串输出缓冲 char * @@ -421,27 +436,46 @@ static uint8_t s_wave_buf[256u]; /* 读窗:数据区流式 256B/次 /* * 函数功能:重扫 /wave 目录,把现存段号收集成升序表 * 入口参数:无 - * 返回值:0 - 扫描完成(条数见 s_wave_cnt);-1 - 卷忙本轮跳过 int + * 返回值:0 - 扫描完成(条数见 s_wave_cnt);-1 - 本轮无完整事实(卷忙,或 + * f_opendir/f_readdir 失败),不钉表,下一次取数自然重试 int * 限定条件:uiTask;一次 f_opendir + 有界 f_readdir,全程锁内 - * 函数说明:目录不存在(从未录过波)与目录空都归「0 段」,不是错误; + * 函数说明:目录不存在(FR_NO_PATH,从未录过波)与目录空都归「0 段」并钉表, + * 不是错误(设计原口径);其余 f_opendir/f_readdir 失败一律不钉表 + * (v1.6:原实现失败也无条件置 s_wave_scanned=1,卷忙 / FR_DENIED + * 一类失败被钉成「0 段」假空态直到下一次 manual_req,登记簿 + * 「回放页段表枚举恒空」处置方向 = 失败不钉表、下键重试,与 + * soe_store 读者同纪律)。失败留痕带 FR 码,板级判读表(FR_DENIED + * → 锁纪律;FR_NOT_READY → 挂载;FR_OK 但零条目 → readdir 与卷状态 + * 交互)见 docs/测试说明/专项验证/故障录波板级到场轮执行手册.md §3。 * 名字不合形态的文件(E_NAME)静默跳过——那是别的道写进来的 * 东西,回放页不替它背书也不报警 */ static int ui_task_wave_scan(void) { static DIR dir; /* static:同 FIL 理由,压栈深 */ FILINFO finfo; + FRESULT fr; + FRESULT rr = FR_OK; uint8_t idx; uint8_t i; + uint8_t full; /* 1 = 本轮拿到完整事实,允许钉表 */ if (vol_lock_wait(0u) == 0u) { return -1; } s_wave_cnt = 0u; - if (f_opendir(&dir, WAVE_ST_DIR) == FR_OK) { + full = 0u; + fr = f_opendir(&dir, WAVE_ST_DIR); + if (fr == FR_OK) { + full = 1u; for (;;) { - if (f_readdir(&dir, &finfo) != FR_OK || finfo.fname[0] == '\0') { + rr = f_readdir(&dir, &finfo); + if (rr != FR_OK) { + full = 0u; /* 半截表不钉:本轮作废重来 */ break; } + if (finfo.fname[0] == '\0') { + break; /* 目录正常走完 */ + } if (finfo.fattrib & AM_DIR) { continue; } @@ -451,9 +485,25 @@ static int ui_task_wave_scan(void) { } } } - f_closedir(&dir); + (void)f_closedir(&dir); + if (full == 0u) { + DBG_ERROR("ui wave scan readdir fail fr=%d got=%u", (int)rr, + (unsigned)s_wave_cnt); + } + } else if (fr == FR_NO_PATH) { + full = 1u; /* 从未录过波 = 0 段,完整事实 */ + } else { + DBG_ERROR("ui wave scan opendir fail fr=%d", (int)fr); } vol_lock_release(); + if (full == 0u) { + s_wave_cnt = 0u; /* 半截计数不外泄:本轮按「无段」显示 */ + return -1; + } + if (s_wave_cnt == 0u) { + /* 判读表第三条(FR_OK 但零条目):钉盘级证据,供板级远程定性 */ + DBG_INFO("ui wave scan done: dir ok, 0 seg entries"); + } /* 插入排序:条数上限 100,不引 qsort 的 stdlib 依赖 */ for (i = 1u; i < s_wave_cnt; i++) { uint8_t j; @@ -839,9 +889,6 @@ static void ui_task_sink_beat(void) { task_wd_beat(TASK_WD_UI); } -#define DBG_TAG "[UI_TASK]" -#include "dbg_log.h" - /* * 函数功能:等待网络就绪事件 * 入口参数:无 diff --git a/docs/内存管理/RAM使用分析与优化方案.md b/docs/内存管理/RAM使用分析与优化方案.md index ad927422..05156c76 100644 --- a/docs/内存管理/RAM使用分析与优化方案.md +++ b/docs/内存管理/RAM使用分析与优化方案.md @@ -47,10 +47,10 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1` | 区域 | 用量 | 容量 | 占比 | |---|---|---|---| -| ER_IROM1 | 276,556 B (270.07 KB) | 1,048,576 B (1024 KB) | 26.4% | +| ER_IROM1 | 276,884 B (270.39 KB) | 1,048,576 B (1024 KB) | 26.4% | | RW_IRAM1 | 94,336 B (92.12 KB) | 131,072 B (128 KB) | 72.0% | | RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% | -| **Flash (ROM 合计)** | **278,608 B (272.1 KB)** | 1,048,576 B (1024 KB) | **26.6%** | +| **Flash (ROM 合计)** | **278,936 B (272.4 KB)** | 1,048,576 B (1024 KB) | **26.6%** | 各区的容量与常量来源: diff --git a/docs/内存管理/RAM预算台账.md b/docs/内存管理/RAM预算台账.md index 2465297a..e9c76b1f 100644 --- a/docs/内存管理/RAM预算台账.md +++ b/docs/内存管理/RAM预算台账.md @@ -15,7 +15,7 @@ | 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) | |---|---|---|---|---| -| ER_IROM1 (Flash) | 276,556 B | 1,048,576 B | 26.4% | 参考 | +| ER_IROM1 (Flash) | 276,884 B | 1,048,576 B | 26.4% | 参考 | | RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS | | UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 | | RW_IRAM1 | 94,336 B | 131,072 B | 72.0% | PASS | diff --git a/scripts/ram_baseline.tsv b/scripts/ram_baseline.tsv index 0091875a..aeddb591 100644 --- a/scripts/ram_baseline.tsv +++ b/scripts/ram_baseline.tsv @@ -14,3 +14,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi 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-29 243552 28784 1972 145388 272336 26.0 89936 68.6 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;wave_ring.o=5296;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4055 2026-10-30 246720 29836 2052 149708 276556 26.4 94336 72.0 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6432;nand_ftl.o=6216;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 +2026-11-02 247048 29836 2052 149708 276884 26.4 94336 72.0 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6432;nand_ftl.o=6216;wave_ring.o=5296;sb_link.o=4376;ch395f.o=4162;console_log.o=4132 diff --git a/scripts/size_attestation.json b/scripts/size_attestation.json index 68797493..5b5793ec 100644 --- a/scripts/size_attestation.json +++ b/scripts/size_attestation.json @@ -1,17 +1,17 @@ { - "built_at": "2026-11-02T14:32:47+08:00", - "fingerprint": "c5294354ba3e05e51882676c7edddf995852d114c6f6413016e49adc7f6ac2a6", + "built_at": "2026-11-02T16:13:12+08:00", + "fingerprint": "66b6a154966ac9ce651c778bf07c79ae02f469e1cebf1f7e3f8d21a4eaf24500", "fingerprint_files": 1466, "fingerprint_source": "git-index", "gated_regions": [ "RW_IRAM1", "RW_CCM" ], - "git_head": "e63abb919a5934511ffc7e8fea2c5b86dbfc70fc", + "git_head": "cf8b9ccc74372378cb39e232266d3708b344db1f", "map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map", - "map_mtime": 1793600487, + "map_mtime": 1793604778, "pct": { - "ER_IROM1": 26.37, + "ER_IROM1": 26.41, "RW_CCM": 87.89, "RW_IRAM1": 71.97, "UNINIT_CCM": 18.75 @@ -19,7 +19,7 @@ "regions": { "ER_IROM1": { "max": 1048576, - "size": 276556 + "size": 276884 }, "RW_CCM": { "max": 65280, @@ -37,7 +37,7 @@ "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": 246720, + "code": 247048, "ro_data": 29836, "rw_data": 2052, "zi_data": 149708