Azure RTOS というモノを触りました。
電子工作入門者ですので詳しい仕組みはわかりませんが、並列化には RTOS が必要とのことでした。で、探すとあったのがコレ。Free RTOS とかAzure RTOS などが検索で引っかかり、sample が目に留まった後者を選択。
まず戸惑ったのが、tx_thread_sleep() のスリープ時間。引数に10を入れると100ms、1を入れると10ms止まります。入力がmsecではないのか?と調べてみると、、、違っていました。
このサービスによって、呼び出し元のスレッドは、指定したタイマー ティック数だけ中断されます。 タイマー刻みに関連付けられている物理時間の量は、アプリケーション固有です。
(´・ω・)ん?
TX_TIMER_TICKS を入力することはわかりましたが、物理時間がアプリ固有って、どういう意味でしょう?1TICK = 10ms がデフォルトのようですが、きっちり10msとは限らないってことでしょうか?
Azure RTOS を使用すると millis() など時間に関する関数が効かなくなります。tx_time_get()で代用すると、TX_TIMER_TICKS が効いてくる。10msec単位の制御だと、上記から1msec単位の精度が担保されているのか不安。では、ticks/secを1msecに変更するしかない。この定義は tx_api.h の中に定義がありました。
/* Define the common timer tick reference for use by other middleware components. The default value is 10ms, but may be replaced by a port specific version in tx_port.h or by the user as a compilation option. */
#ifndef TX_TIMER_TICKS_PER_SECOND
#define TX_TIMER_TICKS_PER_SECOND (100UL)
#endif
1tick = 10ms は、RTOSの標準みたいですね。これを1000ticksに変更してコンパイル。
が、ダメ。1tick = 10msから変更されません。ココ以外に定義されているのか?TX_TIMER_TICKS_PER_SECOND を検索すると、tx_user_sample.h でも定義できるようでした。コチラも1000に変更してコンパイル。
が、ダメ。変更されません。もともとコメントアウトされていましたので、当然といえば当然。ですが、これら以外に検索で引っかからないため、これ以上手を出せません。
またしてもココでやむなく放置。
MKRへの実装では、ブレッドボードに指すだけでセンサー取得値が不安定になる、SPI2系統を区別できていない、並列化できていない、といった具合に解決すべき点が多く残っています。PICOはセンサー値取得すら至っていませんので、それに比べるとまだマシですが。
今の能力での解決は難しそうです。
*********************************
20230316追記
そもそも MKR には SPI が1系統しかないとのこと。HPを見ると、確かにそのように書いてありました。
とすると、この機種では I2C + SPI しかないですね。