ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FastLED 二进制大小阈值冻结机制全解:check_*_size.yml 上限的历史、分类与修改流程

FastLED 二进制大小阈值冻结机制全解:check_*_size.yml 上限的历史、分类与修改流程 嵌入式物联网硬件开发驱动开发【免费下载链接】FastLEDThe FastLED library for colored LED animation on Arduino. Please direct questions/requests for help to the FastLED Reddit community: http://fastled.io/r Wed like to use github issues just for tracking library bugs / enhancements.项目地址https://gitcode.com/gh_mirrors/fa/FastLED点击查看免费下载导读本文围绕 FastLED 仓库中的docs/SIZE_THRESHOLD_HISTORY.md文档完整讲解其二进制大小阈值冻结size-threshold lockdown机制每一份.github/workflows/check_*_size.yml工作流中的max_sizeBlink 构建与max_size_apa102Apa102 构建上限为何被冻结在ci/lint/check_size_thresholds.py中、如何区分真实上限real ceiling与创可贴band-aid、历史上发生过哪些调整以及未来如何合法地修改这些阈值。读完本文你将掌握这套防改阈值代替修 bug的双重锁定机制bash lint CodeRabbit的完整原理与操作流程。背景为什么二进制大小阈值需要被冻结问题的起源FastLED 是一个面向 Arduino 等嵌入式平台的彩色 LED 动画库运行环境往往是 Flash 只有几十 KB 到几百 KB 的 MCU如 ATmega328P 的 32 KB、STM32F103C8 的 64 KB。因此库每次编译出的固件体积直接关系到能否在目标芯片上放下。仓库中每个板卡都对应一份.github/workflows/check_*_size.yml工作流编译 Blink 与 Apa102 两个示例并比对体积上限。然而在实践中出现了一个典型的反模式CI 变红后不修底层回归regression而是直接把max_size/max_size_apa102上限调大让 CI变绿。为此PR #3303 把这些数值冻结进了 ci/lint/check_size_thresholds.py使一个 Agent或疲惫的人类无法静默抬高阈值来糊弄 CI。文档的配套关系该机制由三部分协同构成本文档 docs/SIZE_THRESHOLD_HISTORY.md阈值历史审计记录与分类说明ci/lint/check_size_thresholds.py冻结阈值锁定 lint本仓库工作区内的镜像副本代码即单一事实来源.coderabbit.yaml针对check_*_size.yml的 CodeRabbit 评审规则。本文档回答的核心问题是这个数字是芯片 框架的物理极限还是一个已知的软目标——一旦被追踪的回归修复后就应立刻收紧分类体系real ceiling 与 band-aid文档将每个冻结值划分为两类真实上限real ceiling真正的架构性 / Flash 物理极限。例如 AVR ATmega328P 的 32 KB Flash、STM32F103C8 的 64 KB Flash。这类值通常无需后续动作也几乎从未被抬升过。创可贴band-aid为让 CI 通过而临时抬高、但底层回归尚未修复的值。每一个 band-aid 都必须有对应的追踪 issue一旦回归修复就应恢复到真实上限。当前冻结阈值全览下表完整继承自原文档列出各板卡当前冻结的max_size与max_size_apa102及其分类。其中-1是build_no_forced_inline作业的不检查哨兵值见 .github/workflows/check_uno_size.yml该作业以extra_args: --defines FASTLED_NO_FORCE_INLINE构建上限被显式置为 -1 表示跳过检查。BoardWorkflow fileFrozenmax_sizeFrozenmax_size_apa102StatusTracking issueNotesunocheck_uno_size.yml11000 / -19300 / -1real ceiling—AVR ATmega328P 有 32 KB Flash。第二个值-1是build_no_forced_inline作业的不检查哨兵。Apa102 曾在7edaf80f0中从 12050收紧到 9300真实优化不是抬高。bluepillcheck_bluepill_size.yml5500045000real ceiling—STM32F103C8 有 64 KB Flash。工作流在bf76a03192025-06-25以当前值创建从未被抬升。esp32devcheck_esp32_size.yml340000330000real ceilings#3870#3870 发现 402252 字节的 Blink 结果来自静默的 legacy 后端回退构建元数据把 fbuild 的 size 工具暴露为aliases.size而compiled_size只查找size_path。修正后 fbuild 实测为 337355 BArduino-ESP32 3.3.11因此 Blink 获得了一次收窄的 10 KB 框架基线重设。Apa102 在其模板化addLeds路径停止登记所有 ESP32 驱动后保持 330000实测 321275 B。teensy30check_teensy30_size.yml6000050000real ceiling—MK20DX128Teensy 3.0有 128 KB Flash。工作流在f4317e9542025-06-25以当前值创建从未被抬升。teensy31check_teensy31_size.yml8000065000real ceiling—MK20DX256Teensy 3.1有 256 KB Flash。工作流在f4317e9542025-06-25以当前值创建从未被抬升。teensy32check_teensy32_size.yml8000065000real ceiling—MK20DX256Teensy 3.2有 256 KB Flash。工作流以当前值创建从未被抬升。teensy35check_teensy35_size.yml10000085000real ceiling—MK64FX512Teensy 3.5有 512 KB Flash。工作流以当前值创建从未被抬升。teensy36check_teensy36_size.yml120000100000real ceiling—MK66FX1M0Teensy 3.6有 1 MB Flash。工作流以当前值创建从未被抬升。teensy41check_teensy41_size.yml120000165000 (BAND-AID)apa102 是 band-aid#2802Blinkmax_size: 120000是真实上限。Apa102165000是 band-aid在 PR #2804关闭 #2802中从 88000 抬升用于在库合法变大后解封 CIaudio API、fl::stl新增、channel manager、fl::AsyncLog*、fl::ifstream链接。一旦 #2802 中fl::ifstream/fl::posix_filebuf/fl::strerror/fl::AsyncLog*被过度链接进 Apa102 链接的问题被修复真实上限是 88000。当前实际体积 ≈148476 B。teensylccheck_teensylc_size.yml3500030000real ceiling—MKL26Z64Teensy LC有 64 KB Flash。工作流在f4317e9542025-06-25以当前值创建从未被抬升。冻结机制源码级解析单一事实来源FROZEN_THRESHOLDSci/lint/check_size_thresholds.py 中的FROZEN_THRESHOLDS是全部冻结值的唯一权威single source of truth每个值以frozenset[int]形式存在——之所以是集合是因为同一目标可能在不同配置下合法地运行如check_uno_size.yml中build作业做硬检查、build_no_forced_inline作业用 -1 哨兵跳过。每个条目的注释同时标注了分类real ceiling或band-aid (#NNNN)与 docs/SIZE_THRESHOLD_HISTORY.md 的审计表一一对应。从源码结构可以概括出该 lint 的检查维度未知文件unknown_file新增了一个check_*_size.yml工作流却没有在FROZEN_THRESHOLDS中登记直接报错——堵住偷偷加新工作流绕过冻结的路径缺失文件missing_fileFROZEN_THRESHOLDS中有条目但对应 YAML 被删除未知键unknown_keyYAML 中出现FROZEN_THRESHOLDS未登记的上限键错误值wrong_valuemax_size: N与冻结集合不匹配例如试图把 esp32 从 330000 静默抬到 700000缺失键missing_key工作流中删除了max_size:行。解析时使用正则^\s*(max_size|max_size_apa102)\s*:\s*(-?\d)\s*$逐行扫描且跳过以#开头的注释行避免锁定横幅注释本身触发误报。ERROR 模式没有仅告警的退路该 lint 默认即 ERROR 模式不存在 warn-only 的逃逸通道。从 ci/lint.py 的注册代码可以看到它作为名为size_thresholds_locked显示名 SIZE-CHECK YML THRESHOLDS LOCKED的 LintStage 接入bash lint流程并直接复用ci.lint.check_size_thresholds.run。整个设计意图就是阈值数值不允许静默漂移。当工作流目录不存在时 lint 直接返回通过用于解耦仓库外的运行环境。CodeRabbit 评审规则人机双重把关在 .coderabbit.yaml 中针对路径.github/workflows/check_*_size.yml的规则将任何抬高上限标记为HIGH severity 违规同时明确给出正确的处理顺序回滚导致回归的改动修复构建标志 / 链接器 / 过度链接 / 符号泄漏仅当 1、2 被证明不可能时才可抬高上限——且必须在同一个 PR 中同步更新FROZEN_THRESHOLDS、链接说明新上限合理性的公开 issue并获得维护者显式签署。规则还会标记这类高风险 PR只抬 YAML 不动 lint 脚本、添加临时抬高 / 待跟进 issue类注释却无已合并的 issue、删除 FROZEN SIZE THRESHOLD 横幅、新增工作流但未登记阈值。配套规则同样覆盖 ci/lint/check_size_thresholds.py 本身形成两处文件摩擦Agent 想静默改 YAML就会先撞上bash lint的失败。历史调整目录每一次抬升都有据可查以下审计事件来自git log --all --follow --patch -- .github/workflows/check_*_size.yml其中对仍是当前冻结值的抬升做了特别标注。esp32devcheck_esp32_size.ymlDateCommitChangeRationaleClassification2024-09-03a0489cd39以 300000 / 300000 创建初始工作流n/a2024-12-1712f4e27bb300000 → 320000外部代码更新后这个二进制变大了 —— arduino-esp32 框架增长soft外部框架增长2025-08-158ed2ea80fPR #2056320000 → 330000arduino-esp32 框架略微增长soft外部框架增长2026-06-05f00e8cf1dPR #2790关闭 #2608330000 → 700000band-aidChannel API 后实际 ≈635 KB且 legacy 后端钉死后缺--gc-sectionsband-aid已回滚2026-06-05e646657d0700000 → 330000fbuild 恢复--gc-sections后恢复规范上限恢复2026-06-19876409988PR #3295330000 → 700000band-aidmaster 上 CI 变红因为[env:esp32dev]的 size-strip 标志没有传到 fbuild#3298band-aid已回滚2026-06-195dd070abcPR #3268、30ee2eba2PR #3295 后续中间工作把 size-strip 标志移植进ci/boards.py::ESP32DEV.build_flags推进 #32982026-06-19ee842e51dPR #3303700000 → 330000锁定 回滚330000 才是真实上限在 #3298 修复前 CI 保持红色被 #3870 取代2026-08-18#3870Blink330000 → 340000Apa102 不变修正 fbuild size 工具查找402252 B legacy 回退 → 337355 B fbuild ELF为 Arduino-ESP32 3.3.11 留出 2645 B 余量。移除 Apa102 的全驱动过度链接391463 B → 321275 B。当前冻结值teensy41check_teensy41_size.ymlDateCommitChangeRationaleClassification2024-09-0344590c36d以 80000 / 80000 创建初始工作流n/a2024-09-033ccbb85aemax_size: 80000 → ?无正文minor2024-12-239c5eeeed3max_size_apa102: 80000 → 84000为 teensy41 板卡更新 max_size_apa102soft2025-01-21ab92dc115max_size: 80000 → 104000build: 提高 teensy41 的大小上限soft2025-04-25e31a807ecmax_size: 104000 → 107000将 Teensy 4.1 的 max_size 提高到 107000soft2025-05-19dc25e80e0max_size_apa102: 84000 → 88000将 Teensy41 大小检查中的 max_size_apa102 更新为 88000soft2025-08-093e99118d3max_size: 107000 → 120000修复 teensy41 大小检查 —— 容纳真实增长当前max_size真实上限2026-06-05ab67e3f1fPR #2804关闭 #2802max_size_apa102: 88000 → 165000为fl::ifstream/fl::AsyncLog*过度链接进 Apa102 的 band-aid当前实际 ≈148476 Bband-aid现行—— 修复 #2802 后应恢复到 88000其他板卡check_uno_size.yml、check_bluepill_size.yml、check_teensy30/31/32/35/36/lc_size.yml除 uno 的 apa102 在7edaf80f0中从 12050收紧到 9300 外全部以当前值创建、创建后从未被抬升统一标注为real ceiling。真实上限经受考验的现场案例值得单独说明的是 .github/workflows/check_esp32_size.yml 顶部的一段运行记录2026-09-12 该门禁在 master 上以 340235 B超 235 B变红并持续保持红色。起因是 #4368 与 #438716 位编码器与 HD108 消耗了已解决的 device drive抬高了 esp32s3 bloat 基线且没有任何提交把这一变化关联到本上限。按冻结规则数值故意未被抬升——字节最终在代码里找回来HD108 编码器每 LED 的亮度处理本会计算一个常量头部被优化移除。这一记录证明该上限经受过真实回归的考验并被守住后续跟进包括 #4403-52 B、#4404诊断、#4407单循环 HD108 编码器以及每通道一个 PixelController 的 #4402 后续工作。这个案例也印证了本文档的核心原则门禁变红应被视为真实回归的信号而非把数字调大的许可证。Band-aid 跟进如何恢复真实上限#2802 —— teensy41 Apa102 过度链接band-aid: 165000real: 88000teensy41 的 Apa102 链接目前拉入了fl::ifstream、fl::posix_filebuf、fl::strerror和fl::AsyncLog*尽管 Apa102 本身并不需要文件系统 I/O 或异步日志。修复路径是从 Apa102 驱动到这些符号的调用链入手然后二选一把多余的拉取放在 Apa102 不启用的特性标志feature flag后面或重构链接结构使这些符号只在用户显式选用时被链接例如--gc-sections链接器树摇 API-only 可选——仓库的 MEMORY 笔记明确更偏好链接器树摇而非编译门控。一旦 Apa102 本地实测 ≤ 88000 B锁定 lint 就允许把 YAML 与FROZEN_THRESHOLDS同时收紧回 88000并在 PR 正文中引用 #2802。#3870 —— ESP32 尺寸测量与驱动过度链接这里的根因位于 ci/compiled_size.py 的_find_size_toolfbuild 的 build_info 把工具路径暴露在aliases块下值可为null而旧式元数据生产者输出的是顶层size_path键因此实现保留了两条兼容路径——先查顶层size_path再回退到aliases.size。此前compiled_size只查找size_path导致 legacy 后端元数据下静默运行旧式 size 工具报告的其实是仅供对比的legacy ELF402252 B。直接读取真实 fbuild ELF 后Blink 为 337355 B于是 340000 成为对当前 Arduino-ESP32 3.3.11 框架的一次收窄重基线而非回到历史 700 KB band-aid。Apa102 则是另一类问题其编译期addLeds模板此前经由运行时FastLED.add(config)重载路由而后者会调用enableAllDrivers()。改为只登记解析出的 SPI 总线后无关的 RMT 等驱动不再被注册Apa102 从 391463 B 降到 321275 B330000 上限得以保留。这同时展示了过度链接over-link这一库层面回归的典型形态模板实例化路径决定最终链接进固件的符号集合。如何合法地修改一个冻结值按 docs/SIZE_THRESHOLD_HISTORY.md 的规定修改流程为打开 / 关联一个追踪 issue说明修改的正当理由必须是真实的架构变化而不是CI 红了我想让它绿编辑对应的.github/workflows/check_board_size.yml编辑 ci/lint/check_size_thresholds.py 中FROZEN_THRESHOLDS的对应条目两个文件必须在同一 PR 内同步修改否则bash lint直接失败更新本文档的分类表——修改 Status、在 Notes 中添加 issue 链接、把历史抬升移入对应板卡的专门小节在 PR 正文中引用 issue 编号。CodeRabbit 在 .coderabbit.yaml 中对check_*_size.yml的规则会把该 diff 标记为 HIGH severity并要求维护者显式签署。这套两处文件摩擦设计是刻意的让任何一次抬升都强制经过 issue 论证与人工签署从而保证数字只会因真实原因而改变。Refs相关 Issue / PR 索引PR #3303—— 防御性锁定lint CodeRabbit 规则 本文档前身注释。PR #3305—— 本次审计 / 文档。Issue #2802—— teensy41 Apa102 过度链接。Issue #2608—— esp32dev 330 KB 上限与 635 KB 现实脱节在 #3303 回滚到 330 KB 后关闭底层标志移植工作移交 #3298。Issue #3298—— fbuild 未传播 ESP32 板级build_flags/build_unflags。Issue #3870—— ESP32 Blink 测量回归与有意的 340 KB 重基线。PR #2790、PR #3295—— 历史 700 KB band-aid均已回滚。PR #2804—— teensy41 Apa102 band-aid仍在生效由 #2802 追踪。延伸阅读冻结阈值的权威实现ci/lint/check_size_thresholds.pylint 接入点ci/lint.pysize_thresholds_locked阶段CodeRabbit 评审规则.coderabbit.yaml尺寸测量工具链解析ci/compiled_size.py实际工作流示例.github/workflows/check_esp32_size.yml、.github/workflows/check_teensy41_size.yml、.github/workflows/check_uno_size.yml本主题配套文档docs/SIZE_THRESHOLD_HISTORY.md赞分享嵌入式物联网硬件开发驱动开发【免费下载链接】FastLEDThe FastLED library for colored LED animation on Arduino. Please direct questions/requests for help to the FastLED Reddit community: http://fastled.io/r Wed like to use github issues just for tracking library bugs / enhancements.项目地址https://gitcode.com/gh_mirrors/fa/FastLED点击查看免费下载相关推荐restic版本发布流程从代码冻结到二进制分发restic版本发布流程从代码冻结到二进制分发 概述 restic作为一款Fast, secure, efficient backup program快速、存储CLIgh-ost 限流Throttling机制全解析复制延迟、负载阈值与动态控制实战gh ost 限流Throttling机制全解析复制延迟、负载阈值与动态控制实战 导读 gh ost 是 GitHub 出品的无触发器triggerle数据库运维FlowType.JS阈值设置完全指南最小最大宽度与字体限制FlowType.JS阈值设置完全指南最小最大宽度与字体限制 想要实现完美的网页响应式排版FlowType.JS是你的终极解决方案这个强大的JavaScr前端上一篇Data Structures and Algorithms 项目教程下一篇Bandcamp Downloader: 技术解析与实用指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表