在使用 yocto 构建的嵌入式 Linux 设备上工作,该设备通过 uart 从具有卫星连接的另一台设备中提取日期。当我们访问这个日期时,我们已经完全初始化了多线程应用程序以及正在运行的各种守护进程等。
根据我读过的内容,使用时间()或者设置日期时间()可能会导致破坏任何依赖计时器的东西。我猜是这样的std::this_thread::sleep_for()会包含在其中吗?
此时是否有一种安全的方法来设置系统时间,或者大多数无法访问互联网的嵌入式 Linux 设备如何解决此问题?
编辑:我们确实有一个 RTC,但是我们正在使用的 hwclock 的实现不允许我们直接写入它,至少通过 hwclock api 是不允许的。这里是- 帮助:
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
是 - 正如命令名称所示 - a硬件时钟,独立于所使用的操作系统。如今,它使用主板内置的低功耗振荡器,即使机器断电也能跟踪时间的流逝(使用可以持续很长时间的 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;
}