mcpField
R
resource-optimization-lowend

resource-optimization-lowend

github.com/mohitmishra786開発269296 回インストール18 週間前に更新
リポジトリ

resource-optimization-lowend について

resource-optimization-lowend は、制約のあるデバイスで Flash と RAM を節約する方法をエージェント向けに案内します。ベアメタルや小規模 RTOS のファームウェアを対象に、サイズ分析、リンカーマップ、スタック測定、サイズと速度の調整を扱います。

主な機能

  1. 01ELF とリンカーマップの分析
  2. 02サイズの大きいシンボルの特定
  3. 03コンパイラとリンカーのサイズ設定
  4. 04静的・実行時スタック使用量の測定
  5. 05コードサイズと実行速度の調整

活用シーン

  1. 01Flash 予算超過のファームウェア調査
  2. 02予期しない .rodata や .bss の増加特定
  3. 03本番環境でのスタックオーバーフロー調査
  4. 04MCU での -Os と -O2 の選択

インストール

コマンドをコピーしてターミナルで実行します。

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

インストール後、Claude Code で/resource-optimization-lowendを入力して読み込まれたか確認します。

詳細

リソース最適化(低性能システム)

目的

制約のあるデバイスで、フラッシュと RAM を最適化するための手順をエージェントに案内します。コンパイラーのサイズ最適化フラグ、リンカーマップの分析、スタック使用量の測定、デッドコードの削除、サイズと速度のトレードオフを扱います。ベアメタルおよび小規模な RTOS イメージが対象です。

使用する場面

  • ファームウェアがフラッシュの予算を超える場合
  • 本番環境でのみスタックオーバーフローが発生する場合
  • 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翻訳単位をまたいでデッドコードを削除
-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定数をフラッシュに移す(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. エージェントでの使用
/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 のネストHW スタックを測定し、_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 のサイズ最適化パターン

コメント