From b746a1ff00b37718fdc0e3f3f28c6db24a136ff1 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Sun, 25 Oct 2026 10:07:15 +0800 Subject: [PATCH] =?UTF-8?q?chore(ledger):=20ui-data=20=E5=90=88=E5=85=A5?= =?UTF-8?q?=E5=90=8E=E5=9B=9E=E5=A1=AB=E5=8F=B0=E8=B4=A6/=E5=87=AD?= =?UTF-8?q?=E8=AF=81/=E8=A6=86=E7=9B=96=E7=8E=87=E5=B9=B6=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E9=97=A8=E7=A6=81=E8=AE=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit task/ui-data-feed 合入(merge 98664a1):ui_data 三通道快照 + ui_data_feed 装配 + ui_w_soe 显示名 + 字库 +4 字(采/样/恢/效, 179→183)。合并后 @build 0/0:Code=217,204 / RO=21,504 / RW=1,256 / ZI=132,680;RW_IRAM1 76,512 B(58.4%)、CCM 87.9%。 lane-e 分支侧 --no-verify 欠账清;覆盖率基线登记 ui_data.c (37/37 套件、tested 41);凭证重盖(L0c 恢复序列)。 AGENTS/门禁 README 计数 42→44 钩、18→20 单测钩子(n22+ui-data 两笔带进来)。 --- AGENTS.md | 4 +- docs/内存管理/RAM使用分析与优化方案.md | 6 +-- docs/内存管理/RAM预算台账.md | 6 +-- docs/门禁说明/README.md | 2 +- scripts/ram_baseline.tsv | 2 +- scripts/size_attestation.json | 26 +++++----- scripts/test_coverage_baseline.json | 68 +++++++++++++++++++++----- 7 files changed, 78 insertions(+), 36 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 07eecddb..bb253545 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -90,7 +90,7 @@ ## 提交门禁(pre-commit) -- 任一失败即拦截,共 **42 个钩子**(**每种门禁一篇详解(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径)→ `docs/门禁说明/README.md` 索引**;通用机制与整体口径 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `id-check`(**编号门禁**,`docs/编号规范.md` §8 八项校验;**已关闸为【增量拦截】**:只拦 `scripts/id_known_backlog.json` 台账之外的新错误级问题,存量按指纹豁免、台账只减不增;另有一根恒生效的线——可判定比例跌破 `id_registry.json` 基线即失败)+ `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 18 个(`-unit-test` 后缀,2026-10-25 增补 adc-cal / prot-dim 两个)+ `test-coverage`(**覆盖率总闸**:跑全部 35 套并守基线回退;缺 mscoverage 组件时按用户裁定 **FAIL**、不 skip,2026-10-24)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,N-23/U4)+ `mem-budget`(RAM 92% 预算门禁,N-27)+ `font-charset`(UI 字符集差集检查,防缺字白框,U4)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 11 页黄金参考,U4)+ `layer-deps`(**分层方向**:`Drivers/BSP/**` 不得 include `App/**` 的头;存量 3 条基线只减不增(2026-10-25 记录 reader 注入削掉 UI 记录 3 条边,6→3),报告 S-1)+ `bsp-err`(**BSP 错误码与超时命名约定**:公开 API 不得拿 `HAL_StatusTypeDef`/`bool` 当错误通道、`*_TIMEOUT` 宏不得取负值、非 void 须写「返回值:」、**返回错误码的函数不得裸丢弃返回值**(须接住或显式 `(void)`;实测编译器与 cppcheck 都不报这类,只有这条会响);约定正文 `Drivers/BSP/bsp_err.h`,存量基线只减不增(2026-10-23 首清点 19 条 → 已还 18;`consume-result` 上线又暴露 37 条存量丢弃 → **现 38 条**),报告 S-5) +- 任一失败即拦截,共 **44 个钩子**(**每种门禁一篇详解(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径)→ `docs/门禁说明/README.md` 索引**;通用机制与整体口径 → `docs/代码规范/pre-commit使用说明.md`):通用 5 + `gitlint` + `cppcheck` / `test-cppcheck` + `no-mojibake` + `coding-standard` + 文档三件套 `doc-links` / `task-table` / `mem-numbers` + `id-check`(**编号门禁**,`docs/编号规范.md` §8 八项校验;**已关闸为【增量拦截】**:只拦 `scripts/id_known_backlog.json` 台账之外的新错误级问题,存量按指纹豁免、台账只减不增;另有一根恒生效的线——可判定比例跌破 `id_registry.json` 基线即失败)+ `lv-conf-sync`(两份 `lv_conf.h` 特性子集一致)+ `cubemx-survival` + 主机侧单测 20 个(`-unit-test` 后缀,2026-10-25 增补 adc-cal / prot-dim / vol-idle-sync / ui-data 四个)+ `test-coverage`(**覆盖率总闸**:跑全部 37 套并守基线回退;缺 mscoverage 组件时按用户裁定 **FAIL**、不 skip,2026-10-24)+ `test-suite-switch` + `registration-check`(双端注册反向校验 + UI 页面描述符表接线,N-23/U4)+ `mem-budget`(RAM 92% 预算门禁,N-27)+ `font-charset`(UI 字符集差集检查,防缺字白框,U4)+ `ui-golden`(UI 像素回归,菜单 8 状态 + 内容页 11 页黄金参考,U4)+ `layer-deps`(**分层方向**:`Drivers/BSP/**` 不得 include `App/**` 的头;存量 3 条基线只减不增(2026-10-25 记录 reader 注入削掉 UI 记录 3 条边,6→3),报告 S-1)+ `bsp-err`(**BSP 错误码与超时命名约定**:公开 API 不得拿 `HAL_StatusTypeDef`/`bool` 当错误通道、`*_TIMEOUT` 宏不得取负值、非 void 须写「返回值:」、**返回错误码的函数不得裸丢弃返回值**(须接住或显式 `(void)`;实测编译器与 cppcheck 都不报这类,只有这条会响);约定正文 `Drivers/BSP/bsp_err.h`,存量基线只减不增(2026-10-23 首清点 19 条 → 已还 18;`consume-result` 上线又暴露 37 条存量丢弃 → **现 38 条**),报告 S-5) - **范围 = 项目代码**:第三方(`Lib/`、`Middlewares/`、CMSIS、HAL、`lftpd`、`dhara`、`MDK-ARM`)排除;`cppcheck`/`coding-standard` 另排除 `test/`,规范检查再排除 CubeMX 生成的 `Src/`/`Inc/`。**`simulator/` 已纳入全部钩子**(2026-10-11)——生成物只靠 `.gitignore` 挡,**不在 `exclude` 里写目录名**(教训见 `docs/代码规范/pre-commit使用说明.md` §5.5) - ⚠ **pre-commit 4.x 已移除 `always: true`**(实测对 `local` 钩子只告警 `Unexpected key(s)` 并跳过)→ 想"总是跑"的钩子**必须让 `files:` 覆盖到所有会触发它的文件**,没有兜底开关 - **改写型钩子(`trailing-whitespace` + `end-of-file-fixer`)豁免 CubeMX/Keil 生成文件**(配置里 YAML 锚点 `&cubemx-generated`);⚠ **只读检查不受影响**:`cppcheck` / 乱码 / `cubemx-survival` / `task-table` / `mem-numbers` 仍覆盖 `Src/`、`Inc/` @@ -173,7 +173,7 @@ | ADC 采样节拍 / 通道映射 / V0.1 硬件缺陷 | `docs/子系统设计/ADC采样节拍设计说明.md`、`docs/硬件平台/ADC通道映射说明.md` | | 存储栈(FatFs / dhara / lftpd / 两条 FatFs 陷阱) | `docs/架构设计/STM32F4-Base存储架构说明.md` | | RAM / 栈预算 / 容量台账 | `docs/内存管理/RAM使用分析与优化方案.md`、`内存内容分配策略.md` | -| **每个提交门禁一篇详解**(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径) | `docs/门禁说明/README.md`(42 个钩子 → 23 篇索引) | +| **每个提交门禁一篇详解**(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径) | `docs/门禁说明/README.md`(44 个钩子 → 23 篇索引) | | 实体编号怎么写 / 前缀总表 / `id-check` 八项校验 | `docs/编号规范.md`(§4 总表、§8 门禁与实测基线) | | 提交门禁通用机制(阶段 / stash 陷阱 / 触发面 / 增量拦截三段式) | `docs/代码规范/pre-commit使用说明.md` §2 | | 代码规范 V1.0 / cppcheck 口径 | `docs/代码规范/嵌入式C语言代码规范_V1.0.md`、`cppcheck使用说明.md` | diff --git a/docs/内存管理/RAM使用分析与优化方案.md b/docs/内存管理/RAM使用分析与优化方案.md index 4cd11d32..a7020d48 100644 --- a/docs/内存管理/RAM使用分析与优化方案.md +++ b/docs/内存管理/RAM使用分析与优化方案.md @@ -47,10 +47,10 @@ C2 dhara 失败类 +84;RO 另 +208,全是 C2 的失败类名表)→ `ER_IR | 区域 | 用量 | 容量 | 占比 | |---|---|---|---| -| ER_IROM1 | 237,328 B (231.77 KB) | 1,048,576 B (1024 KB) | 22.6% | -| RW_IRAM1 | 75,792 B (74.02 KB) | 131,072 B (128 KB) | 57.8% | +| ER_IROM1 | 238,708 B (233.11 KB) | 1,048,576 B (1024 KB) | 22.8% | +| RW_IRAM1 | 76,512 B (74.72 KB) | 131,072 B (128 KB) | 58.4% | | RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% | -| **Flash (ROM 合计)** | **238,560 B (233.0 KB)** | 1,048,576 B (1024 KB) | **22.8%** | +| **Flash (ROM 合计)** | **239,964 B (234.3 KB)** | 1,048,576 B (1024 KB) | **22.9%** | 各区的容量与常量来源: diff --git a/docs/内存管理/RAM预算台账.md b/docs/内存管理/RAM预算台账.md index 95599c6f..fc9de77a 100644 --- a/docs/内存管理/RAM预算台账.md +++ b/docs/内存管理/RAM预算台账.md @@ -15,16 +15,16 @@ | 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) | |---|---|---|---|---| -| ER_IROM1 (Flash) | 237,328 B | 1,048,576 B | 22.6% | 参考 | +| ER_IROM1 (Flash) | 238,708 B | 1,048,576 B | 22.8% | 参考 | | RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS | | UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 | -| RW_IRAM1 | 75,792 B | 131,072 B | 57.8% | PASS | +| RW_IRAM1 | 76,512 B | 131,072 B | 58.4% | PASS | | 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 | |---|---|---|---| | 网络 | 13,702 B | 12 KB | ⚠ 超 1.4 KB | | 存储 | 7,056 B | 12 KB | OK | -| UI | 30,426 B | 16 KB | ⚠ 超 13.7 KB | +| UI | 31,135 B | 16 KB | ⚠ 超 14.4 KB | | RTOS 堆 | 57,376 B | 56 KB | 堆=配额 | | 应用 | 15,406 B | 8 KB | ⚠ 超 7.0 KB | | 其它 | 9,216 B | — | 参考 | diff --git a/docs/门禁说明/README.md b/docs/门禁说明/README.md index 0a15fb5a..f9bee2f2 100644 --- a/docs/门禁说明/README.md +++ b/docs/门禁说明/README.md @@ -1,6 +1,6 @@ # 门禁逐项说明(每种门禁一篇) -> 这一目录回答一个问题:**提交时那 40 个钩子到底在干什么、拦谁、放谁、什么时候会骗人。** +> 这一目录回答一个问题:**提交时那 44 个钩子到底在干什么、拦谁、放谁、什么时候会骗人。** > 每个门禁一篇,八段固定结构:查什么 / 为什么要它 / 触发面 / 报错怎么读 / 好处 / > **限制与盲区** / 豁免与基线 / 改门禁本身要注意什么。**最后一节是这套文档存在的理由**—— > 一份只看"拦了什么"的门禁文档,会让人以为绿就是对的。 diff --git a/scripts/ram_baseline.tsv b/scripts/ram_baseline.tsv index d7a055ca..2d590d5f 100644 --- a/scripts/ram_baseline.tsv +++ b/scripts/ram_baseline.tsv @@ -7,4 +7,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi 2026-10-22 213436 18652 1188 131500 232088 22.1 75264 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736 2026-10-23 213676 18860 1188 131500 232536 22.2 75264 57.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4120;sys_log_mcu.o=3588;default_task.o=2736 2026-10-24 213780 18860 1204 131852 232640 22.2 75632 57.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736 -2026-10-25 215932 21396 1232 131984 237328 22.6 75792 57.8 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736 +2026-10-25 217204 21504 1256 132680 238708 22.8 76512 58.4 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736 diff --git a/scripts/size_attestation.json b/scripts/size_attestation.json index 388ae4a8..e7f74a71 100644 --- a/scripts/size_attestation.json +++ b/scripts/size_attestation.json @@ -1,25 +1,25 @@ { - "built_at": "2026-10-25T09:28:21+08:00", - "fingerprint": "f326336d2f469fedf1be8db3538a2a47e83105d36abed7b1bc549cd0ab75147f", - "fingerprint_files": 1398, + "built_at": "2026-10-25T10:03:18+08:00", + "fingerprint": "a63f8cb23657ecbb642a47b1e9edee90328086c8d7335e479b428fdd8d6516f5", + "fingerprint_files": 1404, "fingerprint_source": "git-index", "gated_regions": [ "RW_IRAM1", "RW_CCM" ], - "git_head": "6f99dea3a9d8638bff7e1371839cd23b31403b50", + "git_head": "98664a11ed6f7ef80d09ba134998cb9e5f7c47c7", "map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map", - "map_mtime": 1792891670, + "map_mtime": 1792893770, "pct": { - "ER_IROM1": 22.63, + "ER_IROM1": 22.76, "RW_CCM": 87.89, - "RW_IRAM1": 57.82, + "RW_IRAM1": 58.37, "UNINIT_CCM": 18.75 }, "regions": { "ER_IROM1": { "max": 1048576, - "size": 237328 + "size": 238708 }, "RW_CCM": { "max": 65280, @@ -27,7 +27,7 @@ }, "RW_IRAM1": { "max": 131072, - "size": 75792 + "size": 76512 }, "UNINIT_CCM": { "max": 256, @@ -37,10 +37,10 @@ "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": 215932, - "ro_data": 21396, - "rw_data": 1232, - "zi_data": 131984 + "code": 217204, + "ro_data": 21504, + "rw_data": 1256, + "zi_data": 132680 }, "threshold_pct": 92.0, "worktree_dirt_at_stamp": 0, diff --git a/scripts/test_coverage_baseline.json b/scripts/test_coverage_baseline.json index 3c69e386..1276bca5 100644 --- a/scripts/test_coverage_baseline.json +++ b/scripts/test_coverage_baseline.json @@ -311,6 +311,22 @@ "line_rate": 0.9643, "lines_covered": 108, "lines_valid": 112 + }, + "Drivers/BSP/UI/ui_data.c": { + "func_rate": 0.9, + "funcs_covered": 9, + "funcs_valid": 10, + "line_rate": 0.8, + "lines_covered": 52, + "lines_valid": 65 + }, + "Drivers/BSP/UI/ui_w_soe.c": { + "func_rate": 1.0, + "funcs_covered": 6, + "funcs_valid": 6, + "line_rate": 0.9355, + "lines_covered": 58, + "lines_valid": 62 } }, "generated_by": "scripts/check_test_coverage.py --update-baseline", @@ -572,6 +588,14 @@ "lines_total": 99, "ok": true }, + "ui_data": { + "files": { + "Drivers/BSP/UI/ui_data.c": 65, + "Drivers/BSP/UI/ui_w_soe.c": 62 + }, + "lines_total": 127, + "ok": true + }, "vol_idle_sync": { "files": { "App/fs/vol_idle_sync.c": 21 @@ -635,20 +659,22 @@ "Drivers/BSP/NET/net_select.c", "Drivers/BSP/NET/net_socket.c", "Drivers/BSP/NETCFG/ftp_cfg.c", - "Drivers/BSP/NETCFG/net_cfg.c" + "Drivers/BSP/NETCFG/net_cfg.c", + "Drivers/BSP/UI/ui_data.c", + "Drivers/BSP/UI/ui_w_soe.c" ], "totals": { "files_generated_excluded": 5, - "files_tested": 39, - "files_untested": 116, - "func_rate": 0.926, - "funcs_covered": 413, - "funcs_valid": 446, - "line_rate": 0.8968, - "lines_covered": 5823, - "lines_valid": 6493, - "modules_ok": 36, - "modules_total": 36 + "files_tested": 41, + "files_untested": 120, + "func_rate": 0.9264, + "funcs_covered": 428, + "funcs_valid": 462, + "line_rate": 0.8962, + "lines_covered": 5933, + "lines_valid": 6620, + "modules_ok": 37, + "modules_total": 37 }, "untested_sources": [ { @@ -683,6 +709,10 @@ "code_lines": 264, "path": "Drivers/BSP/SD2506/sd2506.c" }, + { + "code_lines": 242, + "path": "App/app/ui_data_feed.c" + }, { "code_lines": 224, "path": "App/task/adc_task.c" @@ -739,13 +769,17 @@ "code_lines": 98, "path": "Drivers/BSP/SD2506/sd2506.h" }, + { + "code_lines": 95, + "path": "App/task/ui_task.c" + }, { "code_lines": 93, "path": "Drivers/BSP/GD5F2GQ5UE/gd5f2gq5ue.h" }, { - "code_lines": 92, - "path": "App/task/ui_task.c" + "code_lines": 88, + "path": "Drivers/BSP/UI/ui_data.h" }, { "code_lines": 83, @@ -791,6 +825,10 @@ "code_lines": 50, "path": "Drivers/BSP/UI/ui_w_setlist.h" }, + { + "code_lines": 47, + "path": "Drivers/BSP/UI/ui_w_soe.h" + }, { "code_lines": 46, "path": "App/log/soe_rec.h" @@ -1055,6 +1093,10 @@ "code_lines": 11, "path": "Drivers/BSP/dbg_cfg.h" }, + { + "code_lines": 10, + "path": "App/app/ui_data_feed.h" + }, { "code_lines": 10, "path": "App/fs/vol_idle_sync.h"