360 Secure SkillHub
360 安全技能中心

resource-optimization-lowend

面向资源受限的裸机和小型 RTOS,说明如何用 size、objdump、nm 与链接 map 分析 Flash/RAM 占用,检查栈高水位,调整 -Os、段回收和 LTO 等选项,并列出常见问题与修复方向。

mohitmishra786
热度 0.00
最近更新 2026-10-19 04:15:39
分类:开发依赖:代码执行 / 读写文件应用场景:调试排错 / 代码审查

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add mohitmishra786/low-level-dev-skills/resource-optimization-lowend
Metadata
name
resource-optimization-lowend
description
Resource optimization skill for constrained embedded targets. Use when reducing flash/RAM usage, analyzing stack depth, reading linker map files, or tuning size vs speed on MCUs. Activates on queries about firmware size optimization, linker map, stack usage, -Os, flash RAM budget, or bloat analysis.

Resource Optimization (Low-End Systems)

Purpose

Guide agents through flash and RAM optimization on constrained devices: compiler size flags, linker map analysis, stack usage measurement, dead code elimination, and size-vs-speed tradeoffs — for bare-metal and small RTOS images.

When to Use

  • Firmware exceeds flash budget
  • Stack overflow in production only
  • Choosing -Os vs -O2 on MCU
  • Finding unexpected .rodata or .bss growth

Workflow

1. Size measurement toolchain

arm-none-eabi-size -A firmware.elf
arm-none-eabi-objdump -h firmware.elf
nm --size-sort -S firmware.elf | tail -20

2. Linker map file

/* 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

Identify largest symbols and unexpected library pull-in.

3. Compiler flags

Flag Effect
-Os Size-first optimization
-ffunction-sections -fdata-sections Per-symbol sections
-Wl,--gc-sections Drop unused sections
-flto Cross-TU dead code elimination
-specs=nano.specs Smaller newlib (GCC ARM)
CFLAGS += -Os -ffunction-sections -fdata-sections
LDFLAGS += -Wl,--gc-sections -Wl,--print-memory-usage

4. Stack analysis

# Static (if built with -fstack-usage)
find . -name '*.su' -exec cat {} \;

# Linker stack symbol
grep _estack firmware.map

Runtime: fill stack with pattern (0xDEADBEEF), run tests, scan high-water mark. FreeRTOS: uxTaskGetStackHighWaterMark.

5. RAM categories

Section Tactic
.bss Shrink buffers; pool allocators
.data Move const to flash (const → .rodata)
Heap Avoid malloc; fixed pools
Stack Reduce nesting; smaller ISR stacks

6. Size vs speed decision

Hot path in ISR or 1 kHz loop?
├── Yes → -O2 for that file (#pragma GCC optimize)
└── No  → -Os globally

7. Agent usage

/resource-optimization-lowend Find top 10 flash consumers in firmware.map and suggest -gc-sections fixes

Common Problems

Symptom Cause Fix
printf pulls 20+ KB Full newlib printf _write retarget; tiny printf
--gc-sections broke IRQ Section collected KEEP() in linker script
Stack overflow late Deep call + IRQ nest Measure HW stack; increase _estack
RAM zero but big ELF .data not loaded Check VMA/LMA
LTO link fail Mixed compiler versions Same GCC for all objects

Related Skills

  • skills/embedded/linker-scripts — MEMORY/Sections layout
  • skills/baremetal/baremetal-startup — stack symbol
  • skills/baremetal/low-power-embedded — RAM retention
  • skills/compilers/gcc — optimization flags
  • skills/rust/rust-no-std — embedded Rust size patterns