ハクソク

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

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

概要

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のデュアルライセンス
  • コントリビューションは明示ない限り上記ライセンスで受領

由来

  • 名前の由来:「EMBedded ASYnc」から命名

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を選ぶとしたら、どの開発キットがいいと思う?
同意する。HALに持ち込む型安全性は、これに入る人たちにとってクッションみたいなものだよね。でも、ウォッチドッグが何かは全然理解できなかった…
それと、Embassyの上に構築されたAriel OS(https://ariel-os.org)もチェックしてみてね。
Xousもおすすめだよ。大使館とは完全に独立してるけど、先手を打ったマルチタスクを探してるなら役立つかも。: https://www.youtube.com/watch?v=DaWkfSmIgRs
それと、マイクロソフトがECで使ってるみたいだよ。 https://opendevicepartnership.org/embedded-controller
ちょっと話が逸れるけど、組み込み開発を始めるにはどうすればいい?10年以上ウェブ開発をやってきたけど、もっと低レベルなことに挑戦してみたいんだ。今はRustの本を読み進めてるところ。Raspberry Piが届く予定だけど、これって本当の意味での組み込み開発じゃないよね。
普通のRaspberry Piは組み込みとは言えないと思うけど、Embassyのドキュメントによると、Raspberry Piマイコン用のEmbassyのバージョンがあるみたいだよ。 https://docs.embassy.dev/embassy-rp/git/rp2040/index.html https://www.raspberrypi.com/documentation/microcontrollers/
Raspberry PiはGPIOをいじれるから、組み込みの大きな側面だよね(たとえLinuxを動かしていても、FreeRTOSとかじゃなくても)。もしもっとハードウェアに近いことをやりたいなら、ESP32ボードをチェックしてみて。中国から超安く手に入るし、リポバッテリー充電器や画面など、いろんなクールな形状のものが見つかるよ。
こんにちは!これは広いアドバイスだけど、面白いと思う問題を考えてみるのをおすすめするよ。趣味や仕事に関連しているか、ただ楽しいと思えることでもいい。そしたら、それを実現してみて!
RP2040が載った開発ボードを買って、電子工作のスターターキット(抵抗、コンデンサ、LED、ダイオード、ブレッドボード、ブレッドボードケーブルなど)を手に入れて、コードを書き始めよう!Rustの話をするなら、rp-halは始めるには最高だし、もちろんEmbassyもいいけど、問題にぶつかり始めたときに使うのがいいかもね。rp-hal: https://github.com/rp-rs/rp-hal
RP2040チップのファンだよ。シンプルさと性能のバランスがいいと思う。STM32みたいなもっと強力なチップもあるけど、正直、バリエーションが多すぎてデータシートが地獄だし。Atmel AVRみたいなシンプルなチップもあるけど、ツールがイマイチ。ESPチップもいいけど、最近は追いついてないからあんまりアドバイスできないな。チップとサポートコンポーネントが載った開発ボードが必要だよ。Raspberry Pi Picoは広く使われてて、ドキュメントも充実してるからいい選択だね。Rustに興味があるなら、Debug Probeも買った方がいいよ。お金の価値はある。Rustに興味がないなら、Adafruitの開発ボードはCircuitPythonが動くし、ドキュメントも良いし、始められるプロジェクトもあると思う。Rustにはあまりおすすめしない理由は、彼らの開発ボードの多くがデバッグプローブ用の接続を「ブレイクアウト」してないから。編集:やりたいプロジェクトがあるのはいいけど、LEDを点滅させるだけでも魔法のような体験だよ、特にハードウェアに触れたことがないならね。
先週、Amazonでこれを25ドルで買ったよ: https://www.waveshare.com/esp32-c6-touch-lcd-1.47.htm すごく感動してる。基本的にはストラップやバッテリーなしのハッカブルFitbitみたいな感じ。フルWi-Fi、BLE、6軸モーション。Cのデモを動かすのはすごく簡単だった。LVGLは最高だね。Rustについてはあまり話せないけど、日常の仕事で十分その複雑さを味わってるから。他の初心者向けのブランドとしてはElecrowやMakerfabsが良さそうだよ。RISC-Vに特に興味があったけど、他のアーキテクチャ用のボードも揃ってる。
要するに: - 地元のハッカースペースで組み込みチップをプログラミングしてる人たちとコンタクトを取る - https://wokwi.com/ を使って始める 俺も同じ状況だった。数十年高級言語をプログラミングしてきたけど、組み込みに手を出したくて。地元のハッカースペースに友達がいて、チップのプログラミングを独学で学ぶこともできるけど、詰まったときに誰に聞けばいいか知っておくのは大事だよ。近くのハッカースペースはここで見つけられるよ: https://wiki.hackerspaces.org/Hackerspaces WokwiでCとRustをプログラミングしてる。電子部品やスイッチバウンス効果のシミュレーションもできるし、すごく簡単で無料で使える。VSCode(ium)みたいなローカルIDEも使えるし、1つのプロジェクトで使ってみたけど、プロジェクトがかなりスピードアップしたよ。: https://wokwi.com/
Raspberry PICOやESP32よりもST Nucleoボードをおすすめするよ。NucleoボードにはSWDプログラマーが内蔵されてるから、フラッシングが楽になる。コードのデバッグにも使えるし、USBプロジェクトを作るためにオンボードUSBポートがあるもの(例えば: https://www.st.com/en/evaluation-tools/nucleo-f767zi.html)を手に入れるといいよ。
HNのフロントページにこれが載ってるのを見るのは嬉しいね。プロジェクトで何度もEmbassyを使ったけど、本当に美しい作品だよ。超おすすめ!
C系の言語は全然学んでないから、結構大変だったけど、esp32c3のbare-metal no_std rustの基本を学ぶのは楽しかったよ。esp-rsとembassyのサポートのおかげで始めやすかった!俺の学習プロジェクトは、HomeAssistantとの統合にmqttを使うことだよ。https://github.com/n8henrie/esp32c3-rust-mqtt
ベアメタルプログラミングは学習の一環だってわかってるけど、99%のユースケースではesphomeが素晴らしいって言えるよ。最近、猫の餌やり機をesphomeスマートデバイスに仕上げたばかりなんだ。
Embassyがめっちゃ好き。ベアメタルCやFreeRTOSから来たけど、やっと組み込みに現代的で良いツールチェーンが来た感じ。これはEmbassyだけじゃなくて、周りのエコシステムのおかげでもあるけど、いくつかのハイライトを挙げると: * probe-rsとのcargo run統合 * defmtロギング(probe-rsとrttと組み合わせるとすごくいい) * embedded_hal(俺の場合はstm32-rs) RTICも試したけど、非同期の使いやすさが好きだからEmbassyを続けることにした。少し機能が足りない時もあったけど(特定の周辺機器用の非同期ドライバがないとか)、必要なものを実装するのはそんなに難しくなかった。OS Xでもすぐに動くのには驚いた。一般的に、組み込み開発にはLinuxを使うことが多かったから。Apple Mのハードウェアで素早くコンパイルして、すぐに実行できるのは最高だね。周辺機器へのアクセスを共有する方法を理解するのに少し時間がかかったけど、理解したらすごく良かった。ロックのセマンティクスがコンパイル時に強制されるから、同じバスを2つのものが踏みつけることは基本的に不可能なんだ。これは大きくて速いSOCを扱うときに、追跡が難しいバグになることがあるからね。Embassyが特に良かったのは、高品質なUSBとネットワーキングスタック。USBスタック(USB経由のPLDM用)と、embassy_netのTCPスタックを使ってるけど、どちらも完璧だった。思いつく唯一の欠点は、ベンダーの例からコピペに慣れてる人を onboard するのが難しいことと、ベンダー自身とコミュニケーションやデバッグするのが時々大変なことかな。全体的には本当に満足してるし、特にSTMエコスフィアにいるなら試してみることを強くおすすめするよ。
>やっと組み込みに現代的で良いツールチェーンが来た感じ 最後にEmbassyを試したとき、ブリンキーをビルドするのに100以上の依存関係を引っ張ってきた。趣味のプログラミングにはいいけど、工業用途で使われるのはすぐには無理だと思う。