世界を動かす技術を、日本語で。

エンバシー:Rustとasyncを使用した現代の組み込みフレームワーク

2026年1月9日原文(github.com)

概要

Embassy はRustベースの次世代組込みアプリケーションフレームワーク。 安全性正確性省電力性 を兼ね備えたコードを高速開発可能。 async/await による効率的なマルチタスク制御を実現。 幅広い マイコン通信規格 に対応したライブラリ群を提供。 ドキュメントサンプル開発サポート も充実。

Embassyの特徴と概要

  • Rust言語 による高速・省メモリ・安全な組込み開発基盤
  • async/await を活用した協調型マルチタスク実現
  • RTOS不要、カーネルコンテキストスイッチなしで高速・小規模実装
  • 動的メモリ割当不要、単一スタック上で複数タスク動作
  • 型安全性スレッド安全性 によるコンパイル時バグ検出

標準搭載ライブラリ・機能

  • Hardware Abstraction Layer (HAL) によるハードウェア抽象化
    • embassy-stm32 (STM32シリーズ全般)
    • embassy-nrf (Nordic nRF52/53/54/91シリーズ)
    • embassy-rp (Raspberry Pi RP2040, RP23xx)
    • embassy-mspm0 (TI MSPM0シリーズ)
    • esp-rs (ESP32シリーズ、Wi-Fi/Bluetooth/ESP-NOW対応開発中)
    • ch32-hal (WCH CH32V RISC-Vシリーズ)
    • mpfs-hal (Microchip PolarFire SoC)
    • py32-hal (Puya Semiconductor PY32シリーズ)
  • embassy_time によるグローバルな時間管理(Instant, Duration, Timer)
  • 複数優先度Executor によるリアルタイム制御
  • 省電力設計 (アイドル時自動スリープ、割込みでタスク復帰)
  • embassy-net でEthernet/IP/TCP/UDP/ICMP/DHCP対応ネットワーク機能
  • Bluetooth (trouble/nrf-softdevice/embassy-stm32-wpan等で各種MCUサポート)
  • LoRaWAN (lora-rsで非同期LoRa/LoRaWAN通信)
  • embassy-usb によるUSBデバイススタック(CDC ACM, HID対応、拡張API)
  • embassy-boot による安全なブートローダ・DFU(試行起動・ロールバック対応)

サンプルコード例(抜粋)

  • 非同期タスク(async fn)によるLED点滅・ボタン入力監視
    • Timer でハードウェアタイマ不要の時間管理
    • Input/Output でGPIO制御
    • Spawner でバックグラウンド並列処理
    • info! でログ出力

