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