見出し画像

マルチコア・マルチスレッド化

Meridian計画。
前回の更新からだいぶ時間が経ちますが、沼にハマっていました。

ESP32からPCへのWiFi経由のデータ送信はうまくいっています。
逆のPCからESP32への受信についてもうまくいっています。
しかし送受信を同時に行うと通信エラーが溢れてしまいます。

しばらくの間、この不具合と格闘していました。
Meridian計画にとってはクリティカルすぎる問題です。

ESP32のマルチなんちゃら

ESP32はCPUコアを2つ搭載しており、上手く使えばPCのように分散処理が可能です。いざとなったらこの機能を使えばなんとかなると思いつつも、導入は先延ばししていました。
というのも、そもそもマルチなんちゃらの意味がはっきりとはわかっておらず、使い方もよくわからなかったためです。新しいことを試すのは実にめんどいのです。
しかし、今がまさにそのマルチなんちゃらを使うべきいざの時なのです。重い腰もあげざるをえません。

手始めにマルチなんちゃらについての理解を進めることにしました。
平行処理にはおおまかに2種類あり、それぞれマルチコアとマルチスレッドと言うようです。

2つの違いをまとめると下記の図のようになります。

1つのCPUを高速に切り替えながら平行的に処理を行うのがマルチスレッド。2つ以上のCPUで本当に平行処理を行うのがマルチコアです。
マルチコアとマルチスレッドは同時に利用することができます。
(解説はこちらにも)

マルチスレッドを導入してみる

概要が理解できたので実際に導入してみます。
基本となるコードについての解説もまとめてみました。(こちら

マルチスレッドやマルチコアを利用する場合にはリアルタイム処理という、平行処理同士を連携させていくための仕組みが必要ですが、そちらも勉強し、単純な形ではありますが導入しました。

結果、ESP32の動作が軽くなりwifiの送受信を同時に行ってもエラーが出なくなりました!

さらっと書いてはいますがこの作業ではいろいろと壁や沼があり、半年ほど時間を使ってしまいました。
Meridian計画の中でも中核となる部分なので不具合を残すわけにはいきません。

残る課題は運用で回避する

WiFiの送受信同時処理はなんとか成功したのですが、これにBluetoothの受信を上乗せするとまたエラーが発生してしまいます。
マルチスレッドとマルチコアを駆使しているのに、それでも処理が重くなる原因はどこにあるのでしょう。

ESP32にはCore0とCore1という2つのコアがあります。
この2つのCPUを上手に使い、処理を分散させたいわけですが、無線関係の処理はCore0しか担当することができないという課題があります。

Core0上では以下の3つのスレッドが走っています。
① WiFi(UDP)の受信
② WiFi(UDP)の送信
③ Bluetoothの受信

2つの同時処理までは問題なく動くのですが、3つ同時となるとさすがに処理が重くなりエラーが出てしまうようです。
3つの処理を同時に行わずに済むように、運用方法を整理してみます。

MeridianボードをPCと連携して使う場合

Bluetoothはリモコン信号の受信が主な役割です。
が、WiFi通信時はPCとの接続が確立しているので、PC側でリモコンデータを読み込むようにすれば運用上は問題がありません。
Meridim配列にリモコンデータを格納できるようにしてあるのは、そういう運用に備えたものでもあります。

Meridianボードをスタンドアロンで使う場合

PCレスのスタンドアロンで使用する場合には、動作はMeridianボード側で処理できるので、通信はBluetoothのリモコン信号受信のみが動いていれば大丈夫です。
また、スタンドアロンで運用しながらモニタリングやデータの取得を行いたいという場合にはWiFI送信とBluetoothを動かせばそれも可能です。
ということで、どちらの場合も運用は可能になります。

少しモヤモヤは残る

PC連携時とスタンドアロン時でリモコンの接続先を変えなくてはならないというモヤモヤが若干残ります。
またPCの方が接続可能なリモコンの種類が多いので、PC経由では使えるけどスタンドアロンでは使えないリモコンというのも出てきます。
なによりPC側のリモコン読み取りプログラムも準備しなくてはならず、地味に時間がかかりそうで厄介です。

一方、関係者でユーザーの多いKRC-5FHであれば接続先がTeensy側なのでこの問題は気にせずOKです。
Teensy側に接続するSBDBTを利用するという手も一応あります。
このあたりの柔軟さはMeridianの良い点です。(よね?)

時間が解決してくれるかもしれない

通信関連のライブラリがアップデートされたり、新型のボードが発売されればこの辺りの問題はあっさりと解決してしまう可能性が大きいです。

むしろ開発が遅れていることの方が問題なので、ここで切り上げて次に進めていこうと思います。

それにしてもスッキリした!

理屈では動くと分かっていても、実際に試すと細かい調整が必要だったり解明すべき謎部分も多かったりとなかなか大変です。

そこは例えるならば沼であり森であり壁であり闇であり、手探りの中で延々と時間を溶かし続けることになります。
その分だけ、思い通りに動いた時のハレバレ感は気持ちのよいものです。

いまはパッと目の前に見通しのよい草原が現れたような気分です。

しかし後ろを振り向けばこの通ってきた道を整備するための事務的な舗装作業がたっぷりありますし、目の前の草原にしてもどっちへ進めばよいのか、やれることの選択肢が急にドバッと広がって途方にくれるほどです。

とにかくまずは道の整備。そこをがんばれば、才能に溢れる開発仲間がその先を創造してくれるに違いありません。

次回記事:

前回記事:

目次:


この記事が気に入ったらサポートをしてみませんか?