0

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
                                |  ...

1 件の回答 1

-1

RTCライブラリ、というのは、そのシステムに時計ICが実装されているなら、その時計ICを操作するライブラリ、です。
もしそのシステムにGPSが実装されているなら、GPSからの時刻データを取得するライブラリとなります。
さて、果たしてそのシステムにそのたぐいのデバイスが実装されていなければ、なにを操作するライブラリとなるんでしょうか。

ってことで、おそらく、そのSPRESENCEというシステムには、RTCライブラリが駆動するべきデバイスが実装されていないのでしょう。そのため、似たような機能であるmillis()関数を使って日時データを操作するような構成となっているのでしょう。

ってことで、長々と推測を書き連ねましたが、Arduinoにかかるライブラリのソースコードはすべて公開されてい(るはず)ますので、そちらの方を確認すれば確かなところはわかろうかと思います

2
  • y_waiwai さん、コメントありがとうございます。 SONYのSPRESENSEボードにはRTCが内蔵されています。(GPSも内蔵されています。) 質問以前に、自分なりにライブラリのソースコードも追ってみたのですが、実力不足で解決に至りませんでした。
    – user60784
    Commented 7月16日 2:24
  • y_waiwai さん、サイトへの質問もコメントも初めてでよくわからず、間違って「横にある数字(上下に▲▼)を押してしまったかもしれません。申し訳ないです。
    – user60784
    Commented 7月16日 3:09

この質問に回答するには、ログインする必要があります。

求めていた回答ではありませんか? のタグが付いた他の質問を参照する。