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