組み込みLinux:NTPなしで時間を設定する

組み込みLinux:NTPなしで時間を設定する

uart経由で衛星接続を使用して他のデバイスから日付を抽出するyoctoで構築された組み込みLinuxデバイスで作業します。この日付にアクセスすると、さまざまなデーモンが実行され、マルチスレッドアプリケーションが完全に初期化されました。

私が読んだ内容によると時間()または日付/時刻設定()タイマーに依存するすべてを破ることができます。そうだと思います。std::this_thread::sleep_for()含まれますか?

この時点でシステム時間を設定する安全な方法はありますか?または、インターネットにアクセスできないほとんどの組み込みLinuxデバイスはこの問題をどのように解決しますか?

編集:RTCがありますが、私たちが使用しているhwclock実装では、少なくともhwclock APIを介してRTCに直接書き込むことはできません。ここにいる- 助ける:

BusyBox v1.24.1 (2018-11-14 12:40:41 PST) multi-call binary. 
Usage: hwclock [-r|--show] [-s|--hctosys] [-w|--systohc] [-t|--systz] [-l|--localtime] [-u|--utc] [-f|--rtc FILE]

しかも協会hwclockソースに。

答え1

hwclockどちらを使用できますか?しなければならないすべての組み込みLinuxディストリビューションに組み込まれています。

$hwclockはい - コマンド名からわかるように -ハードウェア使用されているオペレーティングシステムとは無関係の時計です。今日では、マザーボードに内蔵されている低電力発振器を使用して、機械の電源が切れていても時間の経過を追跡します(長時間持続する可能性があるMBバッテリーを使用)。

そうでhwclockない場合は、喜んで議論したい他の選択肢がありますが、hwclock可能であればgotoコマンドを使用することをお勧めします。

答え2

私の解決策は、ioctrlを使用してrtcに直接書き込むことです。この問題が発生した場合の実装方法は次のとおりです。

#include <linux/rtc.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>


int main(void)
{
  int fd;
  fd = open("/dev/rtc0",0);
  if (fd < 0)
    printf("Can't open rtc!");

  struct rtc_time time;

  time.tm_sec = 12;
  time.tm_min = 12;
  time.tm_hour = 7;
  time.tm_mday = 12;
  time.tm_mon = 7;
  time.tm_year = 118;

  if (ioctl(fd, RTC_SET_TIME, &time) < 0 )
    printf("Set rtc failed!");

  return 0;
}

関連情報