嵌入式文件系統(tǒng)介紹
嵌入式文件系統(tǒng)是指嵌入式系統(tǒng)中實現(xiàn)文件存取、管理等功能的模塊,提供一系列文件輸入輸出等文件管理功能,為嵌入式系統(tǒng)和設(shè)備提供文件系統(tǒng)支持。在嵌入式系統(tǒng)中,應(yīng)用程序通常需要對信息進(jìn)行存取操作,當(dāng)任務(wù)運行的時候,任務(wù)可以在其任務(wù)堆棧中存放少量信息,但是存儲量要受到內(nèi)存空間的嚴(yán)格限制,而且在內(nèi)存空間中的信息隨著任務(wù)的退出而消失,不適于存放要長期保存的信息。另一方面,一些公共信息為多個任務(wù)所共享,需要這些信息獨立于具體的任務(wù)而存在。
嵌入式系統(tǒng)和桌面系統(tǒng)一樣,為用戶提供文件系統(tǒng)以方便信息的處理。嵌。入式文件系統(tǒng)以普通桌面操作系統(tǒng)的文件系統(tǒng)為基礎(chǔ)發(fā)展而來,但兩種文件系統(tǒng)的應(yīng)用環(huán)境和自身的要求又有很大的不同:在普通桌面操作系統(tǒng)中,文件系統(tǒng)不僅要管理文件,提供文件系統(tǒng)調(diào)用API,還要管理各種設(shè)備,支持對設(shè)備和文件操作的一致性。而在嵌入式文件系統(tǒng)中,由于大部分嵌入式系統(tǒng)都是針對特殊目的定制的,因而對嵌入式操作系統(tǒng)的系統(tǒng)功能的模塊化和可裁減性提出了更高的要求。
嵌入式系統(tǒng)的應(yīng)用條件往往比桌面計算機惡劣的多,在惡劣使用環(huán)境下系統(tǒng)的穩(wěn)定性、安全性還要得到足夠的保障,通用的文件系統(tǒng)對于可靠性和文件系統(tǒng)自身的安全性并沒有特殊的保障機制,因此無法保證這些性能。所以,雖然有許多已經(jīng)較為成熟的桌面操作系統(tǒng)下的文件系統(tǒng),如DOS下的FAT文件系統(tǒng)、WINDOWS NT下的NTFS文件系統(tǒng)以及UNⅨ下的inocde文件系統(tǒng)等,但這些文件系統(tǒng)都不能直接適用于嵌入式系統(tǒng)。要想適用于嵌入式系統(tǒng),必須進(jìn)行重新設(shè)計。嵌入式文件系統(tǒng)應(yīng)該借鑒成熟的桌面文件系統(tǒng),并且進(jìn)一步根據(jù)具體的硬件環(huán)境以及應(yīng)用需求來設(shè)計文件系統(tǒng)的體系結(jié)構(gòu)和實現(xiàn)方法。嵌入式文件系統(tǒng)作為嵌入式操作系統(tǒng)的重要組成部分,對于實現(xiàn)嵌入式系統(tǒng)中大量數(shù)據(jù)的存儲和各種操作的管理,有著不可替代的作用。
嵌入式文件系統(tǒng)雖然繼承了通用文件系統(tǒng)的組織結(jié)構(gòu),但由于功能和作用與普通桌面操作系統(tǒng)的文件系統(tǒng)不同,同時又有自己的特點:
在嵌入式系統(tǒng)中,文件系統(tǒng)是嵌入式系統(tǒng)的一個組成模塊。它是作為系統(tǒng)的一個可加載選項提供給用戶,由用戶決定是否需要加載它。
需要滿足結(jié)構(gòu)緊湊、代碼量小的特點,合理地對文件存儲器進(jìn)行管理。嵌入式系統(tǒng)中的文件存儲器空間相對不會太大,必須對其進(jìn)行高效的管理,以避免對資源的浪費。
使用簡單便捷。用戶只要知道文件名、文件路徑等簡單信息特征,就可以方便地對文件進(jìn)行操作,不必知道文件在具體物理存儲空間的運作過程。
安全可靠。對文件、數(shù)據(jù)的保護(hù)是文件系統(tǒng)的基本功能。嵌入式系統(tǒng)的應(yīng)用通常要求系統(tǒng)必須有較高的可靠性。
支持多種存儲設(shè)備、可伸縮、可剪裁、可移植等特點。嵌入式應(yīng)用的領(lǐng)域相當(dāng)廣泛,其采用的硬件環(huán)境和操作系統(tǒng)也各不相同。為了適應(yīng)這種差異性,文件系統(tǒng)應(yīng)降低對具體硬件環(huán)境和操作系統(tǒng)的依賴,具備良好的可移植性。
為滿足嵌入式環(huán)境中文件系統(tǒng)精準(zhǔn)的提供時間功能,使存儲在外部介質(zhì)SD卡中的文件包含創(chuàng)建、修改、訪問等詳細(xì)時間信息,提出采用高精度實時時鐘芯片 DS3231為文件系統(tǒng)提供連續(xù)精準(zhǔn)的時間信息的解決方案。介紹了 SD 卡存儲結(jié)構(gòu),詳細(xì)探討了 FAT32文件系統(tǒng)在嵌入式環(huán)境中的移植方法,設(shè)計了 DS3231與 C8051F500單片機進(jìn)行通信時的硬件接口連接,通過I2C總線實現(xiàn)對 DS3231時間信息的讀寫。系統(tǒng)測試表明,DS3231能夠連續(xù)不斷地給嵌入式文件系統(tǒng)提供精準(zhǔn)時間信息。
DS3231支持I2C總線協(xié)議
DS3231支持雙向I2C總線和數(shù)據(jù)傳輸協(xié)議。I2C總線控制系統(tǒng)中,控制信號發(fā)送與接受的設(shè)備稱為主設(shè)備,由主設(shè)備控制的設(shè)備為從設(shè)備。主設(shè)備來控制產(chǎn)生串行時鐘SCL,總線訪問,以及來產(chǎn)生START和STOP的條件。[1]
DS3231在I2C總線上是作為從設(shè)備來工作的,同時DS3231還支持兩種頻率模式的工作,分別為標(biāo)準(zhǔn)模式(時鐘頻率100KHz)和快速模式(時鐘頻率400KHz)。
下面是總線條件:
開始條件:當(dāng)SCL處于高電平時,SDA由高電平變成低電平時構(gòu)成一個開始條件; 停止條件:當(dāng)SCL處于高電平時,SDA由低電平變成高電平時構(gòu)成一個停止條件; 數(shù)據(jù)傳輸:產(chǎn)生在開始條件之后,如果時鐘信號為高電平期間數(shù)據(jù)保持穩(wěn)定,則此時數(shù)據(jù)線狀態(tài)代表有效數(shù)據(jù),數(shù)據(jù)必須在時鐘信號為低電平期間改變。
應(yīng)答:數(shù)據(jù)傳輸以8位序列進(jìn)行,DS3231在第九個時鐘周期時將SDA置位為低電平,即送出一個確認(rèn)信號,表明數(shù)據(jù)已經(jīng)被收到。
DS3231在嵌入式環(huán)境文件系統(tǒng)中的應(yīng)用
艦船自動舵參數(shù)采集傳輸系統(tǒng)設(shè)計中,大量的自動舵參數(shù)數(shù)據(jù)都存儲在外部介質(zhì)SD卡中。為使存儲的采集數(shù)據(jù)可直接在PC機上讀取、處理,需要使用文件系統(tǒng)組織數(shù)據(jù)格式。文件系統(tǒng)是操作系統(tǒng)用于明確磁盤或分區(qū)上文件的方法和數(shù)據(jù)結(jié)構(gòu),是對文件的管理規(guī)則,也是操作系統(tǒng)的重要組成部分,而操作系統(tǒng)對處理器要求比較高,且占用一定的存儲空間,艦舵參數(shù)采集系統(tǒng)微處理器C8051F500沒有操作系統(tǒng),這就需要在SD卡上建立文件系統(tǒng)。而建立文件系統(tǒng)就需要實時時鐘來管理數(shù)據(jù)文件的創(chuàng)建、修改、訪問等詳細(xì)時間信息。
通常用的單片機沒有實時時鐘部件,如果需要此功能就得使用定時器來實現(xiàn),而一旦系統(tǒng)掉電時鐘就不能運行,嵌入式文件系統(tǒng)就沒有了時鐘,這與設(shè)計要求不相符。高精度實時時鐘芯片DS3231不僅能夠在一定溫度范圍內(nèi)提供優(yōu)于2min/年的計時精度,而且包含電池輸入端,斷開主電源仍然可以保持精確計時。因此,本文提出通過DS3231時鐘芯片連續(xù)不斷地給嵌入式文件系統(tǒng)提供實時時鐘的方案。
存儲系統(tǒng)結(jié)構(gòu)
SD卡存儲系統(tǒng)結(jié)構(gòu)如圖1所示,C8051F500單片機是主控芯片,通過SPI接口與SD卡實現(xiàn)數(shù)據(jù)通信,采集的數(shù)據(jù)在FAT32文件系統(tǒng)管理下,以文件形式存儲于SD卡中,如.txt、.doc、.dat等。
FAT32文件系統(tǒng)的實現(xiàn)
目前常用的文件系統(tǒng)有兩類:基于微軟Windows操作系統(tǒng)的FAT16、FAT32、NTFS、exFAT文件系統(tǒng);Linux系統(tǒng)下的EXT2、EXT3、EXT4。Windows操作系統(tǒng)使用廣泛,且SD卡容量比較大,因此這里選用FAT32文件系統(tǒng)。
FAT32文件系統(tǒng)的實現(xiàn)方法可以分為:直接法,分析FAT32文件系統(tǒng)的組織結(jié)構(gòu),遵循文件生成機制,編寫程序代碼實現(xiàn)功能;移植法,移植FAT文件系統(tǒng)模塊,調(diào)用其提供的應(yīng)用接口函數(shù),同樣可以實現(xiàn)功能。
目前比較流行使用的FAT文件系統(tǒng)模塊主要有:周立功公司的zlg/FS、Micrium公司的μC/FS、Source-Forge.net網(wǎng)站上發(fā)布的開源項目efsl,以及日本電子愛好者設(shè)計并維護(hù)的FATFS文件系統(tǒng)模塊。以上4個文件系統(tǒng)模塊各有特點:zlg/FS因讀寫速率較慢,主要用于實驗教學(xué);Micrium公司的μC/FS一般在商業(yè)上使用;efsl及FATFS都是免費開源軟件,FATFS相對成熟一些。
本文采用了移植FATFSModule方法,FATFSModule專門為小型嵌入式系統(tǒng)而設(shè)計,采用標(biāo)準(zhǔn)的C語言編程,具備良好的硬件平***立性,移植到8051、AVR等單片機上,只需簡單修改。它還支持FAT12、FAT16和FAT32,以及多個存儲介質(zhì),可以對多個文件進(jìn)行讀/寫。FATFS整體框架如圖2所示。
頂層是應(yīng)用層,調(diào)用FATFSModule提供的一系列API函數(shù)(如:f_open、f_read、f_write、f_close等),用戶即使不理解FAT協(xié)議,也可以利用應(yīng)用接口函數(shù)輕松地讀/寫文件;中間層完整地實現(xiàn)FAT文件讀/寫協(xié)議,用戶無需對此進(jìn)行任何修改;底層是用戶在移植過程中需要處理的接口,需要用戶編寫代碼,它包括存儲介質(zhì)的讀/寫接口DiskI/O和文件創(chuàng)建修改時間所需的實時時鐘。
嵌入式文件系統(tǒng)的移植可以分為3步:編寫SD卡的通信函數(shù),編寫RTC時鐘函數(shù)和FATFS的移植。
編寫RTC時鐘函數(shù)實際上就是給文件系統(tǒng)時鐘函數(shù)DWORDget_fattime(Void)賦值,連續(xù)提供給文件系統(tǒng)一個實時時鐘。DWORDget_fattime(Void)需要RTC函數(shù)支持,返回一個32位無符號整數(shù),時鐘信息包含在這32位中,如圖3所示。
DS3231實時時鐘芯片
DS3231器件
DS3231是Maxim公司生產(chǎn)的一款低成本、超高精度的I2C總線實時時鐘芯片,該器件不僅能夠在一定溫度范圍內(nèi)提供優(yōu)于2min/年的計時精度,而且省去了制造過程中晶振安裝和布線校準(zhǔn)的工作。
DS3231實時時鐘(RTC),具有集成的溫補晶體振蕩器(TCX0)和1個32.768kHz的晶振,該晶振包含電池輸入端,斷開主電源仍然可以保持精確計時。集成晶體振蕩器可提供器件的長期精確度,并減少生產(chǎn)的元件數(shù)。DS3231提供商級和工業(yè)級溫度范圍,采用16引腳、300mil的SO封裝。RTC保持秒、分、時、星期、日期、月和年信息。當(dāng)遇到少于31天的月份,將自動調(diào)整月末日期,包括閏年補償。時鐘可以工作于24小時模式或帶AM/PM指示的12小時。提供2個可編程日歷鬧鐘和1路可編程方波輸出。地址與數(shù)據(jù)通過I2C雙向串行傳輸。通過精密的、經(jīng)過溫度補償?shù)?a target="_blank">電壓基準(zhǔn)和比較器來監(jiān)視VCC狀態(tài),檢測電源故障,提供復(fù)位輸出,并在必要時自動切換到備用電源。另外,RST監(jiān)視引腳可作為手動按鈕輸入,以產(chǎn)生外部復(fù)位信號。
DS3231與單片機C8051F500的硬件連接
圖4為高精度實時時鐘芯片DS3231與主控制器C8051F500單片機的接口連接電路。
DS3231的主要引腳功能說明:VCC用于主電源的DC引腳;INT/SQW為低電平有效中斷或方波輸出;RST是低電平有效復(fù)位引腳;GND為地;VBAT為備用電源輸入;SDA為串行數(shù)據(jù)輸入、輸出;SCL為串行時鐘輸入。
C8051F500通過I2C總線與DS3231連接,DS3231的VCC接系統(tǒng)電源VCC,VBAT為備用電源輸入,該引腳應(yīng)該連接一個低泄漏電容去耦。INT/SQW為低電平有效中斷或方波輸出,該漏極開路輸出要求外接上拉電阻,如果不使用,可保持開路。微控制器主要通過I2C總線向時鐘芯片DS3231寫時間信息,DS3231以寫入的時間信息為基準(zhǔn)精確走時。上電后,微控制器從時鐘芯片讀取時間信息并存入內(nèi)存供系統(tǒng)使用,器件每隔64s測量一次溫度,通過調(diào)節(jié)晶振的負(fù)載電容,使其在指定溫度達(dá)到2ppm的精度,最終達(dá)到提高時鐘精度的目的。即使系統(tǒng)斷電一段時間后重新上電,時鐘芯片內(nèi)的實時數(shù)據(jù)仍能被正確讀出。
與嵌入式文件系統(tǒng)有關(guān)的特性
DS3231電源供電方式
DS3231有兩個電源引腳VCC和VBAT,分別連接電源VCC和備用電池,它們之間的切換由溫度補償電壓基準(zhǔn)(VPF)和監(jiān)視VCC電平的比較器電路控制。當(dāng)VCC高于VPF時,DS3231由VCC供電,當(dāng)VCC低于VPF但高于VBAT時,DS3231由VCC供電;當(dāng)VCC低于VPF和VBAT時,DS3231由VBAT供電;如果用一節(jié)容量為38mAh的電子表用紐扣鋰電池作備用電池,在系統(tǒng)掉電時電流損耗最大為3.5μA,則至少供電時間為:
t=38×10-3/3.5×10-6=10857h
按照這個理論,可以粗略估計備用電池供電時間,能夠滿足實際需要。
DS3231采用I2C總線通信方式
單片機C8051F500通過讀取時鐘芯片DS3231的值來給文件系統(tǒng)提供日期時間,也可以寫入DS3231一個任意的時間初始值,讓其依據(jù)設(shè)定值開始計時,這就要求研究這兩者之間的通信模式。DS3231工作于讀和寫兩種模式。
(1)DS3231寫模式
通過SDA線和SCL線來接收串行數(shù)據(jù)和時鐘,收到每個字節(jié)后,發(fā)送應(yīng)答位,START和STOP條件作為串行數(shù)據(jù)傳輸?shù)拈_始和結(jié)束。軟件設(shè)計流程如圖5所示。首先調(diào)用START_IIC()函數(shù)使單片機產(chǎn)生開始條件,再通過SendByte()函數(shù),發(fā)送DS3231寫地址,然后發(fā)出應(yīng)答信號,接下來單片機向DS3231發(fā)送一個字地址(秒、分、時、日、月、年地址),產(chǎn)生應(yīng)答信號后,再發(fā)送一個字節(jié)數(shù)據(jù)(秒、分、時、日、月、年數(shù)據(jù))至DS3231設(shè)定初始化時間。產(chǎn)生應(yīng)答信號后,調(diào)用STOP_IIC函數(shù)來使單片機產(chǎn)生終止數(shù)據(jù)寫入條件。
(2)DS3231讀模式
接收和處理字節(jié)的方式與寫模式相同,但是在這種模式下,方向位指示的傳輸方向是相反的。DS3231向SDA發(fā)送串行數(shù)據(jù),并由SCL輸入串行時鐘。軟件設(shè)計流程如圖6所示。單片機產(chǎn)生START條件后,通過SendByte()函數(shù)發(fā)送DS3231寫地址,產(chǎn)生應(yīng)答信號后,發(fā)送一個字地址(秒、分、時、日、月、年地址);產(chǎn)生應(yīng)答信號后再通過SendByte()函數(shù)發(fā)送DS3231讀地址;產(chǎn)生應(yīng)答信號后,通過函數(shù)RcvByte()從DS3231讀取一個字節(jié)數(shù)據(jù)(秒、分、時、日、月、年數(shù)據(jù))來獲取時間;產(chǎn)生應(yīng)答信號后,最后調(diào)用STOP_IIC函數(shù)來使單片機產(chǎn)生終止數(shù)據(jù)讀取條件。
系統(tǒng)測試及結(jié)果
在系統(tǒng)測試中,C8051F500選用了22.118400MHz的外部晶振,存儲介質(zhì)選用了金士頓8GBSDHC卡,分別在主電源供電5V和LITHIUMCELLGR1220紐扣電池供電3V的情況下,對1980年之后的年、月、日、時、分、秒等時間信息進(jìn)行設(shè)定任意初始值,并在PC機上查看了存儲在SD卡中的數(shù)據(jù)文件的創(chuàng)建、修改、訪問等具體時間信息。測試結(jié)果表明,不論在主電源供電還是備用紐扣電池供電情況下,存儲在SDHC卡上的文件能夠精確顯示年、月、日、時、分、秒等時間信息。
本文提出的通過DS3231高精度時鐘芯片給嵌入式文件系統(tǒng)提供實時時間的方案具有可行性,解決了存儲在SD卡上的采集數(shù)據(jù)文件沒有實時時間的問題,并且在系統(tǒng)掉電情況下,通過一個紐扣鋰電池仍然能夠長時間連續(xù)不斷地提供精確的年、月、日、時、分、秒等時間信息,滿足了艦舵參數(shù)采集設(shè)計中對存儲在SD卡上的數(shù)據(jù)文件的創(chuàng)建、修改、訪問等時間信息的實際要求。
評論