应用程序测试(应用测试是指什么)


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使用

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ3361245237,本站将立刻清除。