feat(S-5): 收编 SD2506/TPAFE 并给 dhara 失败分类,门禁基线 19→17
前一笔立契约与门禁(`Drivers/BSP/bsp_err.h` + `bsp-err` 钩子 + RS485 试点);这一笔按用户
指定顺序 C3 → C1 → C2 把三个模块真正收编,并让存储失败第一次变得可读、可分类。
**C3 · SD2506 整模块(11 个公共 API + 6 个内部 helper)**:三枚私有宏 `SD2506_OK`/
`SD2506_ERROR`/`SD2506_I2C_ERROR` **删除而不是留别名**——留别名等于新代码还能用旧形状,
把迁移洗掉;编译器替我们找全所有调用点。新增 `sd2506_err_from_hal()`,**把 I2C 超时从
"和没人应答共用一个 −2"里拆出来归成 `BSP_ERR_TIMEOUT`(可重试)**——SD2506 是启动链第一站、
I2C1 上电时序敏感,这是本波唯一真正的语义改善,不是改名。`sd2506_init` 的 charge 寄存器
**回读校验不符**原返参数类错误,改归 `BSP_ERR_IO`(那不是调用方的错)。
**C1 · 同形两义**:`GD5F_BUSY_TIMEOUT` → `GD5F_WAIT_EXPIRED`(**值 −2 不变**,纯消"名字叫
TIMEOUT 其实是返回码")。**GD5F 私有码集整体收编刻意没做**:169 处引用里 48 处在板级套件、
还要动 Trap 记录用词,属另一波带真机+套件回归的工作,不夹带。TPAFE5160 收编 23 处:
`BUSY_TIMEOUT → BSP_ERR_TIMEOUT`、`ERROR → BSP_ERR_PARAM`(**同值 −1,行为零变化**)、
`FRSTDATA_ERR → BSP_ERR_NO_DEVICE`(E-44 的本义就是"芯片没驱动 DB 总线",归到器件无响应比
私有 −3 有用,且避开与 `BSP_ERR_TIMEOUT` 撞值)。实测 `tpafe5160.o`/`gd5f2gq5ue.o` 的 Code
增量为 **0**——改名不产生一条指令。
⚠ **`tpafe5160_snapshot()` 刻意不套成败码**:它是 1=有新帧 / 0=无新帧 / −1=参数错 的三态
**状态**返回,0 不是错误而是"这一拍没有新数据",强行收编会把慢消费者的正常路径变成失败。
顺带订正我上一版在 `bsp_err.h` 的断言——"本层只有 `net_*` 把数量与错误挤同一返回值"是错的,
`snapshot`/`adc_input_poll` 就是第二族;两族现都已写明并各注保留理由。
**C2 · FTL 坍缩点分类**:`ftl_flush_cache`/`ftl_read_page` 不再把 dhara 失败压成
`GD5F_ERROR`,
按**处置差异**分三类,并在最早同时知道 LPN 与原始码的位置就地打印:`ECC`/`TOO_BAD` →
`BSP_ERR_CRC`(页级,重试或换页,不代表卷坏);`JOURNAL_FULL`/`MAP_FULL` →
`BSP_ERR_NO_SPACE`(介质健康但块池/日志见底,此时重格式化只是把问题推回去);
`BAD_BLOCK`/`RECOVER`/`CORRUPT_MAP`/越界 → `BSP_ERR_IO`(完整性故障,保卷 + 上报,不许自愈
重格式化)。这与 **E-31** 是同一条纪律的两端。可读名用自建短表:**本仓 dhara 没有编
`error.c`,用 `dhara_strerror()` 会直接链接失败**。`disk_read`/`disk_write` 仍回
`RES_ERROR`
(FatFs 契约);要让 defaultTask 卷健康探针按类分支还差跨调用存活的快照 → C4 待还。
**两次靠核实拦住的自我错误**:① 我一度认定 `DBG_ERROR("... err=%d", err)` 是把结构体塞进
varargs 的格式 bug——核 `Lib/dhara/error.h` 后确认 `dhara_error_t` 是 `enum`(标量),那行日志
本来合法,改了反而是引入错误;② `bsp-err` 一次 `replace_all` 越界把 8 处 **GD5F 码空间**的
判据改成 `!= BSP_OK`(数值同为 0、无行为变化),但那正是"把两个码空间混起来",已逐一还原。
`cppcheck` 亦抓到 `cls` 声明作用域过宽,已收进失败分支。
**验证**:`@build` 0 错 0 警告(`Code` 213,648、RO 18,860、`ER_IROM1` 232,508 B /
22.2%、
`ROM 合计` 233,696;**RAM 三项零增量**);`@test` PASS(692 ms,烧入戳 `Oct 23 01:35:32`)
且逐条读到被改模块的锚点:`SD2506 init: OK (ret=0)` 与 ID/时间/温度/电池四条读回正常、
`ADC init: OK`、`NAND init: OK`、`Map resumed: 14094/97504`、`adc=` 帧计数持续递增(证明
snapshot 三态未被改坏)、`[ERR]`/Fault/FAIL 0 条。主机单测:系统时钟 100/100、dhara NAND
移植层 149/149(两者都因本次改动需补 `Drivers/BSP` include 路径,补后在钩子内实跑 Passed)。
`pre-commit run` 全量 RC=0(20 个实跑钩子 Passed);`bsp-err` 基线 **19 → 17**(还掉两个
`*_BUSY_TIMEOUT = -2`)、`--prune` 干净;`doc-links --all --sections-strict` 147 篇
0 问题;
`id-check --strict`、`layer-deps`、`mem-numbers`、`mem-budget`、`ui-golden` 全过;33
个文件
字节卫生 0 异常(无 CR / 无 U+FFFD / 无行尾空格 / 均有尾换行)。
**口径与数字联动**:新增 `docs/架构设计/STM32F4-Base存储架构说明.md` §10.4(三类码与处置
理由);`pre-commit使用说明.md` §2.27 与 `AGENTS.md` 基线计数 19 → 17;TPAFE README、
GD5F 测试指南与 Trap 记录均**保留旧名留痕**以便对旧日志;配图桶按 .map 对象级增量重算
(`dhara/FTL` 10,931 → 11,222,+291 全部落在 `nand_ftl.o`;应用代码/UI +36 落在
`app_main.o`;其余散量入"其他"7,557;桶和 = Code+RO 断言通过、文本溢出 0);
`ram_baseline --update/--write`、`ram_report_20261023.md` 快照、报告 §1.3/§5.1/§5.4
与
部署文档 §3.3 数字全部同步;报告 §0.4/§9 的 S-5 状态改为 🟡 主体已落地。
This commit is contained in:
+24
-24
@@ -8,28 +8,28 @@
|
||||
</style>
|
||||
</defs>
|
||||
<text x="410.0" y="24" text-anchor="middle" class="title">Flash (1MB) 使用布局 — 2026-10-22 @build</text>
|
||||
<rect class="bar-seg" x="60" y="50" width="150.6" height="40" fill="#2196F3" rx="2"/>
|
||||
<text x="135.3" y="70.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">代码段 (Code) 208.4KB</text>
|
||||
<rect class="bar-seg" x="210.62583923339844" y="50" width="13.2" height="40" fill="#4CAF50" rx="2"/>
|
||||
<text x="227.8" y="70.0" text-anchor="start" dominant-baseline="central" class="legend-text" fill="#333">只读数据 (RO) 18.2KB</text>
|
||||
<rect class="bar-seg" x="223.78890991210938" y="50" width="575.4" height="40" fill="#E0E0E0" rx="2"/>
|
||||
<text x="511.5" y="70.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">Flash 空闲 796.2KB</text>
|
||||
<text x="60" y="108" class="label" fill="#333">已用: 227.8KB (22.2%) 空闲: 796.2KB (77.8%) ER_IROM1(Code+RO): 226.6KB (22.1%) 总量: 1MB (= ROM 合计口径)</text>
|
||||
<text x="60" y="124" class="label" fill="#555">Code + RO 分布(ER_IROM1 226.6KB,按 .map 对象归类)</text>
|
||||
<rect class="bar-seg" x="60" y="130" width="279.6" height="24" fill="#4CAF50" rx="2"/>
|
||||
<text x="199.8" y="142.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">85.7KB</text>
|
||||
<rect class="bar-seg" x="339.64582399779397" y="130" width="181.8" height="24" fill="#2196F3" rx="2"/>
|
||||
<text x="430.5" y="142.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">55.7KB</text>
|
||||
<rect class="bar-seg" x="521.4223053324602" y="130" width="82.6" height="24" fill="#F44336" rx="2"/>
|
||||
<text x="562.7" y="142.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">25.3KB</text>
|
||||
<rect class="bar-seg" x="604.0540656992176" y="130" width="57.0" height="24" fill="#607D8B" rx="2"/>
|
||||
<text x="632.6" y="142.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">17.5KB</text>
|
||||
<rect class="bar-seg" x="661.0507221398781" y="130" width="34.9" height="24" fill="#FF9800" rx="2"/>
|
||||
<rect class="bar-seg" x="695.9036227637794" y="130" width="34.3" height="24" fill="#00BCD4" rx="2"/>
|
||||
<rect class="bar-seg" x="730.2176760539107" y="130" width="27.0" height="24" fill="#9C27B0" rx="2"/>
|
||||
<rect class="bar-seg" x="757.2174347661233" y="130" width="17.5" height="24" fill="#795548" rx="2"/>
|
||||
<rect class="bar-seg" x="774.709248216194" y="130" width="1.5" height="24" fill="#B0BEC5" rx="2"/>
|
||||
<rect class="bar-seg" x="776.2014408327877" y="130" width="23.8" height="24" fill="#E0E0E0" rx="2"/>
|
||||
<rect class="bar-seg" x="60" y="50" width="150.8" height="40" fill="#2196F3" rx="2"/>
|
||||
<text x="135.4" y="70.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">代码段 (Code) 208.6KB</text>
|
||||
<rect class="bar-seg" x="210.77545166015625" y="50" width="13.3" height="40" fill="#4CAF50" rx="2"/>
|
||||
<text x="228.1" y="70.0" text-anchor="start" dominant-baseline="central" class="legend-text" fill="#333">只读数据 (RO) 18.4KB</text>
|
||||
<rect class="bar-seg" x="224.08531188964844" y="50" width="575.1" height="40" fill="#E0E0E0" rx="2"/>
|
||||
<text x="511.6" y="70.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">Flash 空闲 795.8KB</text>
|
||||
<text x="60" y="108" class="label" fill="#333">已用: 228.2KB (22.3%) 空闲: 795.8KB (77.7%) ER_IROM1(Code+RO): 227.1KB (22.2%) 总量: 1MB (= ROM 合计口径)</text>
|
||||
<text x="60" y="124" class="label" fill="#555">Code + RO 分布(ER_IROM1 227.1KB,按 .map 对象归类)</text>
|
||||
<rect class="bar-seg" x="60" y="130" width="279.1" height="24" fill="#4CAF50" rx="2"/>
|
||||
<text x="199.6" y="142.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">85.7KB</text>
|
||||
<rect class="bar-seg" x="339.1406747294717" y="130" width="181.6" height="24" fill="#2196F3" rx="2"/>
|
||||
<text x="429.9" y="142.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">55.7KB</text>
|
||||
<rect class="bar-seg" x="520.7033736473584" y="130" width="82.5" height="24" fill="#F44336" rx="2"/>
|
||||
<text x="561.9" y="142.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">25.3KB</text>
|
||||
<rect class="bar-seg" x="603.1858688733291" y="130" width="56.9" height="24" fill="#607D8B" rx="2"/>
|
||||
<text x="631.6" y="142.0" text-anchor="middle" dominant-baseline="central" class="label" fill="#000">17.5KB</text>
|
||||
<rect class="bar-seg" x="660.0795671546786" y="130" width="35.7" height="24" fill="#FF9800" rx="2"/>
|
||||
<rect class="bar-seg" x="695.7956715467855" y="130" width="34.3" height="24" fill="#00BCD4" rx="2"/>
|
||||
<rect class="bar-seg" x="730.0477402928071" y="130" width="27.0" height="24" fill="#9C27B0" rx="2"/>
|
||||
<rect class="bar-seg" x="756.9987269255251" y="130" width="17.5" height="24" fill="#795548" rx="2"/>
|
||||
<rect class="bar-seg" x="774.4589433481859" y="130" width="1.5" height="24" fill="#B0BEC5" rx="2"/>
|
||||
<rect class="bar-seg" x="775.9484404837683" y="130" width="24.1" height="24" fill="#E0E0E0" rx="2"/>
|
||||
<rect x="60" y="167" width="10" height="10" fill="#4CAF50" rx="2"/>
|
||||
<text x="74" y="176" class="legend-text" fill="#333">LVGL 库 85.7KB</text>
|
||||
<rect x="255" y="167" width="10" height="10" fill="#2196F3" rx="2"/>
|
||||
@@ -39,7 +39,7 @@
|
||||
<rect x="645" y="167" width="10" height="10" fill="#607D8B" rx="2"/>
|
||||
<text x="659" y="176" class="legend-text" fill="#333">HAL 驱动 17.5KB</text>
|
||||
<rect x="60" y="183" width="10" height="10" fill="#FF9800" rx="2"/>
|
||||
<text x="74" y="192" class="legend-text" fill="#333">dhara / FTL 10.7KB</text>
|
||||
<text x="74" y="192" class="legend-text" fill="#333">dhara / FTL 11.0KB</text>
|
||||
<rect x="255" y="183" width="10" height="10" fill="#00BCD4" rx="2"/>
|
||||
<text x="269" y="192" class="legend-text" fill="#333">FreeRTOS 内核 10.5KB</text>
|
||||
<rect x="450" y="183" width="10" height="10" fill="#9C27B0" rx="2"/>
|
||||
@@ -49,5 +49,5 @@
|
||||
<rect x="60" y="199" width="10" height="10" fill="#B0BEC5" rx="2"/>
|
||||
<text x="74" y="208" class="legend-text" fill="#333">startup 0.5KB</text>
|
||||
<rect x="255" y="199" width="10" height="10" fill="#E0E0E0" rx="2"/>
|
||||
<text x="269" y="208" class="legend-text" fill="#333">其他 (长尾) 7.3KB</text>
|
||||
<text x="269" y="208" class="legend-text" fill="#333">其他 (长尾) 7.4KB</text>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 4.4 KiB |
@@ -474,6 +474,39 @@ cppcheck 是开源 C/C++ 静态分析工具,**不运行代码**,通过语法
|
||||
| **运行器** | `scripts/check_layer_deps.py`(纯标准库;`--verbose` 列全部边与判定、`--prune` 只报可删基线;退出码 0=通过 / 1=新增反向依赖) |
|
||||
| **实测自证** | 落地时做过一次"故意违规"验证:临时给 `Drivers/BSP/RS485/rs485.c` 加一行 `#include "cfg_file.h"` → 钩子当场 FAIL 并点名该文件与该头(退出码 1),删掉后转绿。**没有当场触发过的门禁等于没有门禁** |
|
||||
|
||||
### 2.27 bsp-err — BSP 错误码与超时命名约定(2026-10-23 加,报告 S-5)
|
||||
|
||||
| 项 | 说明 |
|
||||
|---|---|
|
||||
| **为什么需要** | 报告原文说"无统一错误码",实测更准的说法是**六套并存**:0/−1(SD2506、NETCFG、nand_ftl)、`int32_t`;
|
||||
自研枚举(`CH395F_STATUS_*`)、芯片寄存器原生码(`CH395F_ERR_*`,与前一套同模块并存)、
|
||||
`HAL_StatusTypeDef`(`rs485.h` 曾直接暴露)、`bool`,外加第三方 dhara 的出参 `dhara_error_t`
|
||||
与 FatFs 的 `FRESULT`。超时侧更乱:**同形两义**的 `*_TIMEOUT` 有四个(毫秒 / 自旋圈数 /
|
||||
其实是返回码),`osWaitForever` 与 `HAL_MAX_DELAY` 又**同为 0xFFFFFFFFU**(值同域不同,
|
||||
跨层转手既不报错也不变慢)。**没有机械检查的约定等于没有约定**(分层方向那条的教训) |
|
||||
| **约定正文在哪** | `Drivers/BSP/bsp_err.h`(**header-only,无 `.c`** → 不占体积、不需双端注册)。
|
||||
`0 = BSP_OK`、负值失败、`BSP_ERR_CAN_RETRY(e)` 把"能不能重试"变成跨模块可判定(这是本契约
|
||||
真正值钱的一条:以前"可重试"只写在个别注释里) |
|
||||
| **三条规则** | **R1** 公开 API 不得用 `HAL_StatusTypeDef` / `bool` 当错误通道(`is_/has_/can_/valid`
|
||||
这类**谓词**白名单放行——第一版误判了 7 个正当谓词,我们把规则改窄,**不拿基线去洗规则**);
|
||||
**R2** `*_TIMEOUT` 宏不得取负值(名字叫 TIMEOUT 却是返回码 → 一律改 `BSP_ERR_TIMEOUT`);
|
||||
**R3** 非 void 的公开 API 必须有「返回值:」注释(约定要能被读到才谈得上审查) |
|
||||
| **范围** | 只扫 `git ls-files` 里 `Drivers/BSP/**/*.h`(对外 API 面);**lftpd 按第三方排除**——
|
||||
它的 `226/425/450/550` 是 FTP 协议码不是内部错误码;**`net_*` BSD 兼容层不纳入**(用户裁定
|
||||
2026-10-23):调用方要的就是"返回字节数 + 每任务 errno 槽"那个形状,模拟器的 Winsock
|
||||
后端也照同一形状实现 |
|
||||
| **增量拦截** | 存量 **17 条**(首清点 19,2026-10-23 C1 还掉 2)钉 `BASELINE`(一个 `bool ui_content_page_open()` + 16 个缺「返回值:」),**只减不增**、脚本没有 `--write`;修完跑 `--prune` 会点名"这条已消失,
|
||||
请从基线删除" |
|
||||
| **配置** | `files: ^Drivers/BSP/\|^scripts/check_bsp_err\.py$\|^\.pre-commit-config\.yaml$`、
|
||||
`pass_filenames: false`(恒扫全库,要按 git 清单建公开头索引) |
|
||||
| **实测负结果(顺手记一条)** | `__attribute__((warn_unused_result))` **在 ARMCC v5 上不生效**:
|
||||
属性挂上、调用点裸调不接返回值,构建仍 0 错 0 警告。所以"返回值必须被消费"只能靠
|
||||
本脚本 + 书写约定"故意丢弃必须写 `(void)`",评审时看到既没 `(void)` 也没接住的调用就是漏判嫌疑 |
|
||||
| **踩坑提醒** | pre-commit 会 **stash 未暂存改动**再跑钩子。所以"改代码 + 同时更新基线"要在
|
||||
一次提交里**把改动 `git add` 了再跑**,否则钩子看到的是没有你改动的树,会假报警 |
|
||||
| **运行器** | `scripts/check_bsp_err.py`(纯标准库;`--verbose` 列全部命中归类、`--prune` 只报
|
||||
可删基线、`--emit-baseline` 建基线用;退出码 0/1/2) |
|
||||
|
||||
---
|
||||
|
||||
## 3. 日常工作流
|
||||
@@ -601,7 +634,7 @@ $env:PATH = [Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [Env
|
||||
|
||||
| 文件 | 位置 | 说明 |
|
||||
|---|---|---|
|
||||
| `.pre-commit-config.yaml` | 仓库根 | 钩子配置(**38 个钩子**,2026-10-22 清点;本文 §2 详解非单测类——N-19 新增的两个单测钩子见 §2.16/§2.17,N-23 双端注册反向校验(含 U4 补强的 UI 页面描述符表接线 ④)见 §2.18,N-27 RAM 预算门禁见 §2.19,B4 IEC104 协议栈单测见 §2.20,B8 频率测量单测见 §2.21,B9 SOE 动作记录单测见 §2.22,N-21 dhara NAND 移植层单测见 §2.23,U4 残余字符集差集检查见 §2.24,编号门禁八项校验见 §2.25,分层方向门禁见 §2.26,其余主机侧单测见 AGENTS.md 门禁条;主机侧单测共 16 个;UI 门禁另有 `font-charset` 与 `ui-golden`) |
|
||||
| `.pre-commit-config.yaml` | 仓库根 | 钩子配置(**39 个钩子**,2026-10-23 清点;本文 §2 详解非单测类——N-19 新增的两个单测钩子见 §2.16/§2.17,N-23 双端注册反向校验(含 U4 补强的 UI 页面描述符表接线 ④)见 §2.18,N-27 RAM 预算门禁见 §2.19,B4 IEC104 协议栈单测见 §2.20,B8 频率测量单测见 §2.21,B9 SOE 动作记录单测见 §2.22,N-21 dhara NAND 移植层单测见 §2.23,U4 残余字符集差集检查见 §2.24,编号门禁八项校验见 §2.25,分层方向门禁见 §2.26,BSP 错误码与超时命名约定门禁见 §2.27,其余主机侧单测见 AGENTS.md 门禁条;主机侧单测共 16 个;UI 门禁另有 `font-charset` 与 `ui-golden`) |
|
||||
| `.gitlint` | 仓库根 | gitlint 规则(宽松,兼容中文) |
|
||||
| `.cubemx_survival_baseline.json` | 仓库根 | CubeMX 易失定制基线(哈希;`--write` 重建) |
|
||||
| `scripts/check_mojibake.py` | scripts/ | U+FFFD 检测脚本 |
|
||||
@@ -614,6 +647,7 @@ $env:PATH = [Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [Env
|
||||
| `scripts/check_test_suite.py` | scripts/ | 测试套件开关门禁(防测试固件静默提交) |
|
||||
| `scripts/check_font_charset.py` | scripts/ | UI 字符集差集检查(复用 `tools/font_gen/` 提取与 cmap 解析规则,防缺字白框) |
|
||||
| `scripts/check_layer_deps.py` | scripts/ | 分层方向门禁(BSP 反向 include App 的增量拦截,存量基线只减不增) |
|
||||
| `scripts/check_bsp_err.py` | scripts/ | BSP 错误码与超时命名门禁(三条规则的增量拦截,存量 19 条基线只减不增;`--emit-baseline` 建基线) |
|
||||
| `docs/代码规范/嵌入式C语言代码规范_V1.0.md` | docs/代码规范/ | 代码规范原文(CODE-RULE-01~CODE-RULE-19 规则来源) |
|
||||
| `docs/代码规范/cppcheck使用说明.md` | docs/代码规范/ | cppcheck 钩子详解(规则/配置/抑制) |
|
||||
| `docs/文档规范.md` | docs/ | 文档体系规范(链接形态/命名/门禁要求) |
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
> 版本:v1.3 日期:2026-10-22(v1.2 2026-09-21)
|
||||
> 变更:v1.3 §4 的阶段子项改为**层级编号**(见下"编号约定");同步 2026-10-22 现状数字与
|
||||
> `data/ram_report_20261022.md` / `data/stack_report_20261022.md` 两份新快照。
|
||||
> 变更:2026-10-23 补 `data/ram_report_20261023.md` 快照(S-5 试点:RS485 改报 `bsp_err_t`,
|
||||
> `Code` 213,436 → **213,648**(S-5 全波 +212:契约试点 +48、C3 SD2506 +44、C1 GD5F/TPAFE +36、
|
||||
C2 dhara 失败类 +84;RO 另 +208,全是 C2 的失败类名表)→ `ER_IROM1` **232,508 B / 22.2%**;
|
||||
> **RAM 全部字段零增量**;受管表已由
|
||||
> `check_mem_numbers.py --write` 同步,配图常量同步)。
|
||||
> 变更:v1.2 数据现状全量同步——§2.1/§2.2/§5/§6/§8.6 等"现状"数据全部更新为 2026-09-21 lftpd 静态化后的最新 map 与实测值;清除 2026-09-11 历史口径残留(历史快照保留于 `data/`)
|
||||
> 适用工程:STM32F4-Base(STM32F407ZGTx @168MHz,FreeRTOS V10.3.1 + CMSIS-RTOS2)
|
||||
> 数据来源:`MDK-ARM/STM32F407-Demo/STM32F407-Demo.map`(`@build` 重建)+ `scripts/ram_report.py`(静态台账)+ `scripts/stack_report.py`(静态调用图 × 运行时栈水位)+ 源码静态分析 + 网络调研
|
||||
@@ -38,10 +43,10 @@
|
||||
<!-- MEM_SNAPSHOT:BEGIN generated by scripts/check_mem_numbers.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 |
|
||||
|---|---|---|---|
|
||||
| ER_IROM1 | 232,088 B (226.65 KB) | 1,048,576 B (1024 KB) | 22.1% |
|
||||
| ER_IROM1 | 232,508 B (227.06 KB) | 1,048,576 B (1024 KB) | 22.2% |
|
||||
| RW_IRAM1 | 75,264 B (73.50 KB) | 131,072 B (128 KB) | 57.4% |
|
||||
| RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
|
||||
| **Flash (ROM 合计)** | **233,276 B (227.8 KB)** | 1,048,576 B (1024 KB) | **22.2%** |
|
||||
| **Flash (ROM 合计)** | **233,696 B (228.2 KB)** | 1,048,576 B (1024 KB) | **22.3%** |
|
||||
<!-- MEM_SNAPSHOT:END -->
|
||||
|
||||
各区的容量与常量来源:
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<!-- MEM_BUDGET:BEGIN generated by scripts/ram_baseline.py -->
|
||||
| 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) |
|
||||
|---|---|---|---|---|
|
||||
| ER_IROM1 (Flash) | 232,088 B | 1,048,576 B | 22.1% | 参考 |
|
||||
| ER_IROM1 (Flash) | 232,508 B | 1,048,576 B | 22.2% | 参考 |
|
||||
| RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS |
|
||||
| UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 |
|
||||
| RW_IRAM1 | 75,264 B | 131,072 B | 57.4% | PASS |
|
||||
|
||||
@@ -0,0 +1,245 @@
|
||||
# STM32F4-Base RAM/Flash Usage Report
|
||||
|
||||
> Generated: 2026-10-23 01:35 Map: `STM32F407-Demo.map`
|
||||
|
||||
## 1. Grand Totals (全局总量)
|
||||
|
||||
| Metric | Value |
|
||||
|---|---|
|
||||
| Code (inc. data) | 213,648 B (208.6 KB) |
|
||||
| RO Data | 18,860 B (18.4 KB) |
|
||||
| RW Data (initialized) | 1,188 B (1.16 KB) |
|
||||
| ZI Data (zero-init) | 131,500 B (128.4 KB) |
|
||||
| **Total RO (Code + RO)** | **232,508 B (227.1 KB)** |
|
||||
| **Total RW (RW + ZI) = SRAM used** | **132,688 B (129.58 KB)** |
|
||||
| **Total ROM (Code + RO + RW init)** | **233,696 B (228.2 KB)** |
|
||||
|
||||
## 2. 执行区水位 (Execution Regions)
|
||||
|
||||
| Region | Base | Size | Max | Util% |
|
||||
|---|---|---|---|---|
|
||||
| ER_IROM1 | 0x08000000 | 232,508 B (227.06 KB) | 1,048,576 B (1024 KB) | 22.2% |
|
||||
| RW_CCM | 0x10000000 | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% |
|
||||
| UNINIT_CCM | 0x1000FF00 | 48 B (0.05 KB) | 256 B (0 KB) | 18.8% |
|
||||
| RW_IRAM1 | 0x20000000 | 75,264 B (73.50 KB) | 131,072 B (128 KB) | 57.4% |
|
||||
|
||||
## 3. RW_IRAM1 逐符号明细(ZI + RW,按大小降序)
|
||||
|
||||
| # | Address | Size (B) | Size (KB) | Type | Section | Object |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | 0x2000ADC8 | 16,384 | 16.00 | Zero | .bss | lv_mem_core_builtin.o |
|
||||
| 2 | 0x20007EB4 | 7,724 | 7.54 | Zero | .bss | lftpd.o |
|
||||
| 3 | 0x200107A4 | 6,746 | 6.59 | Zero | .bss | ui_net_sink.o |
|
||||
| 4 | 0x2000EDC8 | 6,408 | 6.26 | Zero | .bss | ui_port.o |
|
||||
| 5 | 0x2000667C | 6,200 | 6.05 | Zero | .bss | nand_ftl.o |
|
||||
| 6 | 0x20004E18 | 4,152 | 4.05 | Zero | .bss | ch395f.o |
|
||||
| 7 | 0x20002058 | 4,096 | 4.00 | Zero | .bss | console_log.o |
|
||||
| 8 | 0x20001278 | 3,552 | 3.47 | Zero | .bss | sys_log_mcu.o |
|
||||
| 9 | 0x20003644 | 2,724 | 2.66 | Zero | .bss | default_task.o |
|
||||
| 10 | 0x2000A524 | 1,720 | 1.68 | Zero | .bss | cmsis_os2.o |
|
||||
| 11 | 0x2000444C | 1,440 | 1.41 | Zero | .bss | sample_ring.o |
|
||||
| 12 | 0x20009F48 | 1,220 | 1.19 | Zero | .bss | tasks.o |
|
||||
| 13 | 0x20000D78 | 1,104 | 1.08 | Zero | .bss | cfg_file_store_mcu.o |
|
||||
| 14 | 0x20003058 | 1,064 | 1.04 | Zero | .bss | soe_store.o |
|
||||
| 15 | 0x20012200 | 1,024 | 1.00 | Zero | | startup_stm32f407xx.o |
|
||||
| 16 | 0x20005E50 | 800 | 0.78 | Zero | .bss | gd5f2gq5ue.o |
|
||||
| 17 | 0x200040E8 | 712 | 0.70 | Zero | .bss | iec104_serv.o |
|
||||
| 18 | 0x20000AB8 | 704 | 0.69 | Zero | .bss | cfg_file.o |
|
||||
| 19 | 0x200005D0 | 560 | 0.55 | Zero | .bss | spi.o |
|
||||
| 20 | 0x20000848 | 552 | 0.54 | Zero | .bss | usart.o |
|
||||
| 21 | 0x20009CE0 | 552 | 0.54 | Zero | .bss | lftpd_io.o |
|
||||
| 22 | 0x2000ABDC | 492 | 0.48 | Zero | .bss | lv_init.o |
|
||||
| 23 | 0x20004C38 | 480 | 0.47 | Zero | .bss | freq.o |
|
||||
| 24 | 0x2000629C | 416 | 0.41 | Zero | .bss | net_socket.o |
|
||||
| 25 | 0x200064DC | 416 | 0.41 | Zero | .bss | net_pending.o |
|
||||
| 26 | 0x200034C4 | 384 | 0.38 | Zero | .bss | task_prof.o |
|
||||
| 27 | 0x20004A8C | 320 | 0.31 | Zero | .bss | prot_set.o |
|
||||
| 28 | 0x2000A40C | 280 | 0.27 | Zero | .bss | timers.o |
|
||||
| 29 | 0x20006190 | 268 | 0.26 | Zero | .bss | rs485.o |
|
||||
| 30 | 0x200011C8 | 176 | 0.17 | Zero | .bss | prot_set_store.o |
|
||||
| 31 | 0x200004C8 | 168 | 0.16 | Zero | .bss | adc.o |
|
||||
| 32 | 0x200002B4 | 160 | 0.16 | Data | .data | lftpd.o |
|
||||
| 33 | 0x200049EC | 160 | 0.16 | Zero | .bss | phasor.o |
|
||||
| 34 | 0x200106D0 | 152 | 0.15 | Zero | .bss | ui_menu_view.o |
|
||||
| 35 | 0x2000643C | 128 | 0.12 | Zero | .bss | net_listener.o |
|
||||
| 36 | 0x20004BCC | 108 | 0.11 | Zero | .bss | prot_elm.o |
|
||||
| 37 | 0x20000570 | 84 | 0.08 | Zero | .bss | i2c.o |
|
||||
| 38 | 0x200043F8 | 84 | 0.08 | Zero | .bss | adc_input.o |
|
||||
| 39 | 0x20000250 | 83 | 0.08 | Data | .data | ftp_cfg.o |
|
||||
| 40 | 0x20000800 | 72 | 0.07 | Zero | .bss | tim.o |
|
||||
| 41 | 0x20000A70 | 72 | 0.07 | Zero | .bss | stm32f4xx_hal_timebase_tim.o |
|
||||
| 42 | 0x20003480 | 68 | 0.07 | Zero | .bss | task_watchdog.o |
|
||||
| 43 | 0x20000484 | 65 | 0.06 | Zero | .bss | freertos.o |
|
||||
| 44 | 0x20009F08 | 64 | 0.06 | Zero | .bss | queue.o |
|
||||
| 45 | 0x20000358 | 60 | 0.06 | Data | .data | tasks.o |
|
||||
| 46 | 0x20000410 | 60 | 0.06 | Data | .data | ui_page_selftest.o |
|
||||
| 47 | 0x20010768 | 60 | 0.06 | Zero | .bss | ui_page_runlog.o |
|
||||
| 48 | 0x20000150 | 48 | 0.05 | Data | .data | adc_health.o |
|
||||
| 49 | 0x200043C8 | 48 | 0.05 | Zero | .bss | iec104_pts.o |
|
||||
| 50 | 0x20000000 | 44 | 0.04 | Data | .data | freertos.o |
|
||||
| 51 | 0x2000009C | 44 | 0.04 | Data | .data | task_watchdog.o |
|
||||
| 52 | 0x20000044 | 36 | 0.04 | Data | .data | sys_log_mcu.o |
|
||||
| 53 | 0x2000022C | 36 | 0.04 | Data | .data | net_cfg.o |
|
||||
| 54 | 0x2000044C | 32 | 0.03 | Data | .data | ui_standby.o |
|
||||
| 55 | 0x20006170 | 32 | 0.03 | Zero | .bss | tpafe5160.o |
|
||||
| 56 | 0x200064BC | 32 | 0.03 | Zero | .bss | net_events.o |
|
||||
| 57 | 0x20000128 | 28 | 0.03 | Data | .data | adc_input.o |
|
||||
| 58 | 0x20000068 | 24 | 0.02 | Data | .data | console_log.o |
|
||||
| 59 | 0x200000E4 | 24 | 0.02 | Data | .data | adc_task.o |
|
||||
| 60 | 0x20000180 | 24 | 0.02 | Data | .data | prot_set.o |
|
||||
| 61 | 0x2000019C | 24 | 0.02 | Data | .data | freq.o |
|
||||
| 62 | 0x20000200 | 24 | 0.02 | Data | .data | net_listener.o |
|
||||
| 63 | 0x200043B0 | 24 | 0.02 | Zero | .bss | protect_task.o |
|
||||
| 64 | 0x20000030 | 20 | 0.02 | Data | .data | cfg_file.o |
|
||||
| 65 | 0x20000080 | 20 | 0.02 | Data | .data | soe_store.o |
|
||||
| 66 | 0x200001D0 | 20 | 0.02 | Data | .data | gd5f2gq5ue.o |
|
||||
| 67 | 0x20000394 | 20 | 0.02 | Data | .data | timers.o |
|
||||
| 68 | 0x2000046C | 20 | 0.02 | Data | .data | ui_net_sink.o |
|
||||
| 69 | 0x200003D4 | 18 | 0.02 | Data | .data | ui_menu.o |
|
||||
| 70 | 0x200000FC | 16 | 0.02 | Data | .data | iec104_serv.o |
|
||||
| 71 | 0x20000118 | 16 | 0.02 | Data | .data | iec104_pts.o |
|
||||
| 72 | 0x200001F0 | 16 | 0.02 | Data | .data | net_socket.o |
|
||||
| 73 | 0x20000218 | 16 | 0.02 | Data | .data | net_events.o |
|
||||
| 74 | 0x200002A4 | 16 | 0.02 | Data | .data | nand_ftl.o |
|
||||
| 75 | 0x200003F0 | 16 | 0.02 | Data | .data | ui_content_page.o |
|
||||
| 76 | 0x200000D4 | 12 | 0.01 | Data | .data | default_task.o |
|
||||
| 77 | 0x200001B4 | 12 | 0.01 | Data | .data | stm32f4xx_hal.o |
|
||||
| 78 | 0x200001E4 | 12 | 0.01 | Data | .data | tpafe5160.o |
|
||||
| 79 | 0x200003AC | 12 | 0.01 | Data | .data | port.o |
|
||||
| 80 | 0x200003C8 | 12 | 0.01 | Data | .data | ui_port.o |
|
||||
| 81 | 0x20000400 | 12 | 0.01 | Data | .data | ui_page_password.o |
|
||||
| 82 | 0x200005C4 | 12 | 0.01 | Zero | .bss | iwdg.o |
|
||||
| 83 | 0x200001C4 | 10 | 0.01 | Data | .data | ch395f.o |
|
||||
| 84 | 0x20000094 | 8 | 0.01 | Data | .data | sys_clock.o |
|
||||
| 85 | 0x200000C8 | 8 | 0.01 | Data | .data | task_prof.o |
|
||||
| 86 | 0x2000010C | 8 | 0.01 | Data | .data | protect_task.o |
|
||||
| 87 | 0x20000144 | 8 | 0.01 | Data | .data | sample_ring.o |
|
||||
| 88 | 0x200003B8 | 8 | 0.01 | Data | .data | ff.o |
|
||||
| 89 | 0x200003C0 | 8 | 0.01 | Data | .data | ffsystem.o |
|
||||
| 90 | 0x200003E8 | 8 | 0.01 | Data | .data | ui_menu_view.o |
|
||||
| 91 | 0x2000002C | 4 | 0.00 | Data | .data | app_main.o |
|
||||
| 92 | 0x200000D0 | 4 | 0.00 | Data | .data | vol_lock.o |
|
||||
| 93 | 0x200000E0 | 4 | 0.00 | Data | .data | net_task.o |
|
||||
| 94 | 0x200001C0 | 4 | 0.00 | Data | .data | system_stm32f4xx.o |
|
||||
| 95 | 0x20000228 | 4 | 0.00 | Data | .data | net_pending.o |
|
||||
| 96 | 0x20000354 | 4 | 0.00 | Data | .data | lftpd_io.o |
|
||||
| 97 | 0x200003A8 | 4 | 0.00 | Data | .data | cmsis_os2.o |
|
||||
| 98 | 0x20000480 | 4 | 0.00 | Data | .data | mc_w.l(errno.o) |
|
||||
| 99 | 0x2000014C | 2 | 0.00 | Data | .data | phasor.o |
|
||||
| 100 | 0x2000040C | 2 | 0.00 | Data | .data | ui_page_net_cfg.o |
|
||||
| 101 | 0x20000198 | 1 | 0.00 | Data | .data | prot_elm.o |
|
||||
| | | **75,243** | **73.48** | | | **Total** |
|
||||
|
||||
## 4. Image Component Sizes(RW + ZI > 0,按大小降序)
|
||||
|
||||
| # | Object | Code | RO | RW | ZI | RW+ZI |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | heap_4.o | 512 | 69 | 32 | 57,344 | 57,376 |
|
||||
| 2 | lv_mem_core_builtin.o | 410 | 0 | 0 | 16,384 | 16,384 |
|
||||
| 3 | lftpd.o | 6,352 | 509 | 160 | 7,724 | 7,884 |
|
||||
| 4 | ui_net_sink.o | 1,126 | 67 | 20 | 6,746 | 6,766 |
|
||||
| 5 | ui_port.o | 418 | 0 | 12 | 6,408 | 6,420 |
|
||||
| 6 | nand_ftl.o | 2,434 | 384 | 16 | 6,200 | 6,216 |
|
||||
| 7 | ch395f.o | 3,978 | 603 | 10 | 4,152 | 4,162 |
|
||||
| 8 | console_log.o | 980 | 55 | 24 | 4,096 | 4,120 |
|
||||
| 9 | sys_log_mcu.o | 3,074 | 83 | 36 | 3,552 | 3,588 |
|
||||
| 10 | default_task.o | 2,332 | 280 | 12 | 2,724 | 2,736 |
|
||||
| 11 | cmsis_os2.o | 1,496 | 0 | 4 | 1,720 | 1,724 |
|
||||
| 12 | sample_ring.o | 292 | 0 | 8 | 1,440 | 1,448 |
|
||||
| 13 | tasks.o | 4,342 | 0 | 60 | 1,220 | 1,280 |
|
||||
| 14 | cfg_file_store_mcu.o | 380 | 24 | 0 | 1,104 | 1,104 |
|
||||
| 15 | soe_store.o | 816 | 28 | 20 | 1,064 | 1,084 |
|
||||
| 16 | startup_stm32f407xx.o | 36 | 392 | 0 | 1,024 | 1,024 |
|
||||
| 17 | gd5f2gq5ue.o | 3,954 | 478 | 20 | 800 | 820 |
|
||||
| 18 | iec104_serv.o | 1,188 | 16 | 16 | 712 | 728 |
|
||||
| 19 | cfg_file.o | 5,970 | 810 | 20 | 704 | 724 |
|
||||
| 20 | spi.o | 584 | 0 | 0 | 560 | 560 |
|
||||
| 21 | lftpd_io.o | 1,198 | 0 | 4 | 552 | 556 |
|
||||
| 22 | usart.o | 884 | 0 | 0 | 552 | 552 |
|
||||
| 23 | freq.o | 764 | 8 | 24 | 480 | 504 |
|
||||
| 24 | lv_init.o | 156 | 0 | 0 | 492 | 492 |
|
||||
| 25 | net_socket.o | 4,944 | 443 | 16 | 416 | 432 |
|
||||
| 26 | net_pending.o | 1,400 | 0 | 4 | 416 | 420 |
|
||||
| 27 | task_prof.o | 638 | 185 | 8 | 384 | 392 |
|
||||
| 28 | prot_set.o | 844 | 640 | 24 | 320 | 344 |
|
||||
| 29 | timers.o | 1,232 | 0 | 20 | 280 | 300 |
|
||||
| 30 | rs485.o | 168 | 0 | 0 | 268 | 268 |
|
||||
| 31 | prot_set_store.o | 236 | 74 | 0 | 176 | 176 |
|
||||
| 32 | adc.o | 580 | 0 | 0 | 168 | 168 |
|
||||
| 33 | phasor.o | 420 | 258 | 2 | 160 | 162 |
|
||||
| 34 | task_watchdog.o | 1,110 | 137 | 44 | 116 | 160 |
|
||||
| 35 | ui_menu_view.o | 2,034 | 16 | 8 | 152 | 160 |
|
||||
| 36 | net_listener.o | 948 | 207 | 24 | 128 | 152 |
|
||||
| 37 | adc_input.o | 592 | 27 | 28 | 84 | 112 |
|
||||
| 38 | freertos.o | 716 | 592 | 44 | 65 | 109 |
|
||||
| 39 | prot_elm.o | 708 | 227 | 1 | 108 | 109 |
|
||||
| 40 | i2c.o | 168 | 0 | 0 | 84 | 84 |
|
||||
| 41 | ftp_cfg.o | 152 | 225 | 83 | 0 | 83 |
|
||||
| 42 | stm32f4xx_hal_timebase_tim.o | 152 | 0 | 0 | 72 | 72 |
|
||||
| 43 | tim.o | 168 | 0 | 0 | 72 | 72 |
|
||||
| 44 | iec104_pts.o | 1,082 | 132 | 16 | 48 | 64 |
|
||||
| 45 | queue.o | 2,840 | 0 | 0 | 64 | 64 |
|
||||
| 46 | ui_page_runlog.o | 28 | 105 | 0 | 60 | 60 |
|
||||
| 47 | ui_page_selftest.o | 28 | 109 | 60 | 0 | 60 |
|
||||
| 48 | adc_health.o | 432 | 0 | 48 | 0 | 48 |
|
||||
| 49 | net_events.o | 1,994 | 809 | 16 | 32 | 48 |
|
||||
| 50 | tpafe5160.o | 808 | 67 | 12 | 32 | 44 |
|
||||
| 51 | net_cfg.o | 832 | 103 | 36 | 0 | 36 |
|
||||
| 52 | protect_task.o | 840 | 68 | 8 | 24 | 32 |
|
||||
| 53 | ui_standby.o | 1,208 | 67 | 32 | 0 | 32 |
|
||||
| 54 | adc_task.o | 1,520 | 234 | 24 | 0 | 24 |
|
||||
| 55 | (incl. Padding) | 288 | 95 | 16 | 5 | 21 |
|
||||
| 56 | ui_menu.o | 760 | 137 | 18 | 0 | 18 |
|
||||
| 57 | ui_content_page.o | 1,664 | 81 | 16 | 0 | 16 |
|
||||
| 58 | iwdg.o | 28 | 0 | 0 | 12 | 12 |
|
||||
| 59 | port.o | 762 | 73 | 12 | 0 | 12 |
|
||||
| 60 | stm32f4xx_hal.o | 116 | 0 | 12 | 0 | 12 |
|
||||
| 61 | ui_page_password.o | 686 | 175 | 12 | 0 | 12 |
|
||||
| 62 | ff.o | 7,962 | 282 | 8 | 0 | 8 |
|
||||
| 63 | ffsystem.o | 204 | 20 | 8 | 0 | 8 |
|
||||
| 64 | sys_clock.o | 1,788 | 286 | 8 | 0 | 8 |
|
||||
| 65 | app_main.o | 2,308 | 65 | 4 | 0 | 4 |
|
||||
| 66 | net_task.o | 1,460 | 72 | 4 | 0 | 4 |
|
||||
| 67 | system_stm32f4xx.o | 16 | 24 | 4 | 0 | 4 |
|
||||
| 68 | vol_lock.o | 92 | 0 | 4 | 0 | 4 |
|
||||
| 69 | errno.o | 20 | 0 | 4 | 0 | 4 |
|
||||
| 70 | ui_page_net_cfg.o | 1,004 | 105 | 2 | 0 | 2 |
|
||||
| | **All .o files** | **213,648** | **18,860** | **1,188** | **131,500** | **132,688** |
|
||||
|
||||
## 5. Flash (Code + RO Data) Top-30(按大小降序)
|
||||
|
||||
| # | Object | Code | RO Data | Code+RO |
|
||||
|---|---|---|---|---|
|
||||
| 1 | ff.o | 7,962 | 282 | 8,244 |
|
||||
| 2 | lftpd.o | 6,352 | 509 | 6,861 |
|
||||
| 3 | cfg_file.o | 5,970 | 810 | 6,780 |
|
||||
| 4 | net_socket.o | 4,944 | 443 | 5,387 |
|
||||
| 5 | lv_indev.o | 4,928 | 0 | 4,928 |
|
||||
| 6 | ch395f.o | 3,978 | 603 | 4,581 |
|
||||
| 7 | ui_font_cn_12.o | 0 | 4,545 | 4,545 |
|
||||
| 8 | lv_obj_pos.o | 4,526 | 16 | 4,542 |
|
||||
| 9 | lv_refr.o | 4,486 | 0 | 4,486 |
|
||||
| 10 | gd5f2gq5ue.o | 3,954 | 478 | 4,432 |
|
||||
| 11 | tasks.o | 4,342 | 0 | 4,342 |
|
||||
| 12 | lv_obj_scroll.o | 4,126 | 0 | 4,126 |
|
||||
| 13 | lv_obj_style.o | 4,106 | 0 | 4,106 |
|
||||
| 14 | lv_draw_sw_mask.o | 3,862 | 0 | 3,862 |
|
||||
| 15 | stm32f4xx_hal_spi.o | 3,586 | 0 | 3,586 |
|
||||
| 16 | lv_draw_sw_box_shadow.o | 3,246 | 0 | 3,246 |
|
||||
| 17 | sys_log_mcu.o | 3,074 | 83 | 3,157 |
|
||||
| 18 | lv_indev_scroll.o | 3,068 | 0 | 3,068 |
|
||||
| 19 | lv_obj.o | 2,982 | 43 | 3,025 |
|
||||
| 20 | lv_draw_sw_img.o | 2,960 | 0 | 2,960 |
|
||||
| 21 | queue.o | 2,840 | 0 | 2,840 |
|
||||
| 22 | journal.o | 2,834 | 0 | 2,834 |
|
||||
| 23 | iec104_link.o | 2,824 | 0 | 2,824 |
|
||||
| 24 | nand_ftl.o | 2,434 | 384 | 2,818 |
|
||||
| 25 | net_events.o | 1,994 | 809 | 2,803 |
|
||||
| 26 | default_task.o | 2,332 | 280 | 2,612 |
|
||||
| 27 | app_main.o | 2,308 | 65 | 2,373 |
|
||||
| 28 | printfa.o | 2,312 | 0 | 2,312 |
|
||||
| 29 | stm32f4xx_hal_i2c.o | 2,294 | 0 | 2,294 |
|
||||
| 30 | lv_display.o | 2,284 | 0 | 2,284 |
|
||||
| | **All .o files** | **213,648** | **18,860** | **232,508** |
|
||||
|
||||
> 自洽校验:per-file 213,648/18,860/1,188/131,500 vs Grand Totals 213,648/18,860/1,188/131,500(CodeΔ=+0 / ROΔ=+0 / RWΔ=+0 / ZIΔ=+0;精确一致(含 '('incl. Generated)'-'(incl. Padding)' 台账行))→ **PASS**
|
||||
@@ -621,3 +621,26 @@ lftpd 原先把全部异常路径一律按 error 级打(串口上带 `[ERR]`
|
||||
- 排障信息量不减:peer 级照旧打印,且比原来更准(带 `ret=` / `sk=` / `timeout(ms)`,措辞从
|
||||
"error reading next command"改成"control channel closed by peer"——原先那句把正常收尾
|
||||
写成了故障,误导过排查方向。
|
||||
|
||||
### 10.4 dhara 失败类:ECC / 预算耗尽 / 完整性故障(2026-10-23,S-5 C2)
|
||||
|
||||
一次 NAND 读写要穿过 **SPI → `gd5f_*` → dhara(`dhara_error_t`)→ FTL glue → FatFs `RES_ERROR`**
|
||||
五段,而 glue 以前把 dhara 的所有失败**压成一个 `GD5F_ERROR`**——上层分不清"该重试"、
|
||||
"该标坏块"、还是"块池见底了,重格式化也没用"。现在 `nand_ftl.c` 在**最早同时知道
|
||||
LPN 与原始码的位置**就地分类并打印(`ftl_err_name()` 给可读名;**本仓 dhara 没有编
|
||||
`error.c`,所以没有 `dhara_strerror()`,用它直接链接失败**——表是自己的一张短表):
|
||||
|
||||
| dhara 错误 | 归类 | 处置上为什么不同 |
|
||||
|---|---|---|
|
||||
| `ECC` / `TOO_BAD` | `BSP_ERR_CRC` | 位翻转不可纠或页太坏:**是页级问题**,读重试 / 由 dhara 换页,不代表卷坏 |
|
||||
| `JOURNAL_FULL` / `MAP_FULL` | `BSP_ERR_NO_SPACE` | 介质还健康,是 **journal / 映射层块池见底**:该走容量恢复(`../测试说明/存储维护与容量恢复.md`),此时重格式化只是把问题推回去 |
|
||||
| `BAD_BLOCK` / `RECOVER` / `NOT_FOUND` / `CORRUPT_MAP` / 越界 | `BSP_ERR_IO` | 映射或介质**完整性**故障:保卷 + 上报,不许自愈重格式化 |
|
||||
|
||||
- 这条分类与 **E-31** 是同一条纪律的两端:E-31 规定"只有扫描全程 I/O 干净且无
|
||||
checkpoint(`DHARA_E_TOO_BAD`)才算真空白卷",本表则保证失败**可读**——两者合起来
|
||||
才是"别把瞬态毛刺当卷损坏去 `f_mkfs`"(旧行为:单次 I2C/SPI 抖动 → 清 map → 整卷
|
||||
重格式化 → 静默销毁全部用户数据)。
|
||||
- **仍未闭环**:分类目前**只进日志**;`disk_read`/`disk_write` 对 FatFs 仍只能回 `RES_ERROR`
|
||||
(那是 FatFs 的契约)。要让 defaultTask 的卷健康探针**按类分支**,还需要一个跨调用
|
||||
存活的失败类快照(`nand_ftl_last_error()`,8 B;代价是要先定多写者纪律——
|
||||
defaultTask 与 testTask 都会碰存储)→ 报告 S-5 的 C4 待还项。
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
> 详细芯片行为见 `docs/芯片手册/GD5F2GQ5UExxG.md`,已知陷阱见 `docs/问题记录/GD5F2GQ5UE_Trap_Records.md`。
|
||||
>
|
||||
> **2026-10-03 错误通道硬化**(E-10/E-42/E-53/E-54/E-56/E-57,见 `问题记录/GD5F2GQ5UE_Trap_Records.md` TRAP-GD5F-06):
|
||||
> `wait_busy` 区分"超时"(`GD5F_BUSY_TIMEOUT`)与"真故障"(`GD5F_ERROR`)、`bbt_scan` 失败**放弃持久化**、
|
||||
> `wait_busy` 区分"超时"(`GD5F_WAIT_EXPIRED`,旧名 `GD5F_BUSY_TIMEOUT`)与"真故障"(`GD5F_ERROR`)、`bbt_scan` 失败**放弃持久化**、
|
||||
> init 全链路检查返回值 + **回读 B0h 校验 ECC 使能**、`read` 的 raw 契约文档化、公开 API 统一 `int32_t`。
|
||||
> 套件回归 `=== GD5F2GQ5UE Tests: 16/16 PASSED (failed=0) ===`。
|
||||
> ⚠ **编排器注意**:`TC-GD5F-704` 会**预期**打出 `[ERR][NAND] RX DMA buffer not DMA-reachable`(回落轮询,用例 PASS)——
|
||||
|
||||
@@ -397,7 +397,7 @@ docs\内存管理\RAM使用分析与优化方案.md:585 [路径引用] docs/内
|
||||
|
||||
| 主题 | 去处 |
|
||||
|---|---|
|
||||
| 提交门禁 38 个钩子 | `docs/代码规范/pre-commit使用说明.md` |
|
||||
| 提交门禁 39 个钩子 | `docs/代码规范/pre-commit使用说明.md` |
|
||||
| 自动化测试与台架流程 | `docs/测试说明/自动化测试流程.md` |
|
||||
| 文档写作规范(编码/链接/登记) | `docs/文档规范.md` |
|
||||
| 工具路径环境变量(换机) | `docs/环境与部署/本地工具路径环境变量方案.md` |
|
||||
|
||||
@@ -504,7 +504,7 @@ $env:DTU_KEIL_UV4 = 'D:\NotExist\UV4.exe' # 仅当前会话,不动用户级
|
||||
|
||||
| 资源 | 已用 | 总量 | 利用率 | 余量 | 红线说明 |
|
||||
|---|---|---|---|---|---|
|
||||
| Flash(`ER_IROM1` = Code + RO) | 232,088 B(226.6 KB) | 1 MB | 22.1% | ≈804 KB | **充裕**:产品需求无 OTA / 双镜像预算,Flash 不是卡点;死代码裁剪簇已收口 → `docs/问题记录/项目审查与优化建议报告.md` §5.4 |
|
||||
| Flash(`ER_IROM1` = Code + RO) | 232,508 B(227.06 KB) | 1 MB | 22.2% | ≈804 KB | **充裕**:产品需求无 OTA / 双镜像预算,Flash 不是卡点;死代码裁剪簇已收口 → `docs/问题记录/项目审查与优化建议报告.md` §5.4 |
|
||||
| 主 SRAM1(静态区;FreeRTOS 堆已迁 CCM) | 75,264 B(73.5 KB) | 128 KB | 57.4% | 55,808 B | 已不紧张——2026-10-11 堆迁 CCM 与 2026-10-15 `LV_MEM_SIZE` 40→16 KB 两步的结果 |
|
||||
| CCM(`RW_CCM` 段) | 57,376 B(56.0 KB) | 65,280 B | **87.9%** | **7,904 B** | **当前真正的红线**:加任务 / 抬栈 / 加堆会先在这里撞墙;`mem-budget` 钩子在 92% 拦提交 |
|
||||
|
||||
|
||||
@@ -216,7 +216,7 @@ if (ok) {
|
||||
- 公开 API 返回类型 `int` / `int32_t` 混用(码值均为小负数,无功能影响)。
|
||||
|
||||
**修复(2026-10-03)**:
|
||||
- `gd5f_wait_busy` 检查三次 HAL 调用,失败即返 `GD5F_ERROR`(与 `GD5F_BUSY_TIMEOUT` 区分)。
|
||||
- `gd5f_wait_busy` 检查三次 HAL 调用,失败即返 `GD5F_ERROR`(与 `GD5F_WAIT_EXPIRED` 区分;后者旧名 `GD5F_BUSY_TIMEOUT`,2026-10-23 按 S-5 R2 改名——返回码不许叫 `*_TIMEOUT`,因为同名形状里还有"毫秒数"和"自旋圈数"两种东西)。
|
||||
- `gd5f_bbt_scan` 返回错误码、每轮 `spare` 清零、读失败中止;`bbt_rebuild` 扫描失败
|
||||
**放弃持久化**(`gd5f_bbt_load()` 回滚 RAM 后直接返回,不 `bbt_save`)。
|
||||
- init 全链路检查返回值;init 后**回读 B0h 校验 ECC 使能(bit4)**,未使能即报错。
|
||||
|
||||
+71
-10
@@ -16,7 +16,7 @@
|
||||
| 维度 | 评级 | 今天的实测依据 | 相比 2026-10-15 的变化 |
|
||||
|---|---|---|---|
|
||||
| 结构与分层 | 🟢 良好 | 单向依赖未被破坏;双端注册反向校验 PASS;326 个编译单元全部可追溯 | 无退化 |
|
||||
| 文档与治理 | 🟢 良好 | 38 个提交钩子 + 16 套主机单测;工程 md 91 份;`doc-links` 全库 0 问题 | 新增 `编号门禁增量拦截` 与内存快照回填常态化 |
|
||||
| 文档与治理 | 🟢 良好 | 39 个提交钩子 + 16 套主机单测;工程 md 91 份;`doc-links` 全库 0 问题 | 新增 `编号门禁增量拦截` 与内存快照回填常态化 |
|
||||
| 内存与 Flash | 🟡 可控但已换位置 | SRAM1 **57.4%**(余 55,808 B)、Flash **22.1%**、**CCM 87.9%(余 7,904 B)** | **红线从 SRAM1 迁到 CCM**(堆 2026-10-11 迁 CCM + 池 40→16 KB 后 SRAM1 已宽松) |
|
||||
| 可靠性与自恢复 | 🟢 良好 | 4 个 Fault 全采集现场;IWDG 五面 `required_mask`;复位原因与 `[STACK]` 水位常开 | 台架复跑持续 PASS(今日真机 708 ms 起网、无 `[ERR]`/Fault) |
|
||||
| 测试与验证 | 🟡 半办 | 16 套主机单测 + `ui-golden`/`font-charset` 入门禁;TC 双向追溯 593∶271 交集 265 | **仍无覆盖率**、`coding-standard` **仍无 `malloc` 正则** |
|
||||
@@ -55,7 +55,7 @@
|
||||
`net_msg_queue_adopt()` 绑定(创建点不能外移——`osKernelInitialize()` 之前的创建类 API 会杀死启动;**故意不新建第二个队列**:那会白占 CCM 里 8×`net_msg_t`
|
||||
的堆空间,而 CCM 正是当前红线)。**两类从来不算债**:`stm32f4xx_it.c:241-256` 是 CubeMX「External variables」生成块;`:183/195/207/220` 是 `__asm` Handler
|
||||
里的汇编标签引用(ARMCC `__asm` 取不到 C 数据符号)。 | 无(后续由 `layer-deps` 与 `cubemx-survival` 两条门禁守着不回退:新增 `net-msgq-adopt` 存活项) |
|
||||
| 驱动规范 | S-5 ❌ | `bsp_err_t` 至今只出现在本报告里(无统一错误码/超时/重试约定) | 定义后进 `docs/代码规范/` |
|
||||
| 驱动规范 | **S-5 🟡 主体已落地**(2026-10-23:契约 + 门禁 + RS485/SD2506/TPAFE 收编 + GD5F 改名 + dhara 三类码) | 我原先写的"无统一错误码"**不准**,实测是 **六套并存**:0/−1(SD2506、NETCFG、nand_ftl)、自研枚举 `CH395F_STATUS_*`、**芯片寄存器原生码** `CH395F_ERR_*`(与前一套同模块并存)、`HAL_StatusTypeDef`(`rs485.h` 曾直接暴露)、`bool`,外加第三方 dhara 出参 `dhara_error_t` 与 FatFs `FRESULT`。超时侧是**同形两义**:`*_TIMEOUT` 里 100 是毫秒、`GD5F_SPI_TIMEOUT 100` 是**自旋圈数**、`GD5F/TPAFE5160_BUSY_TIMEOUT = -2` 其实是**返回码**;`osWaitForever` 与 `HAL_MAX_DELAY` **同为 0xFFFFFFFFU**(值同域不同,跨层转手不报错也不变慢)。真正值钱的不是码名,是"**能不能重试**"以前只写在个别注释里 | `Drivers/BSP/bsp_err.h`(header-only,含 `BSP_ERR_CAN_RETRY`)+ `bsp-err` 钩子(三条规则,基线 **19 → 17**);已收编 **RS485(HAL 枚举不再外泄)/ SD2506(11 个公共 API,I2C 超时终于归成可重试)/ TPAFE5160(含 E-44 的 FRSTDATA → `BSP_ERR_NO_DEVICE`)**,GD5F 的 `GD5F_BUSY_TIMEOUT` 改名 `GD5F_WAIT_EXPIRED` 消掉同形两义,FTL 坍缩点按 **ECC / 预算耗尽 / 完整性** 三类就地分类并打可读日志(§10.4)。`net_*` BSD 层与 `tpafe5160_snapshot()` 三态按裁定**不纳入**。**待还**:GD5F 私有码集整体收编(169 处、含板级套件 48 处,需真机 + 套件回归)、C4 失败类快照(让卷健康探针按类分支)、16 条缺「返回值:」注释 |
|
||||
| 网络 | N-09 / PHY ❌(N-25) | `NET_MAX_SOCKETS` 仍为 8(与单连接复用语义不符);PHY 强制 100M 无自协商回退;PASV 每次新建监听 | 见 §4.2;随 N-25 一并处置 |
|
||||
| 存储 | N-15 🟡(N-25) | `nand_ftl.o` 静态 6,216 B——三块 2 KB 级页缓冲并存未合并 | 与 R-3 同批评估 |
|
||||
| 存储/日志 | P2-10 ❌(N-25) | 卷锁现有 5 个使用者(配置原子写 / 日志 / SOE / lftpd_io / defaultTask),容量轮转删除与 UI 读并发仍未全覆盖 | 登记簿 S-5 面(卷锁覆盖面) |
|
||||
@@ -71,7 +71,7 @@
|
||||
- 体量:`MDK-ARM/STM32F407-Demo/STM32F407-Demo.map`(2026-10-22 `@build`)→ `data/ram_report_20261022.md`
|
||||
- 栈:`STM32F407-Demo.htm`(静态调用图)+ 同日真机 `[STACK]` 心跳 → `data/stack_report_20261022.md`
|
||||
- 仓库:`git ls-files` 逐个 `stat`(必须 `-z`,否则中文名被控制台代码页破坏)
|
||||
- 门禁:`.pre-commit-config.yaml`(38 个 `- id:`)+ 各钩子今日实跑输出
|
||||
- 门禁:`.pre-commit-config.yaml`(39 个 `- id:`)+ 各钩子今日实跑输出
|
||||
- 待办:`docs/任务规划/登记簿.md`(在策 18 条)与 `docs/任务规划/README.md` §2
|
||||
|
||||
### 1.2 复现命令(本报告所有数字可重跑)
|
||||
@@ -93,7 +93,7 @@ git ls-files -z | xargs -0 stat -c '%s'
|
||||
|
||||
| 名词 | 口径 |
|
||||
|---|---|
|
||||
| Flash 占用 | `Code + RO-data` = `ER_IROM1` = **232,088 B(22.1%)**;`ROM 合计` 再加 `RW` 初始化表 = 233,276 B(22.2%) |
|
||||
| Flash 占用 | `Code + RO-data` = `ER_IROM1` = **232,508 B(22.2%)**;`ROM 合计` 再加 `RW` 初始化表 = 233,696 B(22.3%) |
|
||||
| SRAM 占用 | `RW_IRAM1`(DMA 可达区)与 `RW_CCM`(仅 CPU)分开计,二者不可互换(规则 R2/R3) |
|
||||
| 最坏栈 | `max(armlink 静态调用图深度, 真机 [STACK] 高水位)`;判定线 `余量 ≥ max(1024 B ISR, 配置×30%)` |
|
||||
| 编译单元 | uvprojx 的 `<FilePath>` 计数(今日 **326 个 `.c`**,其中 LVGL 201);"自研 `.c`" 另按目录口径 114 个 |
|
||||
@@ -228,10 +228,10 @@ defaultTask 单属主;原子写经卷锁;旧档迁移已删除。**仍列为
|
||||
|
||||
### 5.1 实测基线
|
||||
|
||||
| 指标 | 2026-10-22 | 2026-10-15 | 说明 |
|
||||
| 指标 | 2026-10-23 | 2026-10-15 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `Code` | 213,436 B | 213,520 B | 当日累计:F-6 −332、SPI 回调 +16、消息队列 +32、FTP 日志级别 +28(RO 另 +72)、**LIST 满块续发 +172** |
|
||||
| `ER_IROM1`(Code+RO) | **232,088 B / 22.1%** | 232,280 B / 22.2% | 余 ≈803 KB |
|
||||
| `Code` | 213,648 B | 213,520 B | 10-23 S-5 全波 +212:契约试点 +48、C3 SD2506 迁移 +44、C1 GD5F/TPAFE 收编 +36、C2 dhara 失败类 +84(RO 另 +208 = 失败类名表);10-22 当日累计:F-6 −332、SPI 回调 +16、消息队列 +32、FTP 日志级别 +28(RO 另 +72)、LIST 满块续发 +172 |
|
||||
| `ER_IROM1`(Code+RO) | **232,508 B / 22.2%** | 232,280 B / 22.2% | 余 ≈803 KB;**RAM 三项 10-23 零增量** |
|
||||
| `RW_IRAM1` | **75,264 B / 57.4%**(余 55,808) | 73,568 B / 56.1% | 增量来自 B5/B8 功能码 |
|
||||
| `RW_CCM` | **57,376 B / 87.9%**(余 7,904) | 57,376 B / 87.9% | **当前唯一红线** |
|
||||
| FreeRTOS 堆 | 56 KB(57,344 B)@CCM;实测 `free=15,800` / `min_ever=8,464` | 同 | 2026-10-22 真机 |
|
||||
@@ -271,7 +271,7 @@ defaultTask 单属主;原子写经卷锁;旧档迁移已删除。**仍列为
|
||||
| **F-6** 双精度软浮点 | ≈1 KB | **归因错**:全库 0 处 `%f`;剩余 `dadd/dmul/ddiv/depilogue/dfixul` 1,018 B 锁在 MicroLIB `printfa.o` 的 `_printf_core → _fp_digits`,只要用 `snprintf` 就删不掉。但**根因侧确有可修点**:`App/algo/prot_set.h` 两个 Q10 宏写成 `double` | ✅ **已落地 2026-10-22**:改单精度 → `@build` −332 B、5 个 helper(300 B)消失;数值逐位等价(穷举 42 个字面量 + int32 全域 ÷1024 往返 4.49×10⁶ 例零差异);真机 `@test` PASS |
|
||||
|
||||
**当前可回收 Flash = 0 B**(F-4/F-6 已定论,图片链同理不打补丁)。LVGL 仍占镜像 **37.8%**
|
||||
(87,706 / 232,088 B)——这是"用 LVGL 画单色菜单"的结构性代价,F-1/F-2/F-3 已省掉 64,576 B。
|
||||
(87,706 / 232,508 B)——这是"用 LVGL 画单色菜单"的结构性代价,F-1/F-2/F-3 已省掉 64,576 B。
|
||||
|
||||
### 5.5 内存治理长效机制(常开,不受暂缓影响)
|
||||
|
||||
@@ -324,7 +324,7 @@ W6 簇按 U4 → U1 → U3 → U2 的顺序执行完毕(U2 停在"够用即止
|
||||
| 波次 | 本报告条目(今天状态) | 备注 |
|
||||
|---|---|---|
|
||||
| ~~W3 预算与内存~~ ⏸ | R-9 ✅ / R-2 后半、R-3、R-4、R-6 暂缓 | 暂缓期间无验收动作,观测照常 |
|
||||
| W4 结构债 | N-14 ⏸、F-5 🟡、S-1/S-2/S-4/S-5、N-25 | `--strict` 已默认;`bsp_err_t` 仍未进规范 |
|
||||
| W4 结构债 | N-14 ⏸、F-5 🟡、S-1/S-2/S-4/S-5、N-25 | `--strict` 已默认;S-5 契约/门禁已落地并收编三模块(基线 19→17,剩 GD5F 码集 + C4 快照) |
|
||||
| W5 验证常态 | 覆盖率、`malloc` 正则、TC 差异 13 处升门禁 | 逢窗口顺手做 |
|
||||
| W6 UI 扩展 | U2 残余、U5 页量 | 随产品需求,不再单列专项 |
|
||||
| W7 仓库决策 | D-1(N-29) | 已决策暂不处理;对外交付前重评 |
|
||||
@@ -383,7 +383,7 @@ W6 簇按 U4 → U1 → U3 → U2 的顺序执行完毕(U2 停在"够用即止
|
||||
| **S-2** | 跨模块裸 `extern` | ✅ **已闭环 2026-10-22**(24 处手写全消;两类本就不算债见 §0.4) | 本文变更记录 2026-10-22 三行;契约见 `App/task/task_handles.h`、`gd5f_spi1_notify_*`、`net_msg_queue_adopt` |
|
||||
| **S-4** | `app_cfg.h` 未接线占位开关 | ✅ **已闭环 2026-10-22**(4 个零消费点宏删除) | `App/app/app_cfg.h` 修改记录 v1.2;口径同步见 `../环境与部署/项目部署环境要求.md` §3.2/§3.5、`../产品需求/产品需求设计文档.md`、`../任务规划/排期详述.md` C5 |
|
||||
| **S-3** | `.ioc` 侧 USART1 配置 | ❌ 在策 | 登记簿 S-3 |
|
||||
| **S-5** | 统一 `bsp_err_t` 错误码约定 | ❌ 未做 | 本文 §0.4、`docs/代码规范/`(待建) |
|
||||
| **S-5** | 统一 `bsp_err_t` 错误码与超时命名约定 | 🟡 主体已落地(2026-10-23:契约 + `bsp-err` 钩子 + RS485/SD2506/TPAFE 收编 + GD5F 改名 + dhara 三类码;基线 19 → 17) | 本文 §0.4、`pre-commit使用说明.md` §2.27、`STM32F4-Base存储架构说明.md` §10.4、`Drivers/BSP/bsp_err.h` |
|
||||
| R-1 ~ R-9 | 内存优化项(R-9 已落地、R-5 判定不可行、其余随簇暂缓) | 见 §5.3 | 本文 §5.3、`../内存管理/RAM预算台账.md` |
|
||||
| F-1 / F-2 / F-3 | LVGL 死代码裁剪,省 64,576 B | ✅ 已落地 2026-10-11 | `../内存管理/RAM使用分析与优化方案.md` §2.6.4 |
|
||||
| **F-4 / F-5 / F-6** | Flash 双精度与死代码簇 | ✅/🟡/❌ 见 §5.4 | 本文 §5.4、`App/algo/prot_set.h` 注释 |
|
||||
@@ -442,6 +442,67 @@ admin/admin(SHA-256 `pwd_hash`)→ 该脚本**必然登录失败**;它是
|
||||
| | 数字联动照做:两份 `data/` 快照重跑、`ram_baseline --update/--write`、`check_mem_numbers --write`、FLASH 与
|
||||
任务栈两张配图重算重生成(逐文本复查越界 = 0)、本文 §1.3/§5.1/§5.4 与部署文档 §3.3 同步;§0.4 的 S-2 行按
|
||||
「完成即销项」改写、§9 拆出 S-2 行标 ✅。 |
|
||||
| **2026-10-23** | **S-5 第二波:C3 SD2506 整模块收编 + C1 GD5F/TPAFE 同形两义 + C2 dhara 失败类**(用户指定顺序 C3 → C1 → C2) | **C3**:`sd2506.h` 三枚私有宏(`SD2506_OK/ERROR/I2C_ERROR`)**删除而不是留别名**(留别名 = 新代码还能继续用旧形状,等于把迁移洗掉),11 个公共 API + 6 个内部 helper 改 `bsp_err_t`;新增 `sd2506_err_from_hal()`,**把 I2C 超时从"和没人应答同一个 −2"里拆出来归成 `BSP_ERR_TIMEOUT`(可重试)**——SD2506 是启动链第一站、I2C1 上电时序敏感,这是本波最实在的一处语义改善;
|
||||
`sd2506_init` 的 charge 寄存器**回读校验不符**原返 `SD2506_ERROR`(参数类)→ 改归 `BSP_ERR_IO`。连带迁移 `App`(`sys_clock.c`、`app_main.c`)、板级 RTC 套件、
|
||||
主机单测(`test/host/sys_clock/` 桩 + `run_unit_test.py` 补 `Drivers/BSP` include 路径)→ **单测 100/100**。 |
|
||||
| | **C1**:GD5F 的 `GD5F_BUSY_TIMEOUT` 改名 `GD5F_WAIT_EXPIRED`(**值 −2 不变**,纯消"名字叫 TIMEOUT 其实是返回码"),GD5F 私有码集**整体**收编**没做**——169 处引用里 48 处在板级套件、
|
||||
还要动 Trap 记录用词,得单独一波配真机回归,不夹带。TPAFE5160 收编(23 处):`BUSY_TIMEOUT → BSP_ERR_TIMEOUT`、`ERROR → BSP_ERR_PARAM`(**同值 −1,行为零变化**)、
|
||||
`FRSTDATA_ERR → BSP_ERR_NO_DEVICE`(E-44 的本义就是"芯片没驱动 DB 总线",归到**器件无响应**比留在私有 −3 有用,且避开与 `BSP_ERR_TIMEOUT` 撞值)。
|
||||
**`tpafe5160_snapshot()` 刻意不套成败码**:它 1=有新帧 / 0=无新帧 / −1=参数错,**0 不是错误**,是"这一拍没有新数据",强行收编会把慢消费者的正常路径变成失败。 |
|
||||
| | **也纠我第二次写错的一条**:我在 `bsp_err.h` 里断言"本层只有 `net_*` 一族把数量与错误挤在同一返回值"——`snapshot`/`adc_input_poll` 就是第二族,已把两族都写明并各注原因。 |
|
||||
| | **C2**:FTL 坍缩点(`ftl_flush_cache`/`ftl_read_page`)不再把 dhara 失败压成 `GD5F_ERROR`,按处置差异分三类并**就地**打日志(最早同时知道 LPN 与原始码的位置):`ECC/TOO_BAD →
|
||||
BSP_ERR_CRC`(页级,重试/换页)、`JOURNAL_FULL/MAP_FULL → BSP_ERR_NO_SPACE`(**块池见底,重格式化只是把问题推回去**)、其余 `→ BSP_ERR_IO`(完整性,保卷 +
|
||||
上报,不许自愈重格式化)——与 **E-31** 是同一条纪律的两端。可读名用自建短表:**本仓 dhara 没有编 `error.c`,`dhara_strerror()` 会直接链接失败**。`disk_read`/`disk_write`
|
||||
仍回 `RES_ERROR`(那是 FatFs 契约),要让 defaultTask 卷健康探针**按类分支**还差一个跨调用存活的快照 → **C4 待还**。口径 → `存储架构说明.md` §10.4。 |
|
||||
| | **又一次"凭猜测就会改错代码"的自查**:我一度认定 `DBG_ERROR("... err=%d", err)` 是把结构体塞进 varargs 的格式 bug,准备顺手修——**核过 `Lib/dhara/error.h`:`dhara_error_t`
|
||||
是 `enum`(标量)**,那行日志本来就合法。若没核实,我会把一条正常日志"修"成访问 `err.type` 而编译失败或语义错。 |
|
||||
| | **验收(这一波有真验证面,和 RS485 试点不同)**:`@build` **0 错 0 警告**(`Code` 213,648、RO 18,860、`ER_IROM1` **232,508 B / 22.2%**、**RAM 三项零增量**);`@test`
|
||||
PASS(681 ms)且逐条读到被改模块的锚点:`SD2506 init: OK (ret=0)` + ID/时间/温度/电池四条读回正常、`ADC init: OK`、`NAND init: OK`、`Map resumed: 14094/97504`、
|
||||
`adc=20803→28875` 帧计数持续递增(**证明 snapshot 三态语义没被改坏**)、`[ERR]/Fault/FAIL` 0 条;主机单测 100/100;`bsp-err` 基线 **19 → 17**、`--prune` 干净;
|
||||
`doc-links --all --sections-strict` 147 篇 0 问题;`layer-deps`、`id-check --strict`、`mem-numbers`、`mem-budget`、`task-table`、`ui-golden`、`registration-check` 全过。 |
|
||||
| | 口径与数字联动:`TPAFE5160/README.md`、`GD5F2GQ5UE_Test_Guide.md`、`GD5F2GQ5UE_Trap_Records.md`(旧名均留痕,便于对旧日志);`存储架构说明.md` **新增 §10.4**;
|
||||
`AGENTS.md` 与 `pre-commit使用说明.md` §2.27 的基线计数 19 → 17;配图桶按 .map 对象级增量大改(**dhara/FTL 10,931 → 11,222 = +291 全在 `nand_ftl.o`**、应用代码/UI
|
||||
+36 在 `app_main.o`、其余散量入"其他"7,557,桶和 = `Code+RO` 断言通过);`ram_baseline`/`check_mem_numbers --write`/`ram_report_20261023.md` 快照与本文
|
||||
§1.3/§5.1/§5.4、部署文档 §3.3 数字全部同步。**TPAFE5160/GD5F 两个对象的 Code 增量实测为 0**(纯改名,不产生一条指令)——这也是"改名不该被当成性能风险"的实证。 |
|
||||
| **2026-10-23** | **S-5 起步:BSP 错误码契约 + `bsp-err` 门禁 + RS485 试点**(钩子 38 → **39**) | 先纠本报告自己:原文「无统一错误码/超时/重试约定」**不准**,实测是**六套并存**——0/−1(SD2506、NETCFG、nand_ftl)、自研枚举 `CH395F_STATUS_*`、芯片寄存器原生码 `CH395F_ERR_*`(与前一套同模块并存)、`HAL_StatusTypeDef`(`rs485.h` 曾直接外泄)、`bool`,
|
||||
再加第三方 dhara 的出参 `dhara_error_t` 与 FatFs 的 `FRESULT`。超时侧是**同形两义**:`SD2506_I2C_TIMEOUT_MS 100`/`CH395F_SPI_BYTE_TIMEOUT_MS 100U` 是毫秒,`GD5F_SPI_TIMEOUT 100` 是
|
||||
**自旋圈数**(改 SPI 分频或换主频,时长跟着变且无人报警),`GD5F_BUSY_TIMEOUT` / `TPAFE5160_BUSY_TIMEOUT = -2` 其实是**返回码**;`osWaitForever` 与 `HAL_MAX_DELAY` **同为 0xFFFFFFFFU**
|
||||
(值同域不同 → 跨层转手既不报错也不变慢)。**契约真正值钱的是把「能不能重试」提到公共层**:
|
||||
以前它只写在个别注释里(`gd5f2gq5ue.c`:「GD5F_BUSY_TIMEOUT(-2) - 超时(可重试)」),
|
||||
语义在、跨模块不可判定。 |
|
||||
| | 新增 `Drivers/BSP/bsp_err.h`——**header-only、无 `.c`**(不占体积、不需双端注册):`0=BSP_OK`、
|
||||
11 个负值码、`BSP_ERR_CAN_RETRY(e)`、`BSP_WAIT_NONE/FOREVER/MS` 与边界纪律。边界纪律明确三件事:
|
||||
第三方码**就地映射不改名**(改名等于伪造语义);**`net_*` BSD 兼容层不纳入**(用户裁定:调用方
|
||||
要的就是「返回字节数 + 每任务 errno 槽」那个形状,模拟器 Winsock 后端同形状);**lftpd 按第三方
|
||||
排除**(它的 226/425/450/550 是 FTP 协议码,不是内部错误码)。 |
|
||||
| | **也纠我自己写错的一条**:我一度在 `bsp_err.h` 里把 `gd5f2gq5ue_read/write/erase` 当「计数或错误挤
|
||||
同一返回值」的反例——**核过实现与头注释,它们是「0=成功、其它=错误码」**,本层真正的 count-or-error
|
||||
只有 `net_*`(已裁定不纳入)。原文已改正,并把「数量走出参」降级为**面向新 API 的原则**。 |
|
||||
| | **试点 = RS485**:`rs485_transmit` / `rs485_receive_start` 不再外泄 `HAL_StatusTypeDef`,改 `bsp_err_t`
|
||||
+ 模块内 `static rs485_err_from_hal()` 映射(HAL 码不出模块),顺带补 `p_handle` 判空。
|
||||
`@build` **0 错 0 警告**(`Code` 213,436 → **213,484,+48 B**;RO 不变、**RAM 一字未动**)、`@test`
|
||||
PASS(702 ms)。**诚实标注**:这两个函数当前**没有生产调用点**(B2 冻结未接线),所以 `@test`
|
||||
只证明「没破坏启动」,**不证明新错误码在运行时被正确使用**——下一个试点该挑在启动链上的模块
|
||||
(建议 SD2506,41 处调用点)。 |
|
||||
| | **门禁 `bsp-err`**(`scripts/check_bsp_err.py`,三条规则:R1 不得拿 `HAL_StatusTypeDef`/`bool` 当错误
|
||||
通道、R2 `*_TIMEOUT` 宏不得取负值、R3 非 void 公开 API 必须有「返回值:」)。**规则改窄而不是
|
||||
拿基线洗规则**:第一版把 7 个正当谓词(`ui_..._is_active` / `has_children`)误判成违规,遂加
|
||||
`is_/has_/can_/valid` 白名单。存量 **19 条**钉基线、只减不增(两个 `*_BUSY_TIMEOUT = -2`、一个
|
||||
`bool ui_content_page_open()`、16 个缺注释)。**当场自证**:临时埋 3 条违规 → `命中 22(在册 19 /
|
||||
新增 3)`、**RC=1**,三条规则各自点名并给出路;删掉探针 → `19/19/新增 0`、RC=0。 |
|
||||
| | **一条实测负结果**(值得记):`__attribute__((warn_unused_result))` **在 ARMCC v5 上不生效**——
|
||||
属性挂上、调用点裸调不接返回值,构建仍 0 错 0 警告(第一次实验我误用 `(void)`,那本就是「故意
|
||||
丢弃」的写法,重做了一次)。所以「返回值必须被消费」只能靠门禁脚本 + 书写约定「故意丢弃必须
|
||||
写 `(void)`」。 |
|
||||
| | **pre-commit 的坑**:钩子跑之前会 **stash 未暂存改动**——我先把配置 `git add` 了但没加 rs485,
|
||||
钩子看到的树里 rs485 还是 `HAL_StatusTypeDef`,于是**假报警 2 条**。口径:改代码 + 同时更新基线
|
||||
时,**先把改动 `git add` 再跑钩子**。已写进 `pre-commit使用说明.md` §2.27。 |
|
||||
| | 口径同步:`AGENTS.md`(钩子数 + 枚举 + 索引行)、`pre-commit使用说明.md`(新增 §2.27 + 计数 +
|
||||
脚本清单行)、`并行任务工作树方案.md`、本文 §0.1/§0.4/§7 与 §9 的 S-5 行。数字联动(`ram_baseline
|
||||
--update/--write`、`check_mem_numbers --write`、FLASH 配图常量、本文 §1.3/§5.1/§5.4 与部署文档 §3.3)
|
||||
随本波提交一并做。**待还**:两个 `*_BUSY_TIMEOUT = -2` 改名(波及板级套件与 Trap 记录用词,需真机
|
||||
+ 套件回归)、FTL 坍缩点拆三类码(ECC / 介质 / 映射层坏块预算,让上层能区分「重试 / 标坏块 /
|
||||
别再 mkfs」)、其余模块逐个迁移。 |
|
||||
| **2026-10-22** | **S-1 只做「防扩大」那一半:新增 `layer-deps` 分层方向门禁**(推荐清单第 5 步拆分执行,钩子 37 → **38**) | 上一轮的结论是「反转暂缓、门禁现在就该上」,这次照做。
|
||||
为什么门禁比搬迁值钱:AGENTS 与分层图早就写着「六层单向依赖」,可从来没有机械检查——于是同一件事的记载从 2026-09 的
|
||||
「NETCFG 一处」漂到今天的「8 文件 9 处」,全靠人读代码才发现。边界的静默腐蚀只能靠门禁止住。 |
|
||||
|
||||
Reference in New Issue
Block a user