2021年2月28日日曜日

RPi Pico向けRustサンプルコードを動かす(Win10 + PowerShell + WSL)




就活解禁数時間前にブログを書き出す中の人です.少し前にRPi PicoをWSL + C/C++ SDKで実装する話を書いたのですが,どうやらRustで動くサンプルコードがあるようだったので,実際に動かしてみました.

今回はEmbedded Rustの話は置いといて,とにかくサンプルコードをRPi Pico上で動かすことにフォーカスします.そのためコードやクレートの解説はほかの資料に譲ることにします.





1.RPi PicoとEmbedded Rust


そもそもRustで組込みプログラミングができるのかという問題があるのですが,Arm Cortex-M系のマイコンであれば動かすことができるようです.RPi PicoのマイコンであるRP2040はCortex-M0+のデュアルコアなのでRustが動かせるというわけです.

参考:

2.何をやるか


今回はデバッガ等も使わずに,ただひたすらにバイナリを吐き出しLチカを
することにフォーカスします.

3.環境


今回は,コードのビルドとELF->UF2の変換で使う環境を変えました.

ビルド:Rust(1.52.0-nightly) + PowerShell
ELF->UF2の変換:WSL2(Ubuntu 20.04)

最初はWSL2一本でやろうと思ったのですが,cargo buildを実行した際に

error: RPC failed; curl 56 GnuTLS recv error (-24): Decryption has failed.

のエラーが出てしまい,ビルドが通らなくなる現象が解決しなかったので今回はPowerShellを使いました(GitHubとの通信で出るようで,git fetchやgit cloneが使えなくなる).
ビルド後の処理でC/C++SDKに含まれるツールが必要になるので,WSL2の方の環境構築もお勧めします.詳細は,こちらを参考にしてください.

ビルド環境の方は,公式の手順通りにRustを突っ込んだのちにarm-none-eabi-gdbを突っ込みます.この辺りはEmbedded Rustでの手順と同じですが,今回はデバッガを使わないので,OpenOCDなどは入れません.
arm-none-eabi-gdbをインストールする際に,必ず環境変数にパスを追加するようにしましょう.インストールの最後に出てくる画面にAdd path to environment variableのオプションが出てくるのでチェックを入れましょう(初期状態だとチェックがないはず).

4.サンプルコードのクローン



を適当な場所にクローンしましょう.ビルド作業はこのsample-project内で行います.

5.ビルド


早速ビルドに移るのですが,そのままではCortex-M0+のELFファイルを吐き出してくれません.そこでおまじない

rustup target add thumbv6m-none-eabi

を実行しておきます.これを実行したうえで

cargo run

すれば./target/thumbv6m-none-eabi/debug内にrp-testというELFファイルが吐き出されているはずです(実態はELFファイルだが,拡張子がない状態で吐き出される).

6.ELF2UF2


.elfも生成出来たのでRPi Picoへ実装したいのですが,Picoへ実装する際に.uf2に変換する必要があります.これを行うツールがRPi PicoのC/C++ SDKに入っています.このツールは事前にビルドする必要があります.今回はこのビルドをWSL2上で行うことにします.

cd (pico-sdkのあるフォルダ)
cd pico-sdk/tools/elf2uf2
mkdir build
cd build
cmake ..
make
sudo cp elf2uf2  /usr/local/bin/

ビルド終了後,WSL2でelf2uf2と打ち込み,

Usage: elf2uf2 (-v) <input ELF file> <output UF2 file>

と出てくればelf2uf2のビルド成功です.ここで先ほどのrp-testをrp-test.elfとリネームしておきましょう.elf2uf2の<input ELF file>は拡張子が.elfのファイルだけを受け入れるので注意しましょう.
最後に

elf2uf2 rp-test.elf rp-test.uf2

を実行すれば,rp-test.uf2が出来ているはずです.

7.実機で動かす




.uf2を実機に入れるところの操作はC/C++ SDKと全く同じなので割愛.
こんな感じでLチカ完了です.

8.感想


Embedded Rustとほぼ同じなので,開発環境についてはある程度ほかのマイコンでの知見が生かせそうです.またデバッガを使う場合は,OpenOCDやらなんやらのインストールが必要みたいです.

9.参考

"The Embedded Rust Book 日本語版",https://tomoyuki-nakabayashi.github.io/book/intro/index.html
"PicoボードにPico_SDKでC言語をビルドする", https://beta-notes.way-nifty.com/blog/2021/02/post-2fff25.html



©2021 shts All Right Reserved.

0 件のコメント:

コメントを投稿