关于 memory-budgeting
memory-budgeting 是面向嵌入式 C/C++ 项目的技能,将内存视为需测量的预算,而非开发板规格上的名义容量。它指导开发者分类核算、检查构建体积、测量运行时内存并进行压力测试。
主要功能
- 01分类核算各类内存占用
- 02设定预算与安全余量
- 03检查编译器体积输出
- 04测量运行时堆与栈
- 05在代表性负载下检查内存
适用场景
- 01添加功能前估算内存需求
- 02排查构建体积变化
- 03检查运行时堆与栈用量
- 04验证峰值负载下的内存占用
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ wedsamuel1230/ embedded-engineering-skills --skill memory-budgeting安装后在 Claude Code 中输入/memory-budgeting确认已加载。
详细介绍
内存预算
将内存视为经过测量的预算,而不是板卡上标注的名义值。实现使用嵌入式 C/C++;如果解析构建或运行时日志是有用且确定的工具,也可以使用脚本。
信息收集
记录具体的板卡/模块、闪存/RAM/EEPROM/PSRAM、引导加载程序和分区布局、框架、编译器标志、库、静态缓冲区、任务栈、文件系统/OTA 需求、协议峰值大小,以及可用的测量输出。
流程
- 区分静态数据、代码/闪存、堆、任务栈、中断状态、文件系统、引导加载程序和 OTA/更新槽。
- 为每个类别设定数值预算和最低余量。使用具体板卡的参考数据,而不是将整个系列的数值直接当作项目结论。
- 保存编译器大小输出,并将变化对应到某项功能或依赖项。
- 在框架支持的情况下,在代表性负载下测量运行时可用堆内存、最大连续块、栈高水位标记,以及重置/分配失败情况。
- 在 AVR 上,适当使用
F()将字面量保存在闪存中,优先采用有界缓冲区和固定大小存储,并避免无界地使用动态String。在 ESP32/RP2040 上,同样要限制缓冲区大小,并区分堆、栈、闪存和文件系统。 - 每次更改内存相关内容后,重新运行压力测试并记录权衡。
避免自我安慰
| 捷径 | 应对方式 |
|---|---|
| “数据手册说有 520 KB,所以内存没问题。” | 区分可用堆、栈、保留区域,以及无线电/RTOS 的占用。 |
| “编译通过了。” | 检查大小输出,并测试运行时分配路径。 |
| “把缓冲区加大。” | 限定协议范围,并证明所需的最大值。 |
| “到处都用 String。” | 检查内存碎片和生命周期;必要时使用有界替代方案。 |
| “OTA 只需要应用映像。” | 将两个更新槽、引导加载程序、元数据和回滚映像都纳入预算。 |
验证
- 构建大小输出和运行时内存证据应标明具体目标/版本。
- 每项预算都有余量和故障应对方案。
- 压力测试应在适用情况下覆盖消息、传感器、日志、无线电和任务负载峰值。
- 优化不得移除边界、安全检查或恢复行为。
共享输出约定
使用共享的 Arduino 技能约定:说明假设、所需工具和版本、实现步骤、各验证阶段的测试/证据、已知限制,以及恢复/安全说明。
评论
支持 Markdown