ラズパイPico用のMicroPythonをソースからビルドできる環境でき、調子に乗った前回はLinux版MicroPythonを作成。ビルド環境はRaspberry Pi OS上でした。今回はビルド環境をWindows11上のWSL2に変更、SAMD21マイコン用のMicroPythonをクロスコンパイルしてみます。
※「MicroPython的午睡」投稿順 Indexはこちら
WSL2上のクロスコンパイル環境のセットアップ
ラズパイPico用母艦は、デバッガの関係でRaspberry Pi 4 model Bを使用しています。しかし他のマイコン機種ではWindows機上で作業していることが多いのです。そこでWindows11上のWSL2(Windows Subsystem for Linux)、Ubuntu 20.04 LTSが動いているもので、MicroPythonをクロスコンパイルできるような環境を整えることにいたしました。なんといっても必要なのはクロスコンパイラ
arm-none-eabi-gcc
とその眷属どもです。そこでWSL2上のUbuntu 20.04で調べてみました(なお、上記コンパイラのパッケージ名は、gcc-arm-none-eabi デス。)
aptじゃ入らないような噂?を見たのですが、aptで入りそうじゃん。それが一番良いのう。楽だし。ということでインストールいたしました。コマンドラインは以下です。
sudo apt install gcc-arm-none-eabi libnewlib-doc
gcc-arm-none-eabiをインストールすると、その眷属ども arm-none-eabiのbinutilや、libnewlib あたりも漏れなくインストールしてくれるみたいです。ただ、libnewlibのドキュメントは指定しないと入りませぬ。多分、ネット上のドキュメントを見てしまうので、ローカルに持たなくてもよい気がしないでもないのだけれど念のため(といって増えるディスクの肥やし。)
インストール後、クロスコンパイラのバージョンを確認すると以下のようでした。最新版ではなくとも Cortex-M0+やCortex-M4クラスを使うのには問題ないかと。知らんけど。
MicroPythonのビルド
Raspberry Pi 4機上で一度やってますが、今度はWSL2上のビルド作業用のディレクトリ内で、以下の git clone コマンドを走らせ、MicroPythonのソース一式をダウンロードさせていただきました。
git clone -b master https://github.com/micropython/micropython.git
上記により、MicroPythonディレクトリができています。まずはそこに入って、MicroPythonのクロスコンパイラ(MicroPythonの.py ソースコードをバイトコードに変換するもの)を作成します。ラズパイPicoのときにもやりましたが、MicroPython処理系によってはバイトコードに変換済のモジュールを内部に取り込むことがあるためMicroPythonインタプリタそのものをビルドする前にmpy-crossがないといかんようです。
make -C mpy-cross
ここから機種依存のMicroPythonインタプリタ本体のビルドに入ります。今回は、米MicroChip社製のArm Cortex-M0+コア搭載ATSAMD21G18マイコンをターゲットとします。MicroPython配下のsamdマイコンのディレクトリに入ります。
cd ports/samd
ここのドキュメントを読むと、samd21およびsamd51マイコンがターゲットとなっています。いくつかボードが列挙されている中で今回はSeeed Studio社のXIAOボードを対象にオブジェクトを作ることにいたします。
手順は、ほぼほぼラズパイPicoの時と同様です。まずは submodulesのビルド。
make BOARD=SEEED_XIAO submodules
上記を実行すると、いくつかのサブモジュールが準備されていきます。tinyusbもここで準備されるのね。
submodulesがOKだったら、いよいよMicroPython本体のビルドです。以下のようにターゲットボードを指定するだけでビルドできます。
make BOARD=SEEED_XIAO
手元の環境ではお茶を一杯飲めるかどうか程度の時間でビルド完了。ビルド完了時には以下のように表示されてました。
なお、上記には firmware.elfとfirmware.uf2が見えてますが、.binも生成されとりました。
実機Seeeduino XIAOに書き込み MicroPython起動
実機に書き込むのは firmware.uf2ファイルです。uf2ファイルを書き込む方法は、前述のSeeed Studio社のページに記述されているハズですが、
USB接続してあるXIAOボードの表面、端っこにあるRSTと書かれたパッドとその隣のパッドを「素早く」2回ショートさせる
という技が必要です。できる人には大した作業ではなくピンセットでチョイチョイでできるぜという話もありますが、手先が不自由な年寄は見えないパッドを心に思い浮べながらジャンパ線のピンヘッダでツンツンしてます。
USB接続先がWindowsの場合、ストレージのウインドウが開くので、そこにfirmware.uf2をドラッグ&ドロップすれば書き込みはOKです。
さて、MicroPythonとの通信にはThonnyIDEを使用しました。ThonnyIDEが内部に持つMicroPythonのバイナリを書き込んでいるわけでないので、バックエンドの指定は、MicroPython(Generic)です。
MicroPython v1.19.1、Seeed Xiao、SAMD21G18用のお出ましであります。この処理系にはRTCモジュールの備えが無いので最初の行にWARNINGがありますが、気にしないっと。
ThonnyIDEの右下みると、MicroPython(generic)・COM11として接続していることがわかります。
しかしね、ちょいと内蔵のモジュールを覗いていて、このMicroPython実装の最大の問題点を見つけてしまいましたぜ。
上記をご覧ください。使えるメモリ、なんと少ないことでしょうか。だいたいどのMicroPythonもメモリに不自由しているものが多いですが、その中でもギリギリ、カツカツな感じです。
まあね、SAMD21G18AはRAM32Kバイトしか積んでいないのでMicroPython走らせると辛いっす。御本家 Seeed Studio社は、MicroPythonでなくCircuitPython推しみたいなのは、その辺もあってか、どうなんでしょ?
WSL2上でクロスコンパイルしたオブジェクトがSAMD21G18A上で動いた、と。まあ、とりあえず今回も成功。よかった。