chore(ledger): runpar 合入后回填台账/凭证/覆盖率并同步计数

task/runpar-par 合入(merge 7bbcc9c):卡10 运行参数段 [run_par] 9 键 +
104 映射 0x8030~0x804F + 死区真源收编 + SYS_EVT_RUN_PAR_SAVE 落盘链。
@build 0/0:Code=219,620 / RO=22,036 / RW=1,280 / ZI=132,864;
RW_IRAM1 76,720 B(58.6%)、CCM 87.9%。Flash +1,912 B、RAM +8 B 与
lane-d 申报一致,--no-verify 欠账清。meas.c 静态更名越界照准(同 TU
撞名 C2369 的最小修)。run_par.c 入覆盖率基线(39/39 套件);钩子
45→46、单测钩子 21→22、总闸 38→39(AGENTS + 门禁 README)。
This commit is contained in:
2026-10-25 13:21:39 +08:00
parent 7bbcc9cf6f
commit 42b47aa5ac
7 changed files with 78 additions and 53 deletions
+2 -2
View File
@@ -90,7 +90,7 @@
## 提交门禁(pre-commit)
- 任一失败即拦截,共 **45 个钩子**(**每种门禁一篇详解(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径)→ `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` + 主机侧单测 21 个(`-unit-test` 后缀,2026-10-25 增补 adc-cal / prot-dim / vol-idle-sync / ui-data / meas 五个)+ `test-coverage`(**覆盖率总闸**:跑全部 38 套并守基线回退;缺 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)
- 任一失败即拦截,共 **46 个钩子**(**每种门禁一篇详解(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径)→ `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` + 主机侧单测 22 个(`-unit-test` 后缀,2026-10-25 增补 adc-cal / prot-dim / vol-idle-sync / ui-data / meas / run-par 六个)+ `test-coverage`(**覆盖率总闸**:跑全部 39 套并守基线回退;缺 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`(45 个钩子 → 23 篇索引) |
| **每个提交门禁一篇详解**(查什么 / 拦下过什么真事 / 限制与盲区 / 基线口径) | `docs/门禁说明/README.md`(46 个钩子 → 23 篇索引) |
| 实体编号怎么写 / 前缀总表 / `id-check` 八项校验 | `docs/编号规范.md`(§4 总表、§8 门禁与实测基线) |
| 提交门禁通用机制(阶段 / stash 陷阱 / 触发面 / 增量拦截三段式) | `docs/代码规范/pre-commit使用说明.md` §2 |
| 代码规范 V1.0 / cppcheck 口径 | `docs/代码规范/嵌入式C语言代码规范_V1.0.md`、`cppcheck使用说明.md` |
@@ -47,10 +47,10 @@ C2 dhara 失败类 +84;RO 另 +208,全是 C2 的失败类名表)→ `ER_IR
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
| 区域 | 用量 | 容量 | 占比 |
|---|---|---|---|
| ER_IROM1 | 239,752 B (234.13 KB) | 1,048,576 B (1024 KB) | 22.9% |
| RW_IRAM1 | 76,712 B (74.91 KB) | 131,072 B (128 KB) | 58.5% |
| ER_IROM1 | 241,656 B (235.99 KB) | 1,048,576 B (1024 KB) | 23.0% |
| RW_IRAM1 | 76,720 B (74.92 KB) | 131,072 B (128 KB) | 58.5% |
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
| **Flash (ROM 合计)** | **241,024 B (235.4 KB)** | 1,048,576 B (1024 KB) | **23.0%** |
| **Flash (ROM 合计)** | **242,936 B (237.2 KB)** | 1,048,576 B (1024 KB) | **23.2%** |
<!-- MEM_SNAPSHOT:END -->
各区的容量与常量来源:
+3 -3
View File
@@ -15,10 +15,10 @@
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|---|---|---|---|---|
| ER_IROM1 (Flash) | 239,752 B | 1,048,576 B | 22.9% | 参考 |
| ER_IROM1 (Flash) | 241,656 B | 1,048,576 B | 23.0% | 参考 |
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
| RW_IRAM1 | 76,712 B | 131,072 B | 58.5% | PASS |
| RW_IRAM1 | 76,720 B | 131,072 B | 58.5% | PASS |
| 子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) | 现值 | 配额 | 状态 |
|---|---|---|---|
@@ -27,7 +27,7 @@
| UI | 31,135 B | 16 KB | ⚠ 超 14.4 KB |
| RTOS 堆 | 57,376 B | 56 KB | 堆=配额 |
| 应用 | 15,410 B | 8 KB | ⚠ 超 7.0 KB |
| 其它 | 9,418 B | — | 参考 |
| 其它 | 9,419 B | — | 参考 |
<!-- MEM_BUDGET:END -->
- **门禁**:pre-commit `mem-budget` 钩子(`scripts/ram_baseline.py --gate`)——
+1 -1
View File
@@ -1,6 +1,6 @@
# 门禁逐项说明(每种门禁一篇)
> 这一目录回答一个问题:**提交时那 45 个钩子到底在干什么、拦谁、放谁、什么时候会骗人。**
> 这一目录回答一个问题:**提交时那 46 个钩子到底在干什么、拦谁、放谁、什么时候会骗人。**
> 每个门禁一篇,八段固定结构:查什么 / 为什么要它 / 触发面 / 报错怎么读 / 好处 /
> **限制与盲区** / 豁免与基线 / 改门禁本身要注意什么。**最后一节是这套文档存在的理由**——
> 一份只看"拦了什么"的门禁文档,会让人以为绿就是对的。
+1 -1
View File
@@ -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 218128 21624 1272 132864 239752 22.9 76712 58.5 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 219620 22036 1280 132864 241656 23.0 76720 58.5 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
1 date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi
7 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
8 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
9 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
10 2026-10-25 218128 219620 21624 22036 1272 1280 132864 239752 241656 22.9 23.0 76712 76720 58.5 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
+11 -11
View File
@@ -1,17 +1,17 @@
{
"built_at": "2026-10-25T12:08:11+08:00",
"fingerprint": "1009caa1607259b08cf493cb51a7e103ebab65c63eceb44537b1a6501f52b9ed",
"fingerprint_files": 1406,
"built_at": "2026-10-25T13:20:00+08:00",
"fingerprint": "cced501cd26bc3359ccfb1317318c159559006776849f41414a9cc132e88f0a3",
"fingerprint_files": 1408,
"fingerprint_source": "git-index",
"gated_regions": [
"RW_IRAM1",
"RW_CCM"
],
"git_head": "8c47005fe9dc21227cca24c71b21e3c69f905f81",
"git_head": "7bbcc9cf6f129c820d9f487c3a6ce0b1cdf6cfad",
"map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map",
"map_mtime": 1792901273,
"map_mtime": 1792905580,
"pct": {
"ER_IROM1": 22.86,
"ER_IROM1": 23.05,
"RW_CCM": 87.89,
"RW_IRAM1": 58.53,
"UNINIT_CCM": 18.75
@@ -19,7 +19,7 @@
"regions": {
"ER_IROM1": {
"max": 1048576,
"size": 239752
"size": 241656
},
"RW_CCM": {
"max": 65280,
@@ -27,7 +27,7 @@
},
"RW_IRAM1": {
"max": 131072,
"size": 76712
"size": 76720
},
"UNINIT_CCM": {
"max": 256,
@@ -37,9 +37,9 @@
"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": 218128,
"ro_data": 21624,
"rw_data": 1272,
"code": 219620,
"ro_data": 22036,
"rw_data": 1280,
"zi_data": 132864
},
"threshold_pct": 92.0,
+57 -32
View File
@@ -2,11 +2,11 @@
"files": {
"App/algo/adc_cal.c": {
"func_rate": 1.0,
"funcs_covered": 12,
"funcs_valid": 12,
"line_rate": 0.9916,
"lines_covered": 118,
"lines_valid": 119
"funcs_covered": 13,
"funcs_valid": 13,
"line_rate": 0.984,
"lines_covered": 123,
"lines_valid": 125
},
"App/algo/adc_health.c": {
"func_rate": 1.0,
@@ -64,6 +64,14 @@
"lines_covered": 173,
"lines_valid": 179
},
"App/algo/run_par.c": {
"func_rate": 1.0,
"funcs_covered": 10,
"funcs_valid": 10,
"line_rate": 0.945,
"lines_covered": 103,
"lines_valid": 109
},
"App/algo/sample_ring.c": {
"func_rate": 1.0,
"funcs_covered": 5,
@@ -164,9 +172,9 @@
"func_rate": 0.9524,
"funcs_covered": 20,
"funcs_valid": 21,
"line_rate": 0.8703,
"lines_covered": 208,
"lines_valid": 239
"line_rate": 0.876,
"lines_covered": 212,
"lines_valid": 242
},
"App/sync/time_sync.c": {
"func_rate": 1.0,
@@ -180,9 +188,9 @@
"func_rate": 0.875,
"funcs_covered": 7,
"funcs_valid": 8,
"line_rate": 0.8417,
"line_rate": 0.8298,
"lines_covered": 117,
"lines_valid": 139
"lines_valid": 141
},
"App/util/sha256.c": {
"func_rate": 1.0,
@@ -341,10 +349,10 @@
"modules": {
"adc_cal": {
"files": {
"App/algo/adc_cal.c": 119,
"App/algo/adc_cal.c": 125,
"App/cfg/cfg_file.c": 689
},
"lines_total": 808,
"lines_total": 814,
"ok": true
},
"adc_health": {
@@ -408,24 +416,27 @@
},
"iec104": {
"files": {
"App/algo/adc_cal.c": 125,
"App/algo/freq.c": 130,
"App/algo/meas.c": 64,
"App/algo/phasor.c": 55,
"App/algo/prot_elm.c": 106,
"App/algo/prot_set.c": 179,
"App/algo/run_par.c": 109,
"App/algo/sample_ring.c": 41,
"App/cfg/cfg_file.c": 689,
"App/protocol/iec104/iec104_asdu.c": 103,
"App/protocol/iec104/iec104_link.c": 405,
"App/protocol/iec104/iec104_pts.c": 239
"App/protocol/iec104/iec104_pts.c": 242
},
"lines_total": 1322,
"lines_total": 2248,
"ok": true
},
"iec104_serv": {
"files": {
"App/task/iec104_serv.c": 139
"App/task/iec104_serv.c": 141
},
"lines_total": 139,
"lines_total": 141,
"ok": true
},
"lftpd": {
@@ -519,14 +530,14 @@
},
"prot_dim": {
"files": {
"App/algo/adc_cal.c": 119,
"App/algo/adc_cal.c": 125,
"App/algo/freq.c": 130,
"App/algo/phasor.c": 55,
"App/algo/prot_elm.c": 106,
"App/algo/prot_set.c": 179,
"App/algo/sample_ring.c": 41
},
"lines_total": 630,
"lines_total": 636,
"ok": true
},
"prot_elm": {
@@ -555,6 +566,15 @@
"lines_total": 208,
"ok": true
},
"run_par": {
"files": {
"App/algo/adc_cal.c": 125,
"App/algo/run_par.c": 109,
"App/cfg/cfg_file.c": 689
},
"lines_total": 923,
"ok": true
},
"sha256": {
"files": {
"App/util/sha256.c": 114
@@ -647,6 +667,7 @@
"App/algo/phasor.c",
"App/algo/prot_elm.c",
"App/algo/prot_set.c",
"App/algo/run_par.c",
"App/algo/sample_ring.c",
"App/cfg/cfg_file.c",
"App/cfg/cfg_file_store_mcu.c",
@@ -684,16 +705,16 @@
],
"totals": {
"files_generated_excluded": 5,
"files_tested": 42,
"files_untested": 121,
"func_rate": 0.9342,
"funcs_covered": 440,
"funcs_valid": 471,
"line_rate": 0.9021,
"lines_covered": 6090,
"lines_valid": 6751,
"modules_ok": 38,
"modules_total": 38
"files_tested": 43,
"files_untested": 122,
"func_rate": 0.9357,
"funcs_covered": 451,
"funcs_valid": 482,
"line_rate": 0.9026,
"lines_covered": 6202,
"lines_valid": 6871,
"modules_ok": 39,
"modules_total": 39
},
"untested_sources": [
{
@@ -717,7 +738,7 @@
"path": "Drivers/BSP/UI/ui_content_page.c"
},
{
"code_lines": 282,
"code_lines": 283,
"path": "App/task/default_task.c"
},
{
@@ -761,7 +782,7 @@
"path": "Drivers/BSP/UI/ui_page_password.c"
},
{
"code_lines": 138,
"code_lines": 140,
"path": "App/app/app_main.c"
},
{
@@ -961,7 +982,7 @@
"path": "Drivers/BSP/UI/ui_tokens.h"
},
{
"code_lines": 22,
"code_lines": 23,
"path": "App/algo/adc_cal.h"
},
{
@@ -997,9 +1018,13 @@
"path": "Drivers/BSP/UI/ui_page_dc.c"
},
{
"code_lines": 18,
"code_lines": 19,
"path": "App/app/sys_events.h"
},
{
"code_lines": 18,
"path": "App/algo/run_par.h"
},
{
"code_lines": 18,
"path": "Drivers/BSP/NET/lftpd/lftpd.h"