resource-optimization-lowend について
resource-optimization-lowend は、制約のあるデバイスで Flash と RAM を節約する方法をエージェント向けに案内します。ベアメタルや小規模 RTOS のファームウェアを対象に、サイズ分析、リンカーマップ、スタック測定、サイズと速度の調整を扱います。
主な機能
- 01ELF とリンカーマップの分析
- 02サイズの大きいシンボルの特定
- 03コンパイラとリンカーのサイズ設定
- 04静的・実行時スタック使用量の測定
- 05コードサイズと実行速度の調整
活用シーン
- 01Flash 予算超過のファームウェア調査
- 02予期しない .rodata や .bss の増加特定
- 03本番環境でのスタックオーバーフロー調査
- 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 のサイズ最適化パターン
コメント
Markdown 対応