rtc简介
众所周知rtc是用来记录时间的,由于他有着独立电源的原因,当设备断电时rtc仍然可以正常工作,从而使系统启动时,系统时间通过读取rtc时间来更新时间。
问题产生
最近在使用过程中发现了一个问题,在设备断电的情况下,将rtc的电池扣出,在重新装上。
启动系统发现设备无法读取rtc时间,报错
ioctl(RTC_RD_TIME) to /dev/rtc0 to read the time failed: Invalid argument
问题排查
起初还以为是硬件问题,忙活了老半天,最后问了同事才知道,这块rtc无法设置和读取2000年之前的时间,让我往里面写一个2000年之后的时间试试看。
尝试过后问题解决。
-
为什么会这样
有些rtc的芯片厂商为了解决成本,考虑到年的时间变化是及其漫长的,他们把当前生产的设备做了一个假设,假设该设备存储的时间只在当前世纪范围内,这就是世纪窗口的假设
他们的实现方法有两种- . 一些寄存器表示时间的十位,一些寄存器表示时间的个位,而千位和百位永远是默认是2和0,这样rtc里面的时间就永远都在这个世纪窗口内。
- . 通过便宜量去实现,默认基础时间为2000,存储时间时,存储的并不是时间而是一个偏移量,但是该偏移量并没有考虑负值,因此2000年之前的时间操作都会导致失败
-
解决措施
我们可以修改一下我们的时间服务,给他一个2000年之后的默认时间,这样你的时间是在世纪窗口之内的,就不会再存在这个问题了。
目前笔者的逻辑是在时间服务里面如果读取rtc时间失败了,那么设置系统时间为2001年的某个时间,并将该时间写入rtc中。
之后再自主进行rtc时间的校准

5554

被折叠的 条评论
为什么被折叠?