サンプル実行手順

  • probe-rs インストール(https://probe.rs参照)
  • 対象チップ用サンプルディレクトリへ移動(例:cd examples/nrf52840)
  • Cargo.toml でチップ名feature指定、 .cargo/config.toml でチップ名指定
  • 実行例:cargo run --release --bin blinky
  • 詳細はGetting StartedやRunning the Examples参照

開発環境サポート

  • Rust Analyzer (Visual Studio Code等)対応
    • .vscode/settings.jsonの rust-analyzer.linkedProjects 設定参照
    • 複数ターゲット対応のためCargo workspaceは未提供

ライセンス・コントリビューション

  • Apache License 2.0 または MIT License のデュアルライセンス
  • コントリビューションは明示ない限り上記ライセンスで受領

由来

  • 名前の由来:「 EMB edded ASY nc」から命名

Embassyの利点まとめ

  • 安全性 :型・スレッド安全なRustでバグを未然防止
  • 効率性 :async/awaitでRTOS不要の高速・省メモリマルチタスク
  • 拡張性 :多様なマイコン・通信規格に対応したHAL・ライブラリ
  • 開発支援 :豊富なドキュメント・サンプル・ツール連携
  • 省電力 :自動スリープ・割込み駆動で長寿命デバイス設計

Hackerたちの意見

これを使って、nrf52で動くBitchatアプリのLoRaリレーを作ってるんだけど、ほとんどスムーズに動いてるよ。唯一のパニックはNordicのSoftDeviceから来てるみたいで、ebasssy-rustのコード自体ではないんだ。

BitchatはBLEだよね?カスタムLoRaプロトコルを使ってるの?それともMeshtasticにブリッジしてるのかな?

これは埋め込みRustの摩擦ポイントの中心にあるね。ほとんどのOSSエコシステムがこのフレームワークに移行してるから、ファームウェアや制御フローを非同期にしたくない場合は互換性がなかったり、すごく手間がかかるんだ。Rustの埋め込みはまだ新しくて小さいから、エコシステムを非同期で分けるのは理想的じゃないと思う。新しく埋め込みに入った人たちが混乱してるのもわかるよ。「非同期 vs ブロッキング」みたいな二項対立をよく聞くし、Embassyを使ってないとI/Oを待ってるときにCPUがブロックされるって思われがちなんだよね。もし非同期のPC Rustプログラミングが好きなら、これはいいスタート地点になると思うよ。異なるMCUへのハードウェアアクセスが統一されてるのもいいし、STM32へのハードウェアサポートは、初期のTraitベースのHALから一歩進んでると思う。個人的にもプロとしても、非同期があまり得意じゃない埋め込みRustプログラマーとしては、ちょっと異端かもしれないね。

もしかしたら去年はすごく変わったかもしれないけど、今のところその問題には遭遇してないよ。私の場合は逆のことが多かったんだけど、どこでその問題に遭ったの?

彼らが結構良さげなインターフェースやドライバーを作ったみたいで面白いと思う。以前はRustの埋め込みHALを作ろうとした試みもあったけど、ちょっと基本的すぎてあまり広がらなかったと思う。非同期インターフェースは多分一番汎用的で、スーパーループやシングルスレッドアプリケーション、スレッドコードに比較的簡単に接続できる(少なくとも、逆よりは簡単に)し、個人的にはArduinoがホビーレベルに留まっている大きな理由の一つは、ほぼ完全にシングルスレッドのブロッキング思考に縛られていて、二つのことを同時にやる必要が出た瞬間に全てが崩れたからだと思う。

私の経験では、ほとんどのEmbassyのHALはブロッキングバリアントもサポートしてるよ。だけど、この文脈でのasyncに対する反対意見はちょっと理解できないな。Embassyのエグゼキュータはかなり良い感じ。もっとシンプルで直線的なコードが書けるし、awaitポイントでCPUコアがスリープするからバッテリー効率も良いんだ。いろんなハードウェアの割り込みがコアを起こして、エグゼキュータに進めるように通知するんだよ。async/awaitからステートマシンへのコンパイラ変換は本当にありがたい。手動で同じことをやるのは、同じ電力効率とコードの使いやすさを得るのが大変だからね。

Embassyでのasyncの動き方も面白いよ。実際には作業キューのように機能していて、何かがウェイカー(割り込み)を待っていて起こされると、Future(タスク)がエグゼキュータによってポーリング(実行)されるためにキューに入れられるんだ。これには良い点と悪い点がある。確かに賢いけど、ハードウェアイベントが発生してからタスクの次のステップが始まるまでの遅延が変動することがある。これはZephyr/Linuxの作業キューに似てるけど、async/awaitが散りばめられた直線的な読み取りコードがある感じ。

逆に、CubeIDEからのSTM32ファームウェアのHello Worldは、スピンして温度スパイクを引き起こしたんだ。Embassyは何もスケジュールされていないときに電力消費と温度を抑えるためにパワーステートを効率的に使ってる。ファームウェアにasyncエグゼキュータを使うのは大きな具体的な利点で、一般的なuCファームウェアの標準になるべきだと強く思ってる。

俺は、embassyが本格的に「存在する」前に、stm32のためのembedded Halクレートの上でasync rustを書いてたんだ。多分、まだ存在する前だったと思う。async/awaitが言語の一部になる前の話ね。embassy専用ってわけじゃないけど、そのAPIはそれを取り入れてるよね。(俺が書いたラジオライブラリをテストしたくて、1つのMCUに2つのモジュールを接続して、1つは送信、もう1つは受信する形にしたんだ。通常のブロッキングAPIだと2台必要になるから、asyncにすることにした。)

これを使って、BLEでアンプを制御するSparkモデリングのギターアンプペダルコントローラーを作ろうとしてたんだけど、結構期待できそうだったよ。彼らは完全にOSSのRust BLEスタックを持ってるし。ただ、ちょっと早い段階のようで、APIが結構変わってるみたいで、Cargoでgitのリビジョンを固定する必要があったんだ。プロジェクトがどこに行くのか楽しみだね!

私はEmbassyプロジェクトの大ファンで、非同期Rustが素晴らしい理由の一つだと思う。これが可能だからね。ヒープなしで動作するし、すごく低コストの抽象化で、シングルコアチップで同時にいろいろなことができる(新しい「スレッド」を作ることはできないけど)し、RTOSの複雑さもないんだ。Embassyには素晴らしい未来が待ってると思うし、チームがここまで来たのは本当にすごいことだよ。reqwless(https://github.com/drogue-iot/reqwless)にも触れておきたい。これはEmbassy-net用のHTTPクライアントで、HTTPSもサポートしてるんだ!Rustの埋め込みは実際にはCやC++より良くなかったけど、EmbassyのおかげでMCUでRustをどれだけ使えるかで購入の決定をする大きな理由になってる。

これを試すためにMCUを選ぶとしたら、どの開発キットがいいと思う?

Hacker Newsで議論の続きを見る