RT-Thread中的RTC模块使用的时间戳类型time_t是有符号4字节32位的,时间戳会在 2038 年 1 月 19 日 03:14:07 UTC 溢出,现在是2025年,只要产品生命周期长一点,马上就2038年了,因此开发产品很可能需要考虑溢出问题。
为了防止时间戳溢出,有两个方案,一个是将time_t类型改成64位的,一个是将time_t改成32位无符号的,支持时间可以到2106年,完全够用。
先说将time_t类型改成64位的,首先将
改成
让 time_t 为64位。
接着 time.c 中所有 register
声明的变量都去掉 register
。
接着 drv_rtc.c
中rt_rtc_control
函数,rt_uint32_t
改成 time_t
:
set_rtc_time_stamp 函数有如下更改:
rtc.c 中调整 set_date 和 set_time 函数
以上,就可以支持64位了。
最大计到2160年(单片机外设限制)
将 timet改成32位 则在上述的基础上,将 `#define _TIME_T long改成
#define TIME_T unsigned long` 即可
我感觉动
time_t
的话,应该直接让开发工具链这边升级为64位的,不然那个time相关的C库函数都可能有问题。如果不方便动工具链的话,就不用C库,自己额外加一套小的time库。