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;
}