Files
STM32F4-Base/docs/内存管理/RAM预算台账.md
T
wandering1 48a8ef0564 feat(UI): 遥测死区与系数 2 页——注入表第四张、三态用脏位、WAIT 与 OK 各出一张黄金
这两页是「UI补齐」里唯一带**持久化语义**的一档,所以整笔的设计重心不在画面上,而在**页面如何诚实表达
「已受理」与「已落盘」**——这一点由 setpage-scout 在开工前的只读查实钉下来:cfg_file_save() 全仓唯一调用
者是 run_par_store_save(),而 default_task.c:246 **每轮无条件**调它、函数首行 s_dirty==0 就直接返回
⇒
落盘动力本来就在 defaultTask,不在 104 会话、也不在事件位。因此本笔走 A2(UI 不当授权写者),不需要
新事件位、不需要新同步口。

页面三态判据 = run_par_dirty_peek():ENTER / WAIT(脏位仍在 = 已受理未落盘)/ OK(脏位归零 = 整档已外科
保存成功)/ 写被拒 = ERR。两条限制写在页面注释里没藏:脏位是**整档全局**的(一趟落 [run_par] 9 键 +
[adc_cal] 两段,归零只证明「这一档落盘了」,不证明「我这一项单独落盘」);他人随后再改会重新置脏 ⇒ 沿用
clear/clock 页的结果锁存,把「我这次动作的结果」与「档位此刻的状态」分开。

**为什么黄金必须出两张**(这条是本轮最有价值的防假证据规则):模拟器假件**保留脏位**、全仓唯一的
s_yt_dirty=0 写点是 sim_yt_pump()(setter 只置不清),于是 WAIT 与 OK 各出一帧——两组同键序、唯一差别是
EXTRA 里的 --yt-nopump。若假件同步清脏位,真机的 WAIT 态永远不会被像素回归覆盖,黄金就成了「只钉住最
好看那一帧」。TC-UIDATA-028o 另钉住 ui_data 层零缓存。

形状:新增 ui_data 第四张注入表(八字段整表校验、拒残表),实现落在装配层 App/app/ui_data_feed.c,
页面零 App include(分层方向 + 模拟器不链 run_par 两条老理由都成立);共用视图模型 ui_w_ytview 承载两页。
合法域一律由执行侧出口给(run_par_db_range / RUN_PAR_K_MAX_UV),页面不抄第二真源——系数页 v1 只用粗守
并在注释写明两层守卫互不掩盖,µV/码 ×[0.5,2.0] 那条真带的出口器归 task-43,**没有**在页面里抄常量。

取舍与遗留(如实):系数行 d=0 整 µV(1e9 装不下两位小数,注释写了「要小数改哪、不收紧假上限」);b 覆盖
无口未做;徽标只画系数页;行名因「率」缺字改为 Hz死区(font-charset 机器先抓到的,不是我目测判的)。

实测:@build 0 错误 0 警告(Code=233,900 / RW-data=1,536);ui_data 单测 277/277、run_par
67/67 零回归;
内容页黄金 47 页全过、**存量 40 张逐字节零漂移**(git 里只有 7 张新增);menu_rows / 池水位 / font-charset
/
bom / mojibake / nested-comment / cppcheck / coding-standard / layer-deps /
bsp-err 全 0 新增;编号五项式
refs 8,778 / dec 7,622 / und **1,156**(上限 1,166)/ 比值 86.83%(基线 86.0% 之上)/ 错误差值
0,注释零裸形
字母+数字。generated-fresh 与 registration-check 本地 PASS;新增 6 只源文件按规矩**双端注册同笔**(叶子
+
registry 19→21 + uvprojx + CMakeLists),uvprojx 这次属「真的增删源文件」才入库。

移交三条不混进本笔:① 全量 --selftest 现 exit 1 是 task-41 硬闸在模拟器上也拒 reset/clear(既有红,快检档
不受影响),归台架道定夺;② 内容页 40→47 的全仓文档计数改写由 Lead 派;③ run_par_deadband_set 的限定
条件语措辞(「iec104Task 上下文」已被装配层裁定覆盖)归算法层下一笔。
2026-10-27 05:07:18 +08:00

8.5 KiB
Raw Blame History

RAM 预算台账(配额 · 趋势 · 门禁)

定位:docs/内存管理/RAM使用分析与优化方案.md §8.2 模板与 内存治理三件套的落地件(2026-10-12,登记簿条目「缩堆迁 CCM 后半(暂缓)」的已落地前半)。 回答三个问题:每个子系统还能用多少 RAM(配额)、总量趋势往哪走(基线 TSV)、 超了怎么拦(92% 门禁)。

