调试经验--时间
系统时间是很重要的,也是很基础的,然而这么基础的时间上,也会出现多种问题:
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,计算需要校准的值,添加测试程序中的校准功能,编译运行。
原文:http://blog.csdn.net/lintax/article/details/18968409