调试经验--时间


调试经验--时间

 

系统时间是很重要的,也是很基础的,然而这么基础的时间上,也会出现多种问题:
1,时区不对;2,rtc时间与自然时间的差异;3,rtc的校准


一,时区不对

我们使用的时间为北京时间,即东八区,一些简化的文件系统上没有设置为东八区,则需要更改时区:

1,编辑启动配置:
vi /root/.profile
添加下面三行:
TZ='Asia/Shanghai'; export TZ
UTC=false; export UTC
ARC=false; export ARC

2,复制nfs文件系统中的  /usr/share/zoneinfo/Asia 到flash文件系统中,在flash文件系统中输入如下命令:
 rm -f /etc/localtime
 ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

3,在rc.local中添加:
hwclock --hctosys
 或者,在rcS.d中添加一个软链接到init.d 的hwclock.sh ,注意启动序号在mountall之后


验证:使用date查看当前时区,应该是 CST 。
注意:如果设备使用ntp对时服务器对时,如果是自己配置ntp服务器,也要注意将其时区配置为东八区。


二,rtc的月份、年份的表示,与结构体rtc_time的表示方法不一致,需要进行转换。
 rtc寄存器: 月:1-12,   年:0-99(例如2012年,2012-1900-100=12)         
 rtc_time:  月:0-11,  年:固定减去1900,例如2012年,2012-1900=112
 系统时间,以秒表示的,是以1970.1.1为起点,开始计算的。
  
 年份的偏移量不一定都使用100,保证年份值在0-99之间即可。同时不改变闰年情况。
 闰年规则:四年一闰,百年不闰,四百年再闰。

出错情况: 
 若月份没有做转换,则大小月份的最后一天,可能会出错。(恰好奇偶月份颠倒)
 若年份没有转换好,则在闰年时的2月份最后一天可能出错。

读写rtc寄存器注意: 
 设置rtc寄存器,往往是使用rtc_time进行设置时间的,需要做的是 rtc_time -> rtc
  即:月份加1,年份减100,然后写相应寄存器  
 读取rtc寄存器,往往是要组成rtc_time,需要做的是 rtc -> rtc_time
  即:月寄存器值减1后给月份赋值,年寄存器值加100后,给年份赋值。


三,在dm6446平台上进行RTC时钟校准:

rtc设置好初始时间后,运行几天,发现时间差了10多秒。查阅文档,才知道rtc有一个精度问题,且我们使用的rtc(FM3104)已经提供了时钟校准功能。下面简略记下了调试的过程:

1,参考busybox的hwclock源码,编写一个有对RTC的读写功能的测试程序。
2,利用测试程序,改动内核中rtc相关部分,通过调试信息来确认是哪些驱动代码在进行动作。
3,了解RTC结构,仔细阅读RTC_FM3104.pdf,看懂寄存器的功能。
4,在davinci-rtc.c中添加校准的函数rtc_cal_time(),在rtctime.c中rtc_ioctl()函数 的switch/case中添加相应的校准情况进行调用。
5,更新板卡的内核。
6,计算需要校准的值,添加测试程序中的校准功能,编译运行。

 

你可能感兴趣的:(linux,时间,时区,RTC,Davinci)