您當(dāng)前的位置:檢測資訊 > 科研開發(fā)
嘉峪檢測網(wǎng) 2025-03-17 09:09
1.RTC變成1970年的問題與解決方案
在某些嵌入式產(chǎn)品運(yùn)行一段時間后,可能會出現(xiàn)RTC(Real-Time Clock)時間回退到1970年,導(dǎo)致程序運(yùn)行異常。
這通常與RTC電池電壓過低有關(guān),具體表現(xiàn)為內(nèi)核日志提示類似以下內(nèi)容:
rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.
這表明RTC電池電壓偏低,無法保證時間的準(zhǔn)確性,從而影響Linux系統(tǒng)的時間同步。
2.PCF8563 RTC芯片的低電壓檢測功能
PCF8563芯片具有低電壓檢測功能。
當(dāng)檢測到RTC電池電壓低于0.9V時,芯片會標(biāo)記時間數(shù)據(jù)為不可靠(參考圖1)。
這可能導(dǎo)致系統(tǒng)時間不同步甚至程序異常。

圖1 PCF8563 RTC芯片低壓檢測功能
為了避免此類問題,可從以下幾個方面進(jìn)行改進(jìn)和優(yōu)化:
采用可充電RTC電池并設(shè)計充電電路,使用可充電電池代替一次性電池,并設(shè)計合適的充電電路,確保電池在設(shè)備運(yùn)行時能夠得到持續(xù)補(bǔ)充電能。
關(guān)閉CLKOUT功能以降低功耗,CLKOUT是PCF8563的一個時鐘輸出功能,可能會消耗額外功率。在實際使用中,可通過配置寄存器關(guān)閉此功能,從而延長電池續(xù)航時間。
引入超級電容作為輔助電源,設(shè)計多電源供電方案,增加超級電容以提供短期供電:系統(tǒng)上電時由主電源供電。系統(tǒng)掉電后,超級電容供電;超級電容耗盡時,再切換到RTC電池供電。這種方案可以顯著減少對RTC電池的依賴。
3.RTC多電源供電參考設(shè)計

圖2 RTC多電源供電參考原理圖
設(shè)計時需要注意以下幾點:
RTC_VDD 專供時鐘芯片,RTC_VDD應(yīng)僅連接到時鐘芯片的VDD引腳,以避免供電干擾。
選擇低壓降、低漏電流二極管,在RTC_VDD的供電線路上,二極管的壓降和漏電流直接影響供電效率和電池壽命,應(yīng)優(yōu)先選擇低損耗型號。
I²C 上拉電阻使用系統(tǒng)電源,RTC芯片的I²C總線需要使用系統(tǒng)主電源作為上拉電阻供電,避免增加RTC電池負(fù)擔(dān)。
預(yù)留CLKOUT調(diào)試測試點,CLKOUT信號可用于調(diào)試時鐘精度,在調(diào)試結(jié)束后關(guān)閉該功能以降低功耗。
4.UNIX系統(tǒng)中的“2038年問題”
問題背景
UNIX系統(tǒng)的時間以“Unix紀(jì)元時間”表示,即從協(xié)調(diào)世界時(UTC)1970年1月1日00:00:00開始累計的秒數(shù)。
這種時間表示方式被稱為POSIX時間,廣泛應(yīng)用于Linux和其他系統(tǒng)。
在32位處理器的Linux系統(tǒng)中,rtc_time結(jié)構(gòu)體使用有符號整數(shù)表示時間相關(guān)字段,如下所示:
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位整數(shù)的最大值為0x7FFFFFFF(即2147483647),其能表示的最大時間范圍約為68年零18天,從1970年1月1日開始計算,到2038年1月19日11:14:07。
屆時計數(shù)器溢出,將導(dǎo)致系統(tǒng)時間異常,影響RTC功能的正常運(yùn)行。
解決方案
升級到高版本Linux內(nèi)核與glibc,對于32位系統(tǒng),可通過升級Linux內(nèi)核和glibc庫以支持更大的時間范圍。然而,此方案工作量較大,且依賴于處理器廠商是否提供相應(yīng)的內(nèi)核支持。
遷移到64位系統(tǒng),選用64位處理器并運(yùn)行64位Linux系統(tǒng)是徹底解決問題的最佳方案。在64位系統(tǒng)中,POSIX時間由64位有符號整數(shù)表示,其最大值為0x7FFFFFFFFFFFFFFF(9223372036854775807秒),對應(yīng)的時間范圍約為292億年,從根本上規(guī)避了時間溢出的問題。

來源:美男子玩編程