应用程序测试(应用测试是指什么)
timer=时间数值时,用于设置日历时间;
如果 timer不为空,则返回值也存储在变量 timer中。
函数返回: 当前日历时间
time_t是一个unsigned long类型。
struct tm *gmtime(const time_t *timer)
函数功能: 使用 timer 的值来填充 tm 结构应用程序测试,并用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。
返回值:该函数返回指向 tm 结构的指针,该结构带有被填充的时间信息。
struct tm
{
int tm_sec; /* 秒,范围从 0 到 59 */
int tm_min; /* 分,范围从 0 到 59 */
int tm_hour; /* 小时,范围从 0 到 23 */
int tm_mday; /* 一月中的第几天,范围从 1 到 31 */
int tm_mon; /* 月,范围从 0 到 11(注意) */
int tm_year; /* 自 1900 年起的年数 */
int tm_wday; /* 一周中的第几天,范围从 0 到 6 */
int tm_yday; /* 一年中的第几天,范围从 0 到 365 */
int tm_isdst; /* 夏令时 */
};
struct tm *localtime(const time_t *timer)
返回值:该函数返回指向 tm 结构的指针,该结构带有被填充的时间信息。
二、RTC应用层测试代码
读取RTC时钟时间需要使用ioctl函数参数为 RTC_RD_TIME应用程序测试,写RTC时钟使用ioctl函数参数为 RTC_SET_TIME,具体可参考代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
int fd, retval;
struct rtc_time rtc_tm;
time_t timep;
struct tm *p;
fd = open("/dev/rtc0", O_RDONLY);
if (fd == -1) {
perror("open /dev/rtc error");
exit(errno);
}
/* Read the RTC time/date */
retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
if (retval == -1) {
perror("ioctl RTC_RD_TIME error");
exit(errno);
}
printf("RTC date/time: %d/%d/%d d:d:dn",
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);
printf("OS date/time(UTC): %d/%d/%d d:d:dn",
p->tm_mday, p->tm_mon + 1, p->tm_year + 1900,
p->tm_hour, p->tm_min, p->tm_sec);
p = localtime(&timep);
printf("OS date/time(Local): %d/%d/%d d:d:dn",
p->tm_mday, p->tm_mon + 1, p->tm_year + 1900,
p->tm_hour, p->tm_min, p->tm_sec);
rtc_tm.tm_mday = 1;
rtc_tm.tm_mon = 10;
rtc_tm.tm_hour = 21;
rtc_tm.tm_min = 30;
rtc_tm.tm_year = 121;
retval = ioctl(fd, RTC_SET_TIME, &rtc_tm);
if (retval == -1) {
perror("ioctl RTC_SET_TIME error");
exit(errno);
}
/* Write the RTC time/date */
retval = ioctl(fd, RTC_RD_TIME, &rtc_tm);
if (retval == -1) {
perror("ioctl RTC_RD_TIME error after write");
exit(errno);
}
printf("RTC date/time: %d/%d/%d d:d:dn",
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);
printf("OS date/time(UTC): %d/%d/%d d:d:dn",
p->tm_mday, p->tm_mon + 1, p->tm_year + 1900,
p->tm_hour, p->tm_min, p->tm_sec);
p = localtime(&timep);
printf("OS date/time(Local): %d/%d/%d d:d:dn",
p->tm_mday, p->tm_mon + 1, p->tm_year + 1900,
p->tm_hour, p->tm_min, p->tm_sec);
close(fd);
return 0;
}
三、实例测试
将测试代码编译成rtc_app并运行,打印如下:
[root:/mnt]# ./rtc_app
RTC date/time: 1/12/1970 21:36:45
OS date/time(UTC): 1/1/1970 00:09:49
OS date/time(Local): 1/1/1970 00:09:49
RTC date/time: 1/11/2021 21:30:45
OS date/time(UTC): 1/1/1970 00:09:49
OS date/time(Local): 1/1/1970 00:09:49
可以看到刚开机RTC时间为1970年,后面程序使用ioctl函数设置后再读出来变为2021年。
在系统中使用date指令和hwclock测试
[root:/mnt]# date
Thu Jan 1 00:12:23 UTC 1970
[root:/mnt]# hwclock
Mon Nov 1 21:33:27 2021 0.000000 seconds
在 Linux 系统中,指令 date 和 hwclock 都可以读写时间,date读写系统时间,写时间需要管理员权限,hwclock读写硬件时间,也就是 rtc 模块的时间,读写都必须有管理员权限。我们通过上面的打印可以看到—使用ioctl函数设置RTC时钟,hwclock读出来的硬件时间发生变化,但是系统时间还是1970年并未被同步。
本文介绍了应用层RTC使用,对于应用层timer使用感兴趣的可以看下Linux应用层定时器timer使用
文章评论(0)