基于SD卡的BMS海量歷史數據存儲系統設計
2 軟件程序設計
軟件設計主要難點(diǎn)是SD卡驅動(dòng)與FAT32文件系統的結合方式設計。FAT32文件系統的實(shí)現有一定的復雜性,如果設計地不好不但會(huì )浪費大量CPU資源,而且可能造成數據丟失、覆蓋等嚴重后果。采用傳統數據流式程序設計思想實(shí)現起來(lái)比較困難,Debug也很不方便。本設計引用現代Windows操作系統慣用的層次模型劃分的方法開(kāi)發(fā)了一套基于SD卡的FAT32文件系統協(xié)議包,具有層次分明、結構緊湊、可移植性強及邏輯清晰的特點(diǎn)。
2.1 FAT32文件系統
FAT32是由Microsoft設計并運用得非常成功的文件系統。至今FAT32依然占據著(zhù)Microsoft Windows文件系統中重要的地位。FAT32改進(jìn)了FAT16和FAT12不支持大分區、單位簇的容量過(guò)大以致空間急劇浪費等缺點(diǎn)。由引導扇區、FAT表、根目錄和數據區4大部分組成。圖3標出了FAT32分區的基本構成,FAT2是FAT1的備份,用于在FAT1損壞時(shí)修復。本文引用地址:http://dyxdggzs.com/article/179434.htm
FAT表(File Allocation Table文件分配表)記錄文件在介質(zhì)上的放置位置,即簇號序列。每個(gè)表項記錄的簇號都是32位的,故這個(gè)方法稱(chēng)為FAT32。表2所示是一段簡(jiǎn)化的FAT表,第2簇記錄根目錄存放位置,第3簇記錄某文件存儲的下一簇號(該文件從本簇即第3簇開(kāi)始存放)是6號,第6號又記錄接下來(lái)的簇號……,至到標記FF表示文件結束。同樣道理從第12簇開(kāi)始存放另一個(gè)文件,該文件在第93簇存放結束。從表
中可以看出文件是可以非連續存放的,這樣可以充分利用SD存儲介質(zhì)的空間,并且可以保證存放BMS采集數據不會(huì )發(fā)生重疊,沖掉以前數據。表3列出了FAT表各記錄項的取值含義。
系統在存儲一個(gè)文件時(shí)先計算出需要幾個(gè)簇的空間來(lái)存放,再從FAT表中找出這相應個(gè)數的空閑簇,并其修改記錄項的取值使之首尾連成一串。然后在目錄表中創(chuàng )建一個(gè)新的文件項,并記錄它在介質(zhì)上存放的首簇號。這樣在讀文件時(shí),只要直接從目錄表中找到該文件的記錄項,獲取它的首簇號就能把文件讀出來(lái)了。FAT32文件系統目錄的記錄項的結構定義如表4所示。
2.2 SD卡SPI通信協(xié)議
發(fā)送給SD卡的命令采用6字節的格式如表5所示。命令的第1個(gè)字節可通過(guò)將6位命令碼與16進(jìn)制碼0x40進(jìn)行或運算得到。如果命令需要,則在接下來(lái)的4個(gè)字節中提供一個(gè)32位的參數,最后1個(gè)字節包含了從第1個(gè)字節到第5個(gè)字節的CRC-7校驗和。表6列出了部分SD存儲卡SPI命令的解釋。
評論