MaixPyのマルチスレッドを使う(M5StickV/UnitV/Maixduino/MaixDock)
MaixPyでマルチスレッドを使う
M5StickV、UnitVで使われているK210はマルチコアのため、スクリプトを並列で処理することが可能です。しかし、実際に使ってみると、ハマりどころが多く苦労したので記録として記事にしておきます。細かく試していませんがSipeedのMaixシリーズ(Maixduino/MaixDock/MaixBit/MaixCube)でも同様だと思います。
はじめに
2020/10/10現在の情報で書いています。MaixPyのファームウェアはオープンソースのため日々進化しています。そのため仕様が変わる可能性もありますのでその点はご了承ください。
マルチスレッドを使うためには
2019/9/29のこのコミットから_threadというパッケージが利用可能になっています。これより古いファームウェアでは動きません。実行時に下記のメッセージが出た場合はファームウェアを最新にするか、ビルドする必要があります。
ファームウェアのビルド方法はM5StickVのファームウェアビルド手順を参考にしてください。
ImportError: No module named _thread
menuconfig
ビルドする場合は「Micropython configuration」→「Modules configuration」の「Enable _thread module」がチェックされているか確認してください。
マルチスレッドの使い方
サンプルスクリプト
Sipeed 公式
Sipeed公式で用意されている_threadのサンプルはこちらです。
UARTの送受信を行うサンプル
実際にスレッドで送受信を行うサンプルを公開しています。
M5Stack Core2とUnitVを接続して両方からUART通信でデータを送受信するサンプル
マルチスレッドを使う時の注意事項
適度にtime.sleep_ms()を挟む
sleepが無い場合、片方のスレッドが動くだけでもう一つのスレッドが動きません。time.sleep_ms()で適度にsleepを挟みましょう。私が調べた限りでは10~100ms程度は必要なようです。
メインプログラムにもループが必要
スレッドだけで動かしたい場合でもメインのループは必要です。
while True:
pass
ハードウェアを複数スレッドから操作したい場合は排他を作りこむ必要があります。(2020/10現在まだ調査中)
lcdやファイル読み込みなど、複数スレッドから制御しようとすると上手く行きません。排他処理を自分で組み込む必要があります。現状では描画やファイルのやり取りを複数スレッドで行うことは避ける必要があります。
_thread.lock等試してみましたが上手く動きませんでした。
実際にマルチスレッドで動いている様子
※ 動作させるためには自分で画像認識用のモデルと音声認識用のモデルを作成する必要があります。
画像認識と音声認識
ソースコード
Speech & Image Recognizer for M5StickV(要ファームウェアの最小構成ビルド)
画像の入れ替えとWAVの再生
おわりに
まだ、自分でも使いこなせていませんがMaixPyの_threadを使う方法を書きました。せっかくのマルチコアですので有効活用していきましょう。
Discussion