リアルタイムOSの動作は確認できたので、次に1つのポート(I2C-0)を複数のスレッドで共有可能な事を確認しました。最初は Mutex で検討しましたが、コンパイルエラーで上手く行かなかったので、Semaphor の Mutex を使って行いました。結果として問題無く複数のスレッドでポートを共有できる事が確認できました。合わせて、他のセンサー入力も同時に動作させて複数の入力が同時に処理できる事も確認しました。具体的には次の7つの処理を同時に実行させました。
1.ST7735 -1.8” LCD (SPI)
2.DHT-11 センサー入力 (1Bit serial I/O)
3.HC-SR04 (エコーパルス時間計測)
4.MLX90614(ソフトI2C)
5.I2C-0でのSemaphor Mutex 処理
- GY-271 (磁気センサー)
- MPU-92/65 (ジャイロセンサー)
- OLED 0.96" (I2Cバスモニタ用)
回路図
今回は、入力の並列処理の様子を見る為なので、1ビットのシリアルデータの読み取りタイミングで内容を判断するもの(DHT-11)と音波の反射時間を計測するもの(HC-SR04)およびI2Cのポートを共有して利用するセンサーをテスト用に利用しました。その中で MLX90614 は利用したI2Cのライブラリーでは対応できない様なので、これをソフトI2Cでの対応に変え、代わりにOLEDのグラフィック動作チェック用のスレッドを I2Cポートの共有デバイスとして追加しました。測定結果の表示にはSPI方式のLCDで対応しました。
動作デモプログラム
センサー動作用のコードは、過去に他のデバイス用に作ったものを移植(部分変更)してスレッド処理で動作する様にしました。
動作状態は次のYouTubeから見られる様にしました。
テスト結果
並列入力処理に関しては、次の様な状況でした。
1.読み取るパルスの時間を計測する処理の途中で他のスレッドの処理が割り込まれて、計測値がエラーになる事が想定されましたが、エラー対応が働いている様で目立った値の変化は見られませんでした。
2.I2Cポートのセマフォ―による共有処理では、バスモニターとして利用しているOLEDの表示途中に中断が時々見られましたが、おおむね許容できる範囲だと思われました。ただし、サイン曲線の表示デモに置いては、描画の途中での中断が気になったので、サイン描画途中での他のスレッドからの利用を禁止する様にすれば、気にならないレベルにする事ができました。