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.

2021年2月26日金曜日

Raspberry Pi PicoのC/C++ 環境をWSL2上に構築する



絶賛就活中の中の人です.この度Raspberry Pi Pico(RPi Pico)が運良く入手できたので,開発環境を整えてみたいと思います.

この記事は@kmakさんのRaspberry Pi Pico を WSL からあつかうをWSL2(Ubuntu 20.04)向けにアレンジしたものになります.



1.RPi Picoの開発環境


RPi PicoはRaspberry Pi財団が開発したRP2040を使用した開発ボード的なものです.
RP2040はCortex-M0+を2つ搭載したいわゆるデュアルコアマイコンで,いろいろな特徴があります(詳しくはデータシートで).
公式サイト上ではMicroPython SDK,C/C++ SDKが公開されており,このほかにもRustなどを用いることができるようです.
今回はベーシックにC/C++を使っていきます.

参考:
Raspberry Pi財団, "Getting started with Raspberry Pi Pico", https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf
@kmak, "Raspberry Pi Pico を WSL からあつかう",

2.WSL2の下ごしらえ


今回はWSL2上にC/C++ SDKを突っ込むわけですが,SDKを入れる前に必要なものを入れます.必要なものは以下の4つ.

  • gcc-arm-none-eabi
  • cmake (>=3.13)
  • git
  • build-essential

ubuntu 20.04であれば,これらをaptでインストールすればいいようです.ubuntu18.04ではcmakeをaptで入れると古いバージョンがインストールされるので,自前でビルドしましょう.

3.SDKのインストール


ドキュメント通りにインストールする.


# SDKとサンプルを入れるpicoフォルダを作成する
$ cd ~/
$ mkdir pico
$ cd pico

# SDKをクローン
$ git clone -b master https://github.com/raspberrypi/pico-sdk.git
$ cd pico-sdk
$ git submodule update --init
$ cd ..

上記でSDK自体は入ったのですが,環境変数PICO_SDK_PATHにSDKの場所を追加する必要があります.

$ export PICO_SDK_PATH=/(pico-sdkを入れたフォルダの絶対パス)/pico-sdk

これでSDKの準備は完了です.

4.サンプルコードを入れてコンパイル


SDKの動作確認もかねてサンプルコードをクローンしてコンパイルします.


$ git clone -b master https://github.com/raspberrypi/pico-examples.git
$ cd pico-examples
$ mkdir build
$ cd build
$ cmake -G "Unix Makefiles" ..
$ make

これにはそこそこ時間(i5-7200Uで2hぐらい)がかかるので気長に待ちましょう.
(全部のサンプルコードをビルドしているためで,どれか一つだけであればここまで時間はかからない)
ビルドの成果物は./pico-examples/build内に生成されており,Lチカのコードであれば./pico-examples/build/blink/に入っています.この時,ボードに入れるファイルは.uf2になります.

5.ボードに入れる


RPi PicoはBOOTSELを押したままの状態でPCとつなげるとストレージとして認識されます.ここに先ほど作成したuf2ファイルを入れると自動的にストレージとしての認識が解除され,コードの実行を開始します.
bashか何かで自動的にボードに投げ込んでもいいのですが,ここでは脳死でGUIのエクスプローラを使って入れました(もう少し考えたいところ).


 
©2021 shts All Right Reserved.