Date

嵌入式 Linux:在沒有 NTP 的情況下設置時間

  • February 26, 2019

在使用 yocto 建構的嵌入式 Linux 設備上工作,該設備通過 uart 從另一個具有衛星連接的設備中提取日期。到我們可以訪問這個日期時,我們已經進入了一個完全初始化的多執行緒應用程序以及正在執行的各種守護程序等。

從我讀過的內容來看,使用*stime()settimeofday()可能會導致任何依賴於計時器的東西被破壞。我猜想std::this_thread::sleep_for()*之類的東西會包含在其中嗎?

此時是否有一種安全的方法來設置系統時間,或者大多數無法訪問網際網路的嵌入式 Linux 設備如何解決這個問題?

編輯:我們確實有一個 RTC,但我們正在使用的 hwclock 的實現不允許我們直接寫入它,至少通過 hwclock api。這是*–help*:

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 源的連結。

我的解決方案是使用 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;
}

您可以使用應該內置到每個嵌入式 linux 發行版中的hwclock哪個。

$hwclock是 - 正如命令名稱所暗示的 - 一個硬體時鐘,獨立於正在使用的作業系統。如今,它使用主機板內置的低功耗振盪器,即使機器斷電也能跟踪時間流逝(使用可以持續很長時間的mb電池)

如果hwclock不可用,我會很樂意介紹其他替代方法,但hwclock如果可用,應該是您的 goto 命令。

引用自:https://unix.stackexchange.com/questions/503157