数字不手抄:下方受管区由 scripts/ram_baseline.py --write 从 .map 生成, pre-commit mem-budget 钩子校验一致性(同 mem-numbers 的"事实源唯一"思路)。 配额是规划值,本文件 §2 是配额与阈值的唯一权威(2026-09 体系评审提出、2026-10-12 落地后报告侧条目已销项),改动 = 先登记本文件 §6 变更记录,再改 ram_baseline.py 的 QUOTAS。 区域放置与 DMA 可达性规则 → 内存内容分配策略.md(本文件不重复)。

1. 区域预算与门禁(受管区)

区域 用量 容量 占比 门禁(≤92%)
ER_IROM1 (Flash) 260,004 B 1,048,576 B 24.8% 参考
RW_CCM 57,376 B 65,280 B 87.9% PASS
UNINIT_CCM 48 B 256 B 18.8% 参考
RW_IRAM1 80,920 B 131,072 B 61.7% PASS
子系统(静态 RW+ZI;除 RTOS 堆在 CCM 外均在 SRAM1) 现值 配额 状态
网络 13,702 B 12 KB ⚠ 超 1.4 KB
存储 7,072 B 12 KB OK
UI 34,085 B 16 KB ⚠ 超 17.3 KB
RTOS 堆 57,376 B 56 KB 堆=配额
应用 15,537 B 8 KB ⚠ 超 7.2 KB
其它 10,523 B — 参考
  • 门禁:pre-commit mem-budget 钩子(scripts/ram_baseline.py --gate)—— RW_IRAM1 / RW_CCM 任一 >92% 即拦提交,并打印 Top-10 RW+ZI 对象定位增量; 无 .map 时自适应跳过(CI 盲区登记在 docs/任务规划/测试与架构专项.md「体积门禁 CI 强制路径」残余)。
  • 阈值依据:92% 由 2026-09 体系评审提出、2026-10-12 落地为门禁(提出时的报告条目已随销项删除,闭环说明见 RAM使用分析与优化方案.md §4 阶段 3「长效机制」与本文)——留 ~8% 给突发缓冲与栈抬升, 触线即触发排期,而不是静默逼近溢出。
  • 软提醒(不拦提交):tsv 末行落后于 .map(忘跑 --update)、.map 早于最新源码(忘 @build)。
  • 子系统归集为参考值:按对象名前缀归集(口径见 §2),合计与区域总量可差几十字节 (链接器填充行与 UNINIT_CCM 等小区分段所致);区域行才是门禁事实源。

2. 子系统配额口径

配额值(ram_baseline.py 的 QUOTAS,本文件即唯一权威; RTOS 堆 2026-10-12 B5 扩容 48→56 KB 见 §6):网络 12 KB / 存储 12 KB / UI 16 KB / RTOS 堆 56 KB / 应用 8 KB。归集口径(按 .map 对象名,首匹配):

子系统 计入对象(前缀/精确名) 不计入
网络 ch395f* net_* lftpd* ftp_task* ui_net_sink(算 UI)
存储 gd5f* nand_* ff* diskio* vol_lock* + dhara 裸名(map/journal/nand/fctl/era.o) cfg_*(算应用)
UI lv_* ui_*(含 ui_net_sink、ui_task) —
RTOS 堆 heap_4.o(CCM)——配额 = configTOTAL_HEAP_SIZE 本身 内核对象(tasks/queue/timers/... 归"其它")
应用 App/ 其余:采集 adc_*、保护 prot_*、相量 phasor/sample_ring、配置 cfg_*、日志 sys_/dbg_/console_log、对时 time_sync*、sys_clock、task_watchdog、sha256、tpafe*、sd2506、default_task 等 —
其它 内核对象、HAL、CMSIS、启动文件、C 库、链接器填充 —

现状判读(2026-10-12 建档):

  • UI ⚠ 超配额 = 已知长期挂账,不是新增违规:LVGL 池 16 KB(2026-10-15 落地,由 40 KB 收缩)+ 帧/远显缓冲 ≈12.8 KB,实测 30,412 B。配额 16 KB 描述的是 把 UI 侧缓冲迁进 CCM 之后的目标态, 而 该搬迁的后半已按用户裁定 2026-10-15 整簇暂缓(docs/任务规划/登记簿.md §5 保留重启条件)→ 这条 ⚠ 会长期挂着,判读时按已知挂账处理,别每轮当新问题追;重开条件 → RAM使用分析与优化方案.md §4。
  • RTOS 堆 = 配额本身:56 KB 即 configTOTAL_HEAP_SIZE(2026-10-12 B5 由 48 KB 扩容,见 §6; heap_4.o 另含 32 B 元数据,不计超);改堆 = 改配额,必须先过本文件 §6 登记。
  • 应用 ⚠ 小幅超:8 KB 为报告规划值;2026-10-10 栈整改把 3 处 FIL 从栈搬进 BSS (静态 +4,128 B,见 docs/内存管理/RAM使用分析与优化方案.md §4"2026-10-10 复测")—— 属已评审的"以空间换栈安全",差额在此如实体现。

