no_std 向けクレートの選び方
なぜクレート選定が重要か
Section titled “なぜクレート選定が重要か”組み込み Rust では std が使えないため、普段の Rust 開発で何気なく使っているクレートがそのままでは動きません。std に依存するクレートをリンクすると、ビルドエラーまたは肥大化したバイナリになります。
選定チェックリスト
Section titled “選定チェックリスト”1. #![no_std] 対応の確認
Section titled “1. #![no_std] 対応の確認”クレートが no_std で動作するか確認します。
Cargo.tomlにno_std系の feature やカテゴリがあるかlib.rsに#![no_std]が宣言されているか- crates.io のページで
no-stdバッジがあるか
2. 依存関係の確認
Section titled “2. 依存関係の確認”# 依存ツリーを表示して std 依存がないか確認cargo tree --target thumbv7em-none-eabihfターゲットを指定することで、そのターゲットで実際にリンクされる依存だけを確認できます。
3. alloc 必要/不要の判断
Section titled “3. alloc 必要/不要の判断”| 状況 | 対応 |
|---|---|
| alloc 不要 | ヒープなしで動作。最も安全 |
| alloc 必要 | alloc クレート + ヒープアロケータ(linked_list_allocator 等)が必要 |
| std 必要 | 組み込みでは使用不可。代替を探す |
4. コードサイズへの影響
Section titled “4. コードサイズへの影響”- バイナリサイズがターゲットのフラッシュ容量を超えないか
cargo bloatで各関数のサイズを確認
cargo bloat --release --target thumbv7em-none-eabihfカテゴリ別の定番クレート
Section titled “カテゴリ別の定番クレート”非同期ランタイム
Section titled “非同期ランタイム”| クレート | 特徴 | alloc |
|---|---|---|
embassy-executor | async/await ベース、軽量 | 不要 |
rtic | 割り込み駆動、Cortex-M 専用 | 不要 |
通信(HAL)
Section titled “通信(HAL)”| クレート | 特徴 |
|---|---|
embedded-hal | 共通トレイト定義(SPI, I2C, UART 等) |
embedded-io | Read/Write トレイトの no_std 版 |
| クレート | 特徴 | alloc |
|---|---|---|
heapless | 固定容量の Vec, String, Map 等 | 不要 |
postcard | no_std 向けシリアライズ(serde 互換) | 不要 |
ログ・デバッグ
Section titled “ログ・デバッグ”| クレート | 特徴 |
|---|---|
defmt | 高効率ログフォーマット |
panic-probe | panic 時のデバッグ情報出力 |
シリアライズ
Section titled “シリアライズ”| クレート | 特徴 | alloc |
|---|---|---|
postcard | serde ベース、コンパクト | 不要 |
serde-json-core | 最小限の JSON(no_std) | 不要 |
よくある落とし穴
Section titled “よくある落とし穴”serde の std feature
Section titled “serde の std feature”serde はデフォルトで std feature が有効です。Cargo.toml で明示的に無効化します。
[dependencies]serde = { version = "1", default-features = false, features = ["derive"] }間接的な std 依存
Section titled “間接的な std 依存”一見 no_std 対応に見えても、依存関係のどこかで std を使っている場合があります。cargo tree --target <target> で必ず確認してください。
動的ディスパッチの回避
Section titled “動的ディスパッチの回避”no_std 環境では dyn Trait が使えない(alloc なしでは)ため、ジェネリクスで解決する設計が推奨されます。
クレートを探す
Section titled “クレートを探す”- crates.io で
no_stdやembeddedで検索 - Awesome Embedded Rust の一覧
- 本サイトの Crates 一覧 でカテゴリ別に検索
次のステップ
Section titled “次のステップ”- 組み込み Rust 入門 で開発環境を構築する
- defmt + RTT デバッグ でログ出力を試す