关于linux 下 rtc的问题,求高手解答

关于linux 下 rtc的问题,求高手解答,第1张

系统时间一般是保存在时钟寄存器中的,由于绝对时间值比较大,所腔做以寄存器中都是放一个相对时间值,即系统时间(日期+时间)减去一个固定的值(多数是1900年,也有的用1970年)后的秒数。取系统时间时会再把这个值加回来,从而得到真正的系统时间。

uboot中取时间的函数是将时钟寄存器中的值取出后,加上那个固定值(如1900年),直接返回,如果时间寄存器中放的是12年的秒数,在u-boot中就会显示是1912年。

linux kernel计算日期中有点不同,在算出年号后(加上1900年),接着判断,年号<=1969,再加上100,所以同样时间寄存器值将会校正为2012了。

你的系统显示不一致,可能原因是u-boot和伍森衡kernel源代码移植春判不完整,u-boot和kernel实时时钟的存储和计算策略不一致。

RTC(实时钟)借助电池供电,在系统掉电铅芹的情况下依然可以正常计时。它通常还具有产生周期性中断以及闹钟(Alarm〉中断槐尺毕的能困差力,是一种典型的字符设备。作为一种字符设备驱动,RTC需要有file_operations中接口函数的实现,如open () 、release () 、read () 、poll () 、ioctl ()等,而典型的IOCTL包括RTC_SET_TIME、RTC_ALM_READ、RTC_ALM_SET、RTC_IRQP_SET、RTC_IRQP_READ等,这些对于所有的RTC是通用的,只有底层的具体实现是与设备相关的。因此,drivers/rtc/tc-dev.c实现了RTC驱动通用的字符设备驱动层,它实现了file_opearations的成员函数以及一些通用的关于RTC的控制代码,并向底层导出rtc_device_register () 、rtc_device_unregister ()以注册和注销RTC导出rtc_class_ops结构体以描述底层的RTC硬件 *** 作。这个RTC通用层实现的结果是,底层的RTC驱动不再需要关心RTC作为字符设备驱动的具体实现,也无需关心一些通用的RTC控制逻辑。

a、mktime

头文件:#include <time.h>

函数:time_t mktime(struct tm *timeptr)

函数说明:培码mktime()用来将timeptr所指的tm结构体数据换成从高棚公元1970年1月1日0时0分0 秒算起至今的本地时间所经过的秒数。

返回值:返回经过的秒数。当发生错误的时候,返回-1。

b、settimeofday

头文件:#include <sys/time.h>

#include <unistd.h>

函数:int settimeofday(const struct timeval *tv,const struct timezone *tz)

函数说明:settimeofday()会把目前时间设成由tv所指的结构体信息,当地时区信息则设成tz所指的结构体配念哪。

返回值:只有root权限才能使用此函数修改时间。成功则返回0,失败返回-1,错误代码存于errno。

2、实践:

通过mktime和settimeofday配合使用,即可完成时间的写入。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12355255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存