mcpField
R
resource-optimization-lowend

resource-optimization-lowend

github.com/mohitmishra786开发269296 次安装18 周前更新
代码仓库

关于 resource-optimization-lowend

resource-optimization-lowend 指导 Agent 优化受限设备上的 Flash 与 RAM 使用,面向裸机和小型 RTOS 固件。内容包括映像尺寸分析、链接器映射检查、栈测量及体积与速度取舍。

主要功能

  1. 01分析 ELF 与链接映射文件
  2. 02定位占用较大的符号
  3. 03使用编译与链接尺寸选项
  4. 04测量静态及运行时栈用量
  5. 05权衡代码体积与执行速度

适用场景

  1. 01排查固件超出 Flash 预算
  2. 02定位意外的 .rodata 或 .bss 增长
  3. 03调查生产环境中的栈溢出
  4. 04为 MCU 选择 -Os 或 -O2

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/mohitmishra786/low-level-dev-skills --skill resource-optimization-lowend

安装后在 Claude Code 中输入/resource-optimization-lowend确认已加载。

详细介绍

资源优化(低端系统)

用途

指导 Agent 在资源受限设备上优化 Flash 和 RAM:编译器体积标志、链接器映射分析、栈使用量测量、死代码消除,以及体积与速度之间的权衡,适用于裸机和小型 RTOS 映像。

适用场景

  • 固件超出 Flash 预算
  • 仅在生产环境中发生栈溢出
  • 在 MCU 上选择 -Os 还是 -O2
  • 查找意外增长的 .rodata 或 .bss

工作流

1. 体积测量工具链
arm-none-eabi-size -A firmware.elf
arm-none-eabi-objdump -h firmware.elf
nm --size-sort -S firmware.elf | tail -20
2. 链接器映射文件
/* linker.ld */
OUTPUT_FORMAT("elf32-littlearm")
ENTRY(Reset_Handler)

SECTIONS
{
  /* ... */
}

/* Generate map */
/* gcc ... -Wl,-Map=firmware.map */
grep -E '\.text|\.rodata|\.data|\.bss' firmware.map | head

找出体积最大的符号和意外引入的库。

3. 编译器标志
标志效果
-Os优先优化体积
-ffunction-sections -fdata-sections按符号划分段
-Wl,--gc-sections移除未使用的段
-flto跨 TU 消除死代码
-specs=nano.specs更小的 newlib(GCC ARM)
CFLAGS += -Os -ffunction-sections -fdata-sections
LDFLAGS += -Wl,--gc-sections -Wl,--print-memory-usage
4. 栈分析
# Static (if built with -fstack-usage)
find . -name '*.su' -exec cat {} \;

# Linker stack symbol
grep _estack firmware.map

运行时:用模式(0xDEADBEEF)填充栈,运行测试,然后扫描栈使用高水位。FreeRTOS:uxTaskGetStackHighWaterMark。

5. RAM 类别
段策略
.bss缩小缓冲区;使用池分配器
.data将常量移至 Flash(const → .rodata)
堆避免使用 malloc;使用固定大小的池
栈减少嵌套;缩小 ISR 栈
6. 体积与速度的取舍
Hot path in ISR or 1 kHz loop?
├── Yes → -O2 for that file (#pragma GCC optimize)
└── No  → -Os globally
7. Agent 用法
/resource-optimization-lowend Find top 10 flash consumers in firmware.map and suggest -gc-sections fixes

常见问题

现象原因修复方法
printf 引入 20+ KB使用完整的 newlib printf重定向 _write;使用精简版 printf
--gc-sections 导致 IRQ 出错段被回收在链接器脚本中使用 KEEP()
栈在运行较长时间后溢出调用层级深且 IRQ 嵌套测量硬件栈;增大 _estack
RAM 占用为零但 ELF 很大.data 未加载检查 VMA/LMA
LTO 链接失败混用了不同编译器版本所有对象都使用相同的 GCC

相关技能

  • skills/embedded/linker-scripts — MEMORY/段布局
  • skills/baremetal/baremetal-startup — 栈符号
  • skills/baremetal/low-power-embedded — RAM 保留
  • skills/compilers/gcc — 优化标志
  • skills/rust/rust-no-std — 嵌入式 Rust 体积模式

评论

支持 Markdown