您當前的位置:檢測資訊 > 科研開發
嘉峪檢測網 2025-03-17 09:09
1.RTC變成1970年的問題與解決方案
在某些嵌入式產品運行一段時間后,可能會出現RTC(Real-Time Clock)時間回退到1970年,導致程序運行異常。
這通常與RTC電池電壓過低有關,具體表現為內核日志提示類似以下內容:
rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable.
這表明RTC電池電壓偏低,無法保證時間的準確性,從而影響Linux系統的時間同步。
2.PCF8563 RTC芯片的低電壓檢測功能
PCF8563芯片具有低電壓檢測功能。
當檢測到RTC電池電壓低于0.9V時,芯片會標記時間數據為不可靠(參考圖1)。
這可能導致系統時間不同步甚至程序異常。
圖1 PCF8563 RTC芯片低壓檢測功能
為了避免此類問題,可從以下幾個方面進行改進和優化:
采用可充電RTC電池并設計充電電路,使用可充電電池代替一次性電池,并設計合適的充電電路,確保電池在設備運行時能夠得到持續補充電能。
關閉CLKOUT功能以降低功耗,CLKOUT是PCF8563的一個時鐘輸出功能,可能會消耗額外功率。在實際使用中,可通過配置寄存器關閉此功能,從而延長電池續航時間。
引入超級電容作為輔助電源,設計多電源供電方案,增加超級電容以提供短期供電:系統上電時由主電源供電。系統掉電后,超級電容供電;超級電容耗盡時,再切換到RTC電池供電。這種方案可以顯著減少對RTC電池的依賴。
3.RTC多電源供電參考設計
圖2 RTC多電源供電參考原理圖
設計時需要注意以下幾點:
RTC_VDD 專供時鐘芯片,RTC_VDD應僅連接到時鐘芯片的VDD引腳,以避免供電干擾。
選擇低壓降、低漏電流二極管,在RTC_VDD的供電線路上,二極管的壓降和漏電流直接影響供電效率和電池壽命,應優先選擇低損耗型號。
I²C 上拉電阻使用系統電源,RTC芯片的I²C總線需要使用系統主電源作為上拉電阻供電,避免增加RTC電池負擔。
預留CLKOUT調試測試點,CLKOUT信號可用于調試時鐘精度,在調試結束后關閉該功能以降低功耗。
4.UNIX系統中的“2038年問題”
問題背景
UNIX系統的時間以“Unix紀元時間”表示,即從協調世界時(UTC)1970年1月1日00:00:00開始累計的秒數。
這種時間表示方式被稱為POSIX時間,廣泛應用于Linux和其他系統。
在32位處理器的Linux系統中,rtc_time結構體使用有符號整數表示時間相關字段,如下所示:
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位整數的最大值為0x7FFFFFFF(即2147483647),其能表示的最大時間范圍約為68年零18天,從1970年1月1日開始計算,到2038年1月19日11:14:07。
屆時計數器溢出,將導致系統時間異常,影響RTC功能的正常運行。
解決方案
升級到高版本Linux內核與glibc,對于32位系統,可通過升級Linux內核和glibc庫以支持更大的時間范圍。然而,此方案工作量較大,且依賴于處理器廠商是否提供相應的內核支持。
遷移到64位系統,選用64位處理器并運行64位Linux系統是徹底解決問題的最佳方案。在64位系統中,POSIX時間由64位有符號整數表示,其最大值為0x7FFFFFFFFFFFFFFF(9223372036854775807秒),對應的時間范圍約為292億年,從根本上規避了時間溢出的問題。
來源:美男子玩編程