🍓

Raspberry Pi Pico with Rust

2021/02/21に公開

まとめ

テンプレート作ったから直ぐできるよ
https://github.com/White-Green/raspi-pico-rs-template

Raspberry Pi Picoとは

Raspberry Piの他モデルと違ってLinuxを動かさない純粋なマイコンです。
価格は$4、SwitchScienceでは\550でした 安い!
https://www.raspberrypi.org/products/raspberry-pi-pico/

Raspberry Pi Picoのプログラミング環境

Raspberry Pi Picoは公式でC/C++とMicroPythonによるプログラミング環境が用意されています。

https://www.raspberrypi.org/documentation/pico/getting-started/

私はどちらの言語も好きではないです。
というわけで、C/C++向けのSDKをラップしてRustでプログラムを書けるようにしました。

https://github.com/White-Green/raspi-pico-rs-template

このテンプレートからリポジトリを作って、cmakeでビルドすればRustのプログラムからRaspberry Pi Picoに書き込むuf2まで作ってくれます。
src/lib.rsにはLチカのコードが書いてあるのでそれを見ればだいたいわかると思いますが、SDKのすべての関数にwrapped_をつけたものをRustから読みこめるようになっています。

src/lib.rs(抜粋)
#[no_mangle]
unsafe fn main() {
    let led_pin = 25;
    wrapped_gpio_init(led_pin);
    wrapped_gpio_set_dir(led_pin, true);
    loop {
        wrapped_gpio_put(led_pin, true);
        wrapped_sleep_ms(250);
        wrapped_gpio_put(led_pin, false);
        wrapped_sleep_ms(250);
    }
}

現状は関数などをラップしただけなので呼び出しにはunsafeが必須ですが、さらにラップした安全なライブラリを適当に作る予定です。

構造

公式が提供しているC/C++向けSDKを使うためのスクリプトをそのまま利用して、ネイティブ向けにコンパイルしたRustのライブラリを実行ファイルにリンクするようにしています。

裏話

RustでC向けのライブラリをラップする場合対象のライブラリをリンクしたRust向けライブラリ(hoge_sysみたいな名前が多い)を作る方針が多いですが、これは逆向き(C/C++に対してRust製のライブラリをリンクする方針)です。
これはRaspberry Pi PicoのSDKがINTERFACEなライブラリで提供されていてRustプログラムに対してリンクできなさそうだったからです。
構造としては前者のほうがきれいなので、できればその形式にしたいと思っています。
実現できる方法に心当たりのある方がいましたら教えてもらえると嬉しいです。

Discussion