build(mdk): Keil 可逆排除 126 个零产出 LVGL 编译单元,全量重建 21.5→18.3 s(-14.6%,#46) #87
Reference in New Issue
Block a user
Delete Branch "execute-issue-46-214251580469"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
#46 的实测闭环:先补全量构建计时基线,再用 Keil 原生
<IncludeInBuild>0</IncludeInBuild>可逆排除零产出 LVGL 编译单元。实测有收益(全量重建 -14.6%,影像逐字节等价),故按判据保留改动。背景与判据
.c中 127 个在.map零产出,但增量构建仅 4~5 秒,「有全量构建耗时痛点时先补计时基线,再用可逆排除;有实测收益才保留改动」。方法
C:\Keil_v5\UV4\UV4.exe(ARMCC 5.06 update 7),masterc487ce42全新克隆,全量重建用UV4 -r(Rebuild all),计时为 UV4 进程级墙钟;每态 4 次。.map的 Image component sizes 表——Code/RO/RW/ZI全为 0(含完全不在表中出现的空 TU)。3 次基线认定的零产出名单完全一致:127 个 = 121 空 TU + 6 仅调试记录。.mapCross Reference Table(10,355 行)做不动点收敛——「被排除对象定义的符号若被任何保留对象引用则必须保留」。唯一收敛损失:lv_circle_buf.c(保留的lv_iter.o静态引用它;armlink 先解析后死删,死删只影响最终影像、不豁免解析)。127 全排的尝试实测在链接期报 9×L6218E Undefined symbol lv_circle_buf_*(referred from lv_iter.o),已复现并据此定 126。计时结果
touch Lib/lvgl/lvgl.h后-b,最常见共享头改动场景):基线 9.66 s / 83 个编译单元,排除态 8.06 s / 45 个(-1.60 s / -16.6%;126 个被排除者中 38 个依赖该头)。等价性证据(排除 ≠ 无副作用,这里给硬证据)
Program Size: Code=254820 RO-data=30896 RW-data=2072 ZI-data=150104——全部构建(基线×4、排除×4)四项全同。.hex解析为 286,084 个 flash 字节两两比对:地址集合全同;差异仅 2~4 字节、全部落在0x08007C6B–0x08007C6F的"fw build: … HH:MM:SS"身份戳时间窗内——基线构建之间同样只差这几字节,与排除无关。.map符号表(Image Symbol Table段,6,419 行)逐行比对:排除构建是基线的真子集,基线独有 126 行恰为被排除编译单元的ABSOLUTE文件记录,其余符号名/取值/段/对象逐行相同;无任何符号地址移动。0 Error(s), 0 Warning(s);registration-check的<FilePath>集合不变(只加<FileOption>,不删文件条目)。改动形态与回滚
MDK-ARM/STM32F407-Demo.uvprojx,+630/-0:126 个 LVGL<File>各插入一个<FileOption><CommonProperty><IncludeInBuild>0</IncludeInBuild></CommonProperty></FileOption>。文件保留在工程组内,UV4 GUI 里逐项勾选即可恢复;revert 单笔提交整体回退。simulator/CMakeLists.txt不涉及(模拟器编译面独立于 uvprojx);LVGL 库源码零改动。git status除日志外无改动),故提交文件与构建所用文件字节一致;最终一次全量构建(18.20 s,0E0W)直接跑在提交文件的确切字节上。范围外观察(不在本 PR 动)
net_select.o、stream_buffer.o(非 LVGL)在 map 中同为 0 贡献,属 #46「继续观察」口径的后续候选。lv_circle_buf.c虽 0 产出但被静态引用锁死,普通手段不可排除(除非上游 LVGL 清理lv_iter的引用)。验证清单
lvgl.h)基线态 9.66 s vs 排除态 8.06 s.venv新克隆,ci_local.py):static 46/48 通过——含 ui-golden 像素回归(82 帧)、板端 UI 导航自检、生成器幂等、gitlint 10/10、coverage 等;size 门禁 rc=0mem-numbers/mem-budget为先于本 PR 的工作区衍生漂移:用未打补丁的 masterc487ce42干净全量构建 .map 复跑同样失败(本 PR 影像逐字节等价,ER_IROM1=0x45C14/RW_IRAM1=0x17220/RW_CCM 四基线+排除态全同);新克隆无 .map 时 mem-numbers 按其设计直接 FAIL(提示先跑 /keil-build);台账受管区刷新属另行维护动作(check_mem_numbers.py --write/ram_baseline.py --write),不入本 PRactions/checkout在所有近期 run(含 master 自身,见 run 119–123)失败(dial tcp …:443 connectex),系先于本 PR 的基础设施故障;网络恢复后重跑即可