开发板上同步系统时间和RTC时间

1.查看系统时间

date

2.查看RTC时间

  由于不同的RTC驱动读取时间的方法不一样。我这边使用的是hi_rtc。是使用海思中自动的测试程序。

./tim  -g  time

3.系统时间同步成RTC时间

hwclock –r         显示硬件时钟与日期

hwclock –s         将系统时钟调整为与目前的硬件时钟一致。

hwclock –w        将硬件时钟调整为与目前的系统时钟一致。

  但是我使用相关命令会出现:

   提示找不到相对应的设备节点。

  因为我的设备节点是加载在/dev/hi_rtc中,所以通用的这个是不行了。

  利用mktime和settimeofday的直接在读取RTC时间时,将RTC时间再通过这两个函数再写入到系统时间中。

mktime函数:

  C 库函数 time_t mktime(struct tm *timeptr) 把 timeptr 所指向的结构转换为一个依据本地时区的 time_t 值。

#include <time.h>

time_t mktime(struct tm *timeptr)

参数:
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;       /* 夏令时                        */    
};

返回值:
该函数返回一个 time_t 值,该值对应于以参数传递的日历时间。如果发生错误,则返回 -1 值。

  作用是,将时间转换为自1900年1月1日以来持续时间的秒数,发生错误时返回-1。(注意这边是自1900的1月份)

settimeofday函数:

#include<sys/time.h>
#include<unistd.h>

int settimeofday ( const struct timeval *tv,const struct timezone *tz);

参数:
struct  timeval{
       long  tv_sec;/**/
       long  tv_usec;/*微妙*/
};

struct  timezone{
        int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
        int tz_dsttime;/*type of DST correction*/

}

返回值:函数执行成功后返回0,失败后返回-1,错误代码存于errno中。

4.实例

    struct tm tm_time;
    struct timeval val_time;

//读取RTC时间,放在结构体变量tm中
        ret = ioctl(fd, HI_RTC_RD_TIME, &tm);

    printf("year %d\n", tm.year);
    printf("month %d\n", tm.month);
    printf("date %d\n", tm.date);
    printf("hour %d\n", tm.hour);
    printf("minute %d\n", tm.minute);
    printf("second %d\n", tm.second);
    printf("weekday %d\n", tm.weekday);

        tm_time.tm_year        = tm.year - 1900;
        tm_time.tm_mon        = tm.month -1;
        tm_time.tm_mday        = tm.date;
        tm_time.tm_hour        = tm.hour;
        tm_time.tm_min        = tm.minute;
        tm_time.tm_sec        = tm.second;
        tm_time.tm_wday        = tm.weekday;
        
        val_time.tv_sec   = mktime(&tm_time);
        val_time.tv_usec        = 0;
        settimeofday(&val_time,NULL);

猜你喜欢

转载自www.cnblogs.com/zhuangquan/p/12053385.html