国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

新手學堂:嵌入式Linux系統(tǒng)下時間的實現(xiàn)

2024-06-28 13:03:53
字體:
來源:轉載
供稿:網友
 

首先,明確一個問題:

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

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

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

例如,我們PC上可以設置系統(tǒng)時間,重啟后也不會丟失,就是因為我們PC主板上有RTC支持。

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

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

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

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

您可通過某種操作獲取當前的正確的時間,而且重啟不會丟失。

那么看看幾種實現(xiàn)機制。

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

我們的平臺是嵌入式LINUX,要實現(xiàn)RTC支持,則必須是“驅動+應用程序”的方式,而我們的驅動都建議是采用MODULES方式獨立加載的方式,這樣可不影響整個LINUX內核。

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

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

下面則是一個更簡化的實現(xiàn)方法

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

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

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

我們看到的時間,實際是在兩個不同的地方維護的

一個是LINUX維護的,一個是RTC芯片里面的。

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

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

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

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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴化市| 庆阳市| 恩平市| 九龙城区| 永嘉县| 苍溪县| 葵青区| 宁蒗| 拉孜县| 台中县| 岗巴县| 清流县| 镶黄旗| 山东| 平利县| 岳阳市| 高邮市| 南开区| 双桥区| 射阳县| 厦门市| 汶川县| 昌黎县| 克山县| 攀枝花市| 西和县| 宁夏| 洛扎县| 承德县| 南华县| 渝北区| 安庆市| 通州市| 阿鲁科尔沁旗| 托里县| 广宁县| 定日县| 花莲市| 鄂托克前旗| 葵青区| 堆龙德庆县|