[Linux] RTC 读写指令及测试程序
CPU:RK3288
系统:Linux
IC:hym8563
在 Linux 系统中,指令 date 和 hwclock 都可以读写时间
date:读写系统时间,写时间需要管理员权限
hwclock:读写硬件时间,也就是 rtc 模块的时间,读写都必须有管理员权限
// 读取当前系统时间 $ date Thu Oct 24 03:03:13 UTC 2019 // 普通用户设置时间失败 $ date 102411032019.00 date: cannot set date: Operation not permitted Thu Oct 24 11:03:00 UTC 2019 // 超级用户设置时间成功,格式:月日时分年.秒 $ sudo date 102411032019.00 Thu Oct 24 11:03:00 UTC 2019 // 读取当前系统时间,确认时间设置成功 // 小时与设置的11点不同,这是由于时区造成的 $ date Thu Oct 24 03:03:38 UTC 2019
设置时区的问题,请参考:[Linux] 通过指令修改时区 tzselect
$ date Thu Oct 24 14:22:50 CST 2019 // 查看硬件时间 $ sudo hwclock Thu 24 Oct 2019 02:22:54 PM CST .744709 seconds // 查看硬件时间 $ sudo hwclock -r Thu 24 Oct 2019 02:22:54 PM CST .744709 seconds // 查看硬件时间 $ sudo hwclock -show Thu 24 Oct 2019 02:22:54 PM CST .744709 seconds // 修改硬件时间,与系统时间相同 $ sudo hwclock -w // 修改系统时间,与硬件时间相同 $ sudo hwclock -w
rtc 测试 demo:
#include <stdio.h> #include <stdlib.h> #include <linux/rtc.h> #include <sys/ioctl.h> #include <sys/time.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <errno.h> #include <time.h> int main(int argc, char *argv[]) { int fd, retval; struct rtc_time rtc_tm; time_t timep; struct tm *p; fd = open("/dev/rtc", O_RDONLY); if (fd == -1) { fprintf(stderr, "open /dev/rtc error\n"); exit(errno); } /* Read the RTC time/date */ retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); if (retval == -1) { perror("ioctl"); exit(errno); } fprintf(stderr, "RTC date/time: %d/%d/%d %02d:%02d:%02d\n", rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); time(&timep); p = gmtime(&timep); fprintf(stderr, "OS date/time(UTC): %d/%d/%d %02d:%02d:%02d\n", p->tm_mday, p->tm_mon + 1, p->tm_year + 1900, p->tm_hour, p->tm_min, p->tm_sec); p = localtime(&timep); fprintf(stderr, "OS date/time(Local): %d/%d/%d %02d:%02d:%02d\n", p->tm_mday, p->tm_mon + 1, p->tm_year + 1900, p->tm_hour, p->tm_min, p->tm_sec); rtc_tm.tm_mday = 15; rtc_tm.tm_mon = 11; rtc_tm.tm_hour = 15; rtc_tm.tm_min = 15; retval = ioctl(fd, RTC_SET_TIME, &rtc_tm); if (retval == -1) { perror("ioctl"); exit(errno); } /* Write the RTC time/date */ retval = ioctl(fd, RTC_RD_TIME, &rtc_tm); if (retval == -1) { perror("ioctl"); exit(errno); } fprintf(stderr, "RTC date/time: %d/%d/%d %02d:%02d:%02d\n", rtc_tm.tm_mday, rtc_tm.tm_mon + 1, rtc_tm.tm_year + 1900, rtc_tm.tm_hour, rtc_tm.tm_min, rtc_tm.tm_sec); time(&timep); p = gmtime(&timep); fprintf(stderr, "OS date/time(UTC): %d/%d/%d %02d:%02d:%02d\n", p->tm_mday, p->tm_mon + 1, p->tm_year + 1900, p->tm_hour, p->tm_min, p->tm_sec); p = localtime(&timep); fprintf(stderr, "OS date/time(Local): %d/%d/%d %02d:%02d:%02d\n", p->tm_mday, p->tm_mon + 1, p->tm_year + 1900, p->tm_hour, p->tm_min, p->tm_sec); close(fd); return 0; }
参考:https://blog.csdn.net/u010703935/article/details/11728091