关于 resource-optimization-lowend
resource-optimization-lowend 指导 Agent 优化受限设备上的 Flash 与 RAM 使用,面向裸机和小型 RTOS 固件。内容包括映像尺寸分析、链接器映射检查、栈测量及体积与速度取舍。
主要功能
- 01分析 ELF 与链接映射文件
- 02定位占用较大的符号
- 03使用编译与链接尺寸选项
- 04测量静态及运行时栈用量
- 05权衡代码体积与执行速度
适用场景
- 01排查固件超出 Flash 预算
- 02定位意外的 .rodata 或 .bss 增长
- 03调查生产环境中的栈溢出
- 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