Raspberry Pi Pico with Rust
まとめ
テンプレート作ったから直ぐできるよ
Raspberry Pi Picoとは
Raspberry Piの他モデルと違ってLinuxを動かさない純粋なマイコンです。
価格は$4、SwitchScienceでは\550でした 安い!
Raspberry Pi Picoのプログラミング環境
Raspberry Pi Picoは公式でC/C++とMicroPythonによるプログラミング環境が用意されています。
私はどちらの言語も好きではないです。
というわけで、C/C++向けのSDKをラップしてRustでプログラムを書けるようにしました。
このテンプレートからリポジトリを作って、cmakeでビルドすればRustのプログラムからRaspberry Pi Picoに書き込むuf2まで作ってくれます。
src/lib.rs
にはLチカのコードが書いてあるのでそれを見ればだいたいわかると思いますが、SDKのすべての関数にwrapped_
をつけたものをRustから読みこめるようになっています。
#[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