ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 리눅스 어플리케이션에서 RTC 사용하기
    프로그래밍/리눅스 2021. 3. 26. 15:58
    728x90

    제품을 만들어보면 시간이 꽤나 틀어지는 경우가 많이 있습니다. 그나마 네트워크나 GPS 등의 장치가 있으면 시간 동기화라도 할 수 있지만 단독 제품인 경우는 그럴 수가 없습니다. 그래도 시간에 민감한 제품이 아니라고 생각해서 그냥 시장에 내보냈다가 바이어나 소비자로 부터 시간이 자꾸 틀어진다는 컴플레인이 발생하지요.

    (하지만 요즘에는 원칩에 있는 RTC도 꽤 정확하더라구요. 모든 경우에 다그런 것은 아닙니다.)

     

    그래서 외부 RTC를 사용해서 시간 오차가 적도록 설계하곤 하는데요. 외부 RTC가 잘 동작하는지 확인 할 수 있는 예제 코드입니다.

     

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/ioctl.h>
    #include <sys/time.h>
    #include <linux/rtc.h>
    #include <errno.h>
    
    int idx = 1;
    
    int main()
    {
    	int fd;
    	int rval;
    	char path[20];
    	struct rtc_time time;
    
    	sprintf(path, "/dev/rtc%d", idx);
    
    	if ((fd = open(path, O_RDWR)) < 0) {
    		fprintf(stderr, "Can't open file '%s'\r\n", path);
    		exit(EXIT_FAILURE);
    	}
    
    	// Set Time
    	time.tm_sec = 0;
    	time.tm_min = 0;
    	time.tm_hour = 0;
    	time.tm_mday = 1;
    	time.tm_mon = 1;
    	time.tm_year = 2021;
    	time.tm_wday = 0; // not use
    	time.tm_yday = 0; // not use
    	time.tm_isdst = 0; // not use
    
    	if ((rval = ioctl(fd, RTC_SET_TIME, &time)) < 0) {
    		fprintf(stderr, "%s\r\n", strerror(errno));
    		exit(EXIT_FAILURE);
    	}
    
    	// Read time
    	if ((rval = ioctl(fd, RTC_RD_TIME, &time)) < 0) {
    		fprintf(stderr, "%s\r\n", strerror(errno));
    		exit(EXIT_FAILURE);
    	}
    
    	fprintf(stdout, "%04d/%02d/%02d %02d:%02d:%02d\r\n",
    		1900+time.tm_year, time.tm_mon+1, time.tm_mday,
    		time.tm_hour, time.tm_min, time.tm_sec);
    
    	close(fd);
    
    	return 0;
    }
    728x90

    댓글

Designed by Tistory.