加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

ZLG嵌入式笔记(连载06) | Linux的RTC回到了1970年,是时光倒流了么?

2小时前
200
阅读需 7 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

RTC是一种用于记录时间的电子设备,广泛应用于各种嵌入式系统中。本文通过实际案例分析RTC在实际应用中的问题并给出实际建议,如时间“归零”、RTC时间误差过大等。

RTC (Real Time Clock):实时时钟,是一个独立的定时器,无论器件处于运行模式、低功耗模式还是复位状态,只要电源电压保持在工作范围内,RTC就会一直工作,实现计时功能。RTC电路虽然简单,但实际应用中还是会出现一些问题,例如时间“归零”、RTC时间误差过大等等,既涉及到硬件方面,也涉及到软件方面。下面结合实际遇到的问题进行一些方案讨论和建议。

另外,在32位Linux系统上,不可避免的会遇到2038年问题,也放在这里一并阐述。

从仓库发货的全新产品,为何RTC时间是1970年?

全新产品,开机后系统时间是1970年,有两种可能性:

产品RTC电池没有正确安装,或者锂电池与电池仓之间的隔离塑料垫片没有去掉,RTC没电不工作。

安装了RTC电池,但RTC电池已经被耗尽,这情况一般出现在较长时间库存产品上。

提示:RTC独立供电的产品,使用前必须正确安装RTC电池,并在第一次开机的时候设置正确的RTC时间。库存产品,不安装RTC电池,或者在安装电池时做好供电隔离。

产品运行一段时间后,RTC变成1970年了,引起程序运行异常

正常运行的系统,经过一段时间后内核出现如下提示:

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.

说明RTC电池电压已经偏低。这样会导致RTC时间不可靠,从而影响到Linux系统时间的准确性。

PCF8563芯片具有电池电压检测功能,当电压低于0.9V时将无法保证时钟信息的准确性(参考图1),进而导致系统运行异常。

图1 PCF8563 RTC芯片低压检测功能为了避免出现RTC电池电压偏低的情况,可以做如下方面的考虑:

    可考虑用可充电的RTC电池,并设计充电电路;关闭RTC芯片的CLKOUT功能,降低RTC功耗,延长RTC电池续航时间;增加超级电容,正常上电时由系统电源供电,系统掉电后由超级电容供电,超级电容耗尽再用锂电池供电。

图2是RTC多电源供电参考原理图

图2 RTC多电源供电参考原理图

设计时需注意以下几点:

RTC_VDD 仅供电给时钟芯片的VDD引脚

RTC_VDD供电线路上使用的二极管选型低压降、低漏电流

I2C 上拉电阻使用系统电源;

预留CLKOUT 信号测试点,用于调试时钟精度,调试结束后关闭该功能可减少功耗。

让人头疼的“2038年”问题

先介绍一下UNIX世界的时间,Unix纪元时间是从协调世界时(UTC)1970年1月1日0点开始算起,到现在的总秒数。这个时间也被称为POSIX时间。Linux沿用UNIX时间,在32位处理器的Linux系统里,定时器是32位的,最大计数是0xFFFFFFFF,而在Linux系统中,rtc_time定义的是秒、分、小时等都是有符号整数。

<uapi/linux/rtc.h>

struct rtc_time {        int tm_sec;        int tm_min;        int tm_hour;        int tm_mday;        int tm_mon;        int tm_year;        int tm_wday;        int tm_yday;        int tm_isdst;};

32位定时器有符号整数最大计数为0x7FFFFFF,换算成十进制是2147483647。

2147483647秒,换算成年的话,是68.09625973490614年,大概是68年零18天。所以,UNIX时间,从1970年1月1日零时起,经过68年零18天后(确切是2038年1月19日中午11:14:07),计数器溢出,RTC将无法正常工作。在32位系统上解决这个问题,需要升级到Linux内核到高版本,同时升级glibc,工作量很大,对一些发布较久的处理器,原厂不一定能提供新版本内核,这是很让人头疼的。如果选用选用64位处理器,跑64位Linux系统就没这个问题了。

升级到64位Linux系统后,RTC计数器最大值为0x7FFFFFFFFFFFFFFF,换算成十进制是9223372036854775807。9223372036854775807秒,换算成年,大约是292亿年,完全不用去考虑RTC时间溢出的问题了。

ZLG创新性CPM核心板

RZ/G2UL、RZ/G2L处理器

1.0/1.2GHz主频

Cortex®-A55+Cortex®-M33

参考价格:99元起

致远电子

致远电子

广州致远电子股份有限公司成立于2001年,注册资金5000万元,国家级高新技术认证企业,广州市高端工控测量仪器工程技术研究开发中心,Intel ECA全球合作伙伴和微软嵌入式系统金牌合作伙伴。

广州致远电子股份有限公司成立于2001年,注册资金5000万元,国家级高新技术认证企业,广州市高端工控测量仪器工程技术研究开发中心,Intel ECA全球合作伙伴和微软嵌入式系统金牌合作伙伴。收起

查看更多

相关推荐

电子产业图谱