色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux系統(tǒng)下時(shí)間的實(shí)現(xiàn)

          嵌入式Linux系統(tǒng)下時(shí)間的實(shí)現(xiàn)

          作者: 時(shí)間:2016-10-08 來源:網(wǎng)絡(luò) 收藏

          首先,明確一個(gè)問題:

          本文引用地址:http://cafeforensic.com/article/201610/305758.htm

          1、嵌入式系統(tǒng)板子上的時(shí)間是用date標(biāo)準(zhǔn)系統(tǒng)命令查看的,date是SHELL命令,例如busybox或者uClinux上的sash等。這個(gè)時(shí)間是有運(yùn)行起來的嵌入式LINUX軟件維護(hù)的,其實(shí)就是內(nèi)存中的一個(gè)全局變量,LINUX默認(rèn)啟動(dòng)給這個(gè)全局變量賦值就是19700101這樣的數(shù)值。

          2、RTC芯片(很多是嵌入式處理器內(nèi)置RTC模塊,那么就是CPU內(nèi)部寄存器)內(nèi)部的寄存器維護(hù)的時(shí)間值。

          一般的,LINUX啟動(dòng)后,您可以通過date命令來設(shè)置更改系統(tǒng)時(shí)間,但掉電就會(huì)丟失的,啟動(dòng)后又是1970這樣的時(shí)間了。若要能date設(shè)置后保存系統(tǒng)時(shí)間,使得在下次重啟后還能保持的話,就必須有RTC+后備電池 的軟硬件支持。

          例如,我們PC上可以設(shè)置系統(tǒng)時(shí)間,重啟后也不會(huì)丟失,就是因?yàn)槲覀働C主板上有RTC支持。

          RTC可以是外接的一個(gè)芯片,例如常見的X1226/1227等,它們就是通過I2C接到處理器上的。

          當(dāng)然,現(xiàn)在更多的情況是CPU內(nèi)置RTC模塊,這樣您硬件設(shè)計(jì)的話就只要提供后備電池即可。

          明確了系統(tǒng)時(shí)間的兩個(gè)概念后,我們來看看RTC的實(shí)現(xiàn)機(jī)制。

          在嵌入式系統(tǒng)上,實(shí)現(xiàn)的方法可以靈活多樣,只要能達(dá)到最終的目的:

          您可通過某種操作獲取當(dāng)前的正確的時(shí)間,而且重啟不會(huì)丟失。

          那么看看幾種實(shí)現(xiàn)機(jī)制。

          在開始介紹幾種方法前,我們先說明一下軟件時(shí)間的方式:

          我們的平臺(tái)是嵌入式LINUX,要實(shí)現(xiàn)RTC支持,則必須是“驅(qū)動(dòng)+應(yīng)用程序”的方式,而我們的驅(qū)動(dòng)都建議是采用MODULES方式獨(dú)立加載的方式,這樣可不影響整個(gè)LINUX內(nèi)核。

          下面開始介紹實(shí)現(xiàn)方法:

          從上面可以看到,時(shí)間實(shí)際上是兩個(gè)地方同時(shí)在維護(hù)的,一個(gè)是RTC芯片內(nèi)部寄存器或CPU的RTC寄存器;另一個(gè)則是LINUX維護(hù)的時(shí)間。LINUX的時(shí)間重啟就會(huì)丟失,而RTC由于有后備電池保護(hù),則不會(huì)丟失,在板子斷電后還可以繼續(xù)維持計(jì)時(shí)。所以,最好理解的實(shí)現(xiàn)方式就是讓LINUX內(nèi)核啟動(dòng)的時(shí)候,從RTC芯片里面讀取時(shí)間值,賦給LINUX的時(shí)間變量。這樣LINUX一啟動(dòng)時(shí)間就校正過來,不再是1970了。當(dāng)然,這樣做,就不能用獨(dú)立的RTC驅(qū)動(dòng)的MODULES形式了。而當(dāng)您通過date命令設(shè)置LINUX時(shí)間時(shí),您還要修改date命令的代碼,使之同時(shí)還要通過I2C修改RTC芯片內(nèi)部寄存器數(shù)值(或CPU內(nèi)部寄存器數(shù)值),當(dāng)然了,這樣還是需要一個(gè)讀寫RTC的驅(qū)動(dòng)的。

          下面則是一個(gè)更簡(jiǎn)化的實(shí)現(xiàn)方法

          即LINUX啟動(dòng)時(shí),不從RTC芯片里面讀取時(shí)間,而您直接修改date命令的代碼,讓它不要從LINUX提供的接口讀取,而是直接通過驅(qū)動(dòng)從RTC里面直接讀取。

          另外,如果您的系統(tǒng)允許的話,您都可以不走date的路線,即讀取系統(tǒng)時(shí)間不用date命令也可以,可以自己直接寫個(gè)讀取時(shí)間的函數(shù),例如read_rtc/write_rtc,就用這兩個(gè)函數(shù)取代date命令讀取和設(shè)置系統(tǒng)時(shí)間的功能。

          呵呵,寫了這么多,好像也沒說清楚,最后,大家記住:

          我們看到的時(shí)間,實(shí)際是在兩個(gè)不同的地方維護(hù)的

          一個(gè)是LINUX維護(hù)的,一個(gè)是RTC芯片里面的。

          這樣就存在一個(gè)兩個(gè)時(shí)間同步的問題,一個(gè)發(fā)生在LINUX啟動(dòng)的時(shí)候,需要從RTC里面獲取時(shí)間;另一個(gè)發(fā)生在您設(shè)置系統(tǒng)時(shí)間的時(shí)候,需要兩個(gè)同時(shí)更改。

          當(dāng)然了,中間一些貓膩就可以發(fā)生,例如您可以偷懶跳過LINUX時(shí)間,讓date或者您自己的代碼直接讀取RTC時(shí)間,而完全不理會(huì)LINUX的時(shí)間(還讓它是1970...吧)

          在ARM9實(shí)驗(yàn)箱等板子上,我們是通過修改busybox的date.c代碼來實(shí)現(xiàn)的的;而在HHGW-LITE-R3等HHPPC平臺(tái)上則是通過自己寫的writeRTC來作的。

          前一種方法改變了系統(tǒng)運(yùn)行方式,后一種則沒有把硬件時(shí)間同LINUX系統(tǒng)時(shí)間聯(lián)系起來。



          關(guān)鍵詞:

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