組込みRustの専門用語
micro:bitでのプログラミングを始める前に、今後の章で重要となるライブラリと専門用語とを一通り確認しておきましょう。
抽象化レイヤー
フルサポートされているマイクロコントローラーあるいはボードに対して、その抽象化レベルに応じて、次の用語を目にするでしょう。
ペリフェラルアクセスクレート (PAC; Peripheral Access Crate)
PACはチップ上のペリフェラルへの安全(と思われる)なインタフェースを提供し、あらゆるビットを好きなように設定できます(もちろん間違った使い方もできます)。 通常、より上位レイヤーでやりたいことができない場合か上位レイヤー自体を開発する時のみ、PACを扱います。 この本で(ひそかに)使うPACはnRF52向けのものかnRF51向けのものです。
ハードウェア抽象化レイヤー (HAL; The Hardware Abstraction Layer)
HALはチップのPACの上位レイヤーを作り上げ、このチップ特有の振る舞いをあまり知らない人にも便利な抽象を提供します。 通常、HALは全てのペリフェラルをそれぞれ1つの構造体で抽象化します。 例えば、ペリフェラル経由でデータを送信するために使える構造体があります。 この本ではnRF52-halもしくはnRF51-halをそれぞれ使います。
ボードサポートクレート (ボードサポートパッケージもしくはBSPと呼ばれます)
BSPは(micro:bitのような)ボード全体を抽象化します。 BSPはマイクロコントローラだけでなくセンサーやLEDなど、ボード上に存在するものを使えるように抽象を提供します。 頻繁に(特にカスタムされたボードでは)そのチップのHALを使ってセンサーのドライバを自分で作成するか、crates.ioを探すことになります。 幸い、micro:bitにはBSPがあるため、HALの上に作られたBSPを使います。
レイヤーを統合する
次に、組込みRustの世界でまさに中心の役割を担うembedded-hal
について見ていきます。
名前の通り、embedded-hal
は2レベル目の抽象化であるHALに関係しています。
embedded-hal
の根底にあるアイデアは、HALに含まれる特定ペリフェラル実装で共通となる振る舞いを定義したトレイト一式を提供することです。
例えば、ボード上のLED追加をオン、オフするために、あるピンの電源をオン、オフできる機能は必ずあるはずです。
共通となる振る舞いをトレイトとして定義することで、embedded-hal
トレイトの実装が存在するチップであれば、embedded-hal
のトレイトにのみ依存するようにドライバを書くだけで、どのチップでも使えるドライバ(例えば温度センサのドライバ)を書くことができます。
このように書かれたドライバをプラットフォーム非依存 (platform agnostic) と呼びます。
嬉しいことに、crates.ioにある多くのドライバが実際にプラットフォーム非依存です。
さらに詳しく
もし紹介した抽象レベルについてより詳しく知りたい場合、Franz Skarman (TheZoq2) がOxidize 2020のAn Overview of the Embedded Rust Ecosystemでこのトピックについて話しています。