コンテンツにスキップ

no_std 向けクレートの選び方

組み込み Rust では std が使えないため、普段の Rust 開発で何気なく使っているクレートがそのままでは動きません。std に依存するクレートをリンクすると、ビルドエラーまたは肥大化したバイナリになります。

クレートが no_std で動作するか確認します。

  • Cargo.tomlno_std 系の feature やカテゴリがあるか
  • lib.rs#![no_std] が宣言されているか
  • crates.io のページで no-std バッジがあるか
Terminal window
# 依存ツリーを表示して std 依存がないか確認
cargo tree --target thumbv7em-none-eabihf

ターゲットを指定することで、そのターゲットで実際にリンクされる依存だけを確認できます。

状況対応
alloc 不要ヒープなしで動作。最も安全
alloc 必要alloc クレート + ヒープアロケータ(linked_list_allocator 等)が必要
std 必要組み込みでは使用不可。代替を探す
  • バイナリサイズがターゲットのフラッシュ容量を超えないか
  • cargo bloat で各関数のサイズを確認
Terminal window
cargo bloat --release --target thumbv7em-none-eabihf
クレート特徴alloc
embassy-executorasync/await ベース、軽量不要
rtic割り込み駆動、Cortex-M 専用不要
クレート特徴
embedded-hal共通トレイト定義(SPI, I2C, UART 等)
embedded-ioRead/Write トレイトの no_std 版
クレート特徴alloc
heapless固定容量の Vec, String, Map 等不要
postcardno_std 向けシリアライズ(serde 互換)不要
クレート特徴
defmt高効率ログフォーマット
panic-probepanic 時のデバッグ情報出力
クレート特徴alloc
postcardserde ベース、コンパクト不要
serde-json-core最小限の JSON(no_std)不要

serde はデフォルトで std feature が有効です。Cargo.toml で明示的に無効化します。

[dependencies]
serde = { version = "1", default-features = false, features = ["derive"] }

一見 no_std 対応に見えても、依存関係のどこかで std を使っている場合があります。cargo tree --target <target> で必ず確認してください。

no_std 環境では dyn Trait が使えない(alloc なしでは)ため、ジェネリクスで解決する設計が推奨されます。