• 正文
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

ZLG嵌入式筆記(連載06) | Linux的RTC回到了1970年,是時(shí)光倒流了么?

2024/12/17
2184
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

RTC是一種用于記錄時(shí)間的電子設(shè)備,廣泛應(yīng)用于各種嵌入式系統(tǒng)中。本文通過(guò)實(shí)際案例分析RTC在實(shí)際應(yīng)用中的問(wèn)題并給出實(shí)際建議,如時(shí)間“歸零”、RTC時(shí)間誤差過(guò)大等。

RTC (Real Time Clock):實(shí)時(shí)時(shí)鐘,是一個(gè)獨(dú)立的定時(shí)器,無(wú)論器件處于運(yùn)行模式、低功耗模式還是復(fù)位狀態(tài),只要電源電壓保持在工作范圍內(nèi),RTC就會(huì)一直工作,實(shí)現(xiàn)計(jì)時(shí)功能。RTC電路雖然簡(jiǎn)單,但實(shí)際應(yīng)用中還是會(huì)出現(xiàn)一些問(wèn)題,例如時(shí)間“歸零”、RTC時(shí)間誤差過(guò)大等等,既涉及到硬件方面,也涉及到軟件方面。下面結(jié)合實(shí)際遇到的問(wèn)題進(jìn)行一些方案討論和建議。

另外,在32位Linux系統(tǒng)上,不可避免的會(huì)遇到2038年問(wèn)題,也放在這里一并闡述。

從倉(cāng)庫(kù)發(fā)貨的全新產(chǎn)品,為何RTC時(shí)間是1970年?

全新產(chǎn)品,開(kāi)機(jī)后系統(tǒng)時(shí)間是1970年,有兩種可能性:

產(chǎn)品RTC電池沒(méi)有正確安裝,或者鋰電池與電池倉(cāng)之間的隔離塑料墊片沒(méi)有去掉,RTC沒(méi)電不工作。

安裝了RTC電池,但RTC電池已經(jīng)被耗盡,這情況一般出現(xiàn)在較長(zhǎng)時(shí)間庫(kù)存產(chǎn)品上。

提示:RTC獨(dú)立供電的產(chǎn)品,使用前必須正確安裝RTC電池,并在第一次開(kāi)機(jī)的時(shí)候設(shè)置正確的RTC時(shí)間。庫(kù)存產(chǎn)品,不安裝RTC電池,或者在安裝電池時(shí)做好供電隔離。

產(chǎn)品運(yùn)行一段時(shí)間后,RTC變成1970年了,引起程序運(yùn)行異常

正常運(yùn)行的系統(tǒng),經(jīng)過(guò)一段時(shí)間后內(nèi)核出現(xiàn)如下提示:

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

說(shuō)明RTC電池電壓已經(jīng)偏低。這樣會(huì)導(dǎo)致RTC時(shí)間不可靠,從而影響到Linux系統(tǒng)時(shí)間的準(zhǔn)確性。

PCF8563芯片具有電池電壓檢測(cè)功能,當(dāng)電壓低于0.9V時(shí)將無(wú)法保證時(shí)鐘信息的準(zhǔn)確性(參考圖1),進(jìn)而導(dǎo)致系統(tǒng)運(yùn)行異常。

圖1 PCF8563?RTC芯片低壓檢測(cè)功能為了避免出現(xiàn)RTC電池電壓偏低的情況,可以做如下方面的考慮:

    可考慮用可充電的RTC電池,并設(shè)計(jì)充電電路;關(guān)閉RTC芯片的CLKOUT功能,降低RTC功耗,延長(zhǎng)RTC電池續(xù)航時(shí)間;增加超級(jí)電容,正常上電時(shí)由系統(tǒng)電源供電,系統(tǒng)掉電后由超級(jí)電容供電,超級(jí)電容耗盡再用鋰電池供電。

圖2是RTC多電源供電參考原理圖。

圖2 RTC多電源供電參考原理圖

設(shè)計(jì)時(shí)需注意以下幾點(diǎn):

RTC_VDD 僅供電給時(shí)鐘芯片的VDD引腳

RTC_VDD供電線路上使用的二極管選型低壓降、低漏電流;

I2C 上拉電阻使用系統(tǒng)電源;

預(yù)留CLKOUT 信號(hào)測(cè)試點(diǎn),用于調(diào)試時(shí)鐘精度,調(diào)試結(jié)束后關(guān)閉該功能可減少功耗。

讓人頭疼的“2038年”問(wèn)題

先介紹一下UNIX世界的時(shí)間,Unix紀(jì)元時(shí)間是從協(xié)調(diào)世界時(shí)(UTC)1970年1月1日0點(diǎn)開(kāi)始算起,到現(xiàn)在的總秒數(shù)。這個(gè)時(shí)間也被稱為POSIX時(shí)間。Linux沿用UNIX時(shí)間,在32位處理器的Linux系統(tǒng)里,定時(shí)器是32位的,最大計(jì)數(shù)是0xFFFFFFFF,而在Linux系統(tǒng)中,rtc_time定義的是秒、分、小時(shí)等都是有符號(hào)整數(shù)。

<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位定時(shí)器有符號(hào)整數(shù)最大計(jì)數(shù)為0x7FFFFFF,換算成十進(jìn)制是2147483647。

2147483647秒,換算成年的話,是68.09625973490614年,大概是68年零18天。所以,UNIX時(shí)間,從1970年1月1日零時(shí)起,經(jīng)過(guò)68年零18天后(確切是2038年1月19日中午11:14:07),計(jì)數(shù)器溢出,RTC將無(wú)法正常工作。在32位系統(tǒng)上解決這個(gè)問(wèn)題,需要升級(jí)到Linux內(nèi)核到高版本,同時(shí)升級(jí)glibc,工作量很大,對(duì)一些發(fā)布較久的處理器,原廠不一定能提供新版本內(nèi)核,這是很讓人頭疼的。如果選用選用64位處理器,跑64位Linux系統(tǒng)就沒(méi)這個(gè)問(wèn)題了。

升級(jí)到64位Linux系統(tǒng)后,RTC計(jì)數(shù)器最大值為0x7FFFFFFFFFFFFFFF,換算成十進(jìn)制是9223372036854775807。9223372036854775807秒,換算成年,大約是292億年,完全不用去考慮RTC時(shí)間溢出的問(wèn)題了。

ZLG創(chuàng)新性CPM核心板

RZ/G2UL、RZ/G2L處理器

1.0/1.2GHz主頻

Cortex?-A55+Cortex?-M33

參考價(jià)格:99元起

致遠(yuǎn)電子

致遠(yuǎn)電子

廣州致遠(yuǎn)電子股份有限公司成立于2001年,注冊(cè)資金5000萬(wàn)元,國(guó)家級(jí)高新技術(shù)認(rèn)證企業(yè),廣州市高端工控測(cè)量?jī)x器工程技術(shù)研究開(kāi)發(fā)中心,Intel ECA全球合作伙伴和微軟嵌入式系統(tǒng)金牌合作伙伴。

廣州致遠(yuǎn)電子股份有限公司成立于2001年,注冊(cè)資金5000萬(wàn)元,國(guó)家級(jí)高新技術(shù)認(rèn)證企業(yè),廣州市高端工控測(cè)量?jī)x器工程技術(shù)研究開(kāi)發(fā)中心,Intel ECA全球合作伙伴和微軟嵌入式系統(tǒng)金牌合作伙伴。收起

查看更多

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫(xiě)文章/發(fā)需求
立即登錄