SPRESENSEのマルチコア使用時のRTCライブラリとmillis()関数について質問します。
VSCode+PlatformIOで検討しています。
subCore1でw5500を動かし[arduino-libraries/NTPClient @ ^3.2.1]で時間取得、その時間をmainCoreに送りRTC.setTime()を実行しています。
このとき、RTC.setTime()実行直後からsubCore1側のみ、millis()値がおかしくなります。
RTCに設定した「エポックタイム+本来のmillis()」という値になってしまうようです。
NTPClientはNTPサーバへの更新間隔をmillis()で確認しているため動きがおかしくなってしまいます。
subCoreを使わずmainCoreだけで動かせばこの問題は起きません。
最初、NTPClientが原因かと追っていましたが、どうも違うようだと分かりました。
単純化するため以下のようなコードで試してみましたが、問題は再現します。
同様のコードを、Arduino IDE でも試しましたが、やはりおかしくなります。
私の理解(使い方)が根本的に間違っているのでしょうか。
なにかアドバイス頂ければありがたいです。
//mainCoreのコード
#include <Arduino.h>
#include <MP.h>
#include <RTC.h>
void setup() {
int ret = 0;
int subid = 1;
ret = MP.begin(subid);
if (ret < 0) MPLog("MP.begin(%d) error = %d\n", subid, ret);
// 以下3行の実行有無を切り替える
// RtcTime rtc(1720194861); // 検討用に固定値、実際はNTPサーバからの取得時間
// RTC.setTime(rtc);
// MPLog("RTCをupdateしました\r\n");
}
void loop() {
MPLog("millis(): %llu\r\n", millis());
delay(1000);
}
//subCore1のコード
#include <MP.h>
void setup() {
MP.begin();
}
void loop() {
MPLog("millis(): %llu\r\n", millis());
delay(1000);
}
RTC.setTime()の実行有無による結果は以下の通りです。
RTC.setTime()を実行しないとき | RTC.setTime()を実行したとき
[Sub1] millis(): 1 | [Sub1] millis(): 1
[Main] millis(): 1728 | [Main] RTCをupdateしました
[Sub1] millis(): 1002 | [Main] millis(): 1730
[Main] millis(): 2729 | [Sub1] millis(): 1720194859029
[Sub1] millis(): 2002 | [Main] millis(): 2732
[Main] millis(): 3730 | [Sub1] millis(): 1720194860030
[Sub1] millis(): 3002 | [Main] millis(): 3732
[Main] millis(): 4730 | [Sub1] millis(): 1720194861030
... | [Main] millis(): 4733
| ...