3. CCM 分配台账(谁能用 CCM)

项 值 说明
CCM 容量 RW_CCM Max 见受管区 scatter RW_CCM;仅 CPU 可达,DMA 不可达(RM0090 §3.1.1)
现占用 仅 FreeRTOS 堆 heap_4(56 KB,2026-09-21 迁入;2026-10-12 B5 扩容 48→56 KB) 其余候选全部仍在 SRAM1
现余量 受管区 RW_CCM 容量 − 占用 = 7,904 B 不够 迁 CCM 后半的 UI 侧待迁体量(缩池后 29,570 B)——⏸ 该搬迁已暂缓,见下行
迁 CCM 后半解锁链 ⏸ 整簇暂缓(用户裁定 2026-10-15),本行保留作重开时的现状基线:① 缩池 ✅ 2026-10-15:LV_MEM_SIZE 40→16 KB → 待迁体量 54,146 → 29,570 B(SRAM1 74.9% → 56.1%,实测池峰值 6,568 B)→ ② 现在卡在这一步:堆 56→32 KB(docs/内存管理/RAM使用分析与优化方案.md §4.2.2(阶段 2 第 2 项"缩堆"),再腾 24 KB;⚠ 2026-10-12 B5 反向扩容至 56 KB——9 任务栈 + 队列实测需要,缩回 32 KB 前必须重跑 stack_report.py + 上板 min_ever 复测)→ ③ CCM 余 ≈31.9 KB ≥ 29,570 B → 迁入 暂缓期间不启动;重开条件 → RAM使用分析与优化方案.md §4。若重开,顺序不可颠倒;每步前后跑 stack_report.py / ram_report.py(铁律)
迁入前置 目标缓冲必须过 DMA 可达性清单(内存内容分配策略.md) 违例 = 静默传错(越界不校验的同类坑);克隆芯片 CCM 可靠性风险见 docs/内存管理/RAM使用分析与优化方案.md §7

4. 趋势基线(scripts/ram_baseline.tsv)

  • 每次 @build 后:& '.venv\Scripts\python.exe' scripts/ram_baseline.py --update 追加一行(Code/RO/RW/ZI + 三区水位 + Top-10 RW+ZI 对象;同日重跑覆盖当日行)。
  • 看趋势 / 找增量:scripts/ram_baseline.py --trend——高亮较上一行 RW+ZI 增长 >1 KB 的对象, 即 docs/内存管理/RAM使用分析与优化方案.md §4.0.3 "ZI 增量 >1KB 必须在提交说明中解释"的机械化;提交说明直接抄 --trend 输出行。

5. 超配额流程

新增/扩大静态缓冲导致子系统越过配额:先登记再动手——本文件 §6 加一行 (日期 / 子系统 / 现值→新值 / 原因 / 决定人),提交说明引用该行。 92% 门禁拦的是总量,配额管的是结构(谁挤占了谁),两者不可互替。

6. 变更记录

日期 变更 原因 / 出处
2026-10-12 建档:三件套落地(本台账 + scripts/ram_baseline.py + scripts/ram_baseline.tsv + pre-commit mem-budget 钩子) 登记簿 N-27 前半
2026-10-12 RTOS 堆配额 48 KB → 56 KB(QUOTAS 同步) B5 protectTask 立项:iec104Task(2.5KB)+protectTask(2KB)+TCB 入堆后 48KB 池 min_ever 预估跌破 3,072 B 告警线 → .ioc L1 参数 configTOTAL_HEAP_SIZE 49152→57344(CCM 水位 75.3%→87.9%,仍 <92% 门禁;CCM 空闲降至 ≈8 KB)。连带影响见 §3 迁 CCM 后半链注记
2026-10-12 任务栈 +1536 B(堆内用量,配额 56 KB 不变):defaultTask 1024→1280 words(+1024 B)、timeSyncTask 512→640 words(+512 B);产品任务栈合计 37,632→39,168 B 登记簿 N-33 栈收口:B7 定值持久化把 defaultTask 静态链推到 3016 B(余 1080 < 30% 线)、timeSyncTask 链 1264 B(余 784 < ISR 底线 1024);B6 台架背书 min_ever=10000 → 抬后实测 heap free=16400 / min_ever=8464(与预算 −1536 完全吻合,>3072 告警线);stack_report 9 任务 0 FAIL + @test PASS,见 RAM使用分析与优化方案.md §1.4