2013-11-03 40 views
1

(該項目將可能在話題上的超級用戶或電子網站,但這個問題的重點是完成它的可編程軟件。)框架filesystemless SD卡分區之前

我有產生數據的嵌入式系統大約100KB/s,需要存儲並在Windows PC上處理。串行流式傳輸工作,但內部存儲具有明顯的優勢,即不需要在收集數據的房間中存在筆記本電腦和電纜。

我的電路板具有一個SD卡插槽(SPI連接),我以前試着寫文件到一個FAT文件。但事實證明這是一個可怕的瓶頸,其原因不僅在於,爲了支持任意長度的任意長度的多個文件在任意時間增長,FAT中的文件訪問需要讀取和寫入多層元數據 - 分配表本身和目錄 - 除了實際的內容外,它們不能完全適合微控制器的RAM,所以卡訪問的數量被放大了。更糟糕的是,一些任務如尋找新的空閒塊在卡片大小上具有線性複雜性。

對FAT的另一個打擊是,它是在沒有事先清潔卸載功率損耗的情況下,很容易出現數據損壞,我的系統沒有任何用戶界面可能啓動卸載。我意識到包括電源故障中斷和電容在內的技術可以使處理器和SD卡保持幾毫秒的時間,但由於這些技術無論如何都不利於熱拆卸,而且我現有的電路沒有這些技術, m試圖實現一個只有崩潰的存儲設計。

所以我決定跳過文件系統,只需使用該卡進行與塊的原始序列。不過,我不希望我的用戶被邀請重新格式化包含數據

enter image description here

所以,我想分區的卡放在前面,其操作系統將認識到,小FAT分區卡及解釋性測試文件。用戶需要能夠替換卡,所以我需要在我的PC應用程序中自動執行分區和格式化過程。

原始訪問可以通過調用CreateFile("\\\\.\\PhysicalDisk3")和相似的路徑,而不需要管理員權限來實現,這樣就可以在可移動磁盤來完成。不過,這是我不想自己寫的代碼。操作系統仍然需要被告知在更改後重新掃描卷。

是否有任何的API內置到Windows或分區SD卡的第三方的開源框架的一部分,而不需要對分區表直接按位訪問?如果不是,在更改分區後應該怎樣做Windows重新掃描卷?我更喜歡XP和更新的方法。

+0

問:什麼類型的文件系統中,貴嵌入式操作系統的支持?否則,Q:你覺得如何在Windows DDK中感受到自己的親密感(覺得你可能已經非常精通)?問:你有沒有考慮過使用FAT32,但覆蓋了你自己的錯誤檢測/糾錯?問:你的嵌入式操作系統是什麼? – paulsm4

+0

沒有嵌入式操作系統。嵌入式系統上總共有160KB的RAM,並且除了存儲之外還必須處理其他功能。我的理解是,就內存使用而言,FAT32和exFAT至少與普通FAT(FAT12,FAT16)一樣差。我很高興使用DDK進行用戶模式開發(DDK頭文件被打包用於命令行構建過程,即使對於用戶模式,我也可以處理),但是我不打算寫內核模式代碼,可以在用戶模式下完成。 –

+0

還有一個建議:看看Win32DiskManager的源代碼。您也許能爲您的項目類似的東西:http://sourceforge.net/projects/win32diskimager/ – paulsm4

回答

0

看起來如果Windows使用分區管理的IOCTL機制。特別是,IOCTL_DISK_SET_DRIVE_LAYOUT_EX control code看起來非常有用。

我會進一步調查,然後更新這個答案。

+0

問:我提到的源代碼中是否有ioctl()? ;) – paulsm4

+0

@ paulsm4:當然,但沒有涉及到分區。 –

1

你的問題似乎是幾乎完全一樣的我現在有我們自己的項目之一來解決。

我會建議離開FAT32文件系統的卡上不變。
但是,然後你創建一個或多個大容器文件,連續塊或預分配表。

這甚至可以用嵌入式系統本身完成。
elm-chan's FatFs

然後你就可以訪問所有塊的容器內的原生,沒有任何進一步的訪問胖,但該卡可以通過任何操作系統來處理,甚至普通用戶可以複製文件。

Smaple功能分配連續的容器:
Allocate a contiguous area to the file
然後你就可以訪問該塊沒有文件系統庫,僅在第一次訪問容器,以確定它開始的地方。

+0

我已經在使用文件系統庫([efsl](http://sourceforge.net/projects/efsl/)),但它導致我的問題。它使用調用堆棧的狀態,使其與中斷驅動設計不兼容,它需要大量的內存作爲塊緩存,經常讀取和寫入元數據等。我見過使用像您這樣的大容器文件的系統建議,但確保容器完全連續需要低級別的訪問和直接調整文件系統結構;如果我必須這樣做,我寧願自己管理整個分區。 –