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