2014-12-01 32 views
0

我使用的是16MB的Spansion閃存。扇區大小爲256KB。我正在使用閃存來讀/寫/刪除30個字節塊(結構)。我在IC的數據表中發現最小可擦除大小是256KB。刪除特定塊的一種方法是:在閃存中擦除比扇區大小(最小可擦除大小)更少的字節的最佳邏輯

  1. 讀取包含要刪除到臨時數組的塊的扇區。
  2. 擦除該扇區。
  3. 刪除臨時數組中的所需塊
  4. 將臨時數組寫回到Flash中。

我想問一下有沒有更好的替代邏輯來解決這個問題。

+0

難道你不能只是修改數據的扇區沒有「擦除」它? – ooga 2014-12-01 17:23:08

+0

不,在不擦除位置的情況下寫入數據是不可能的 – Durgesh 2014-12-02 04:45:24

回答

7

無法擦除閃存中的最小可擦除扇區大小。

但是,有一種處理大型閃存扇區上的小型結構失效的典型方法。只需添加一個標題以指示該結構位置中的數據狀態。

簡單的例子:

  • 0xffff結構被刪除,可供使用。
  • 0xa5a5結構中包含有效的數據。
  • 0x0000結構包含無效的數據。

擦除後標題將爲0xffff。將新數據寫入結構時,請將標題設置爲0xa5a5。當不再需要該數據時,將標題設置爲0x0000

數據實際上不會被刪除,但可以將其檢測爲無效。這允許您等待扇區已滿,然後清理無效記錄並可能壓縮有效記錄。

+1

海報的問題可能會更復雜,比如他可能需要通過索引訪問結構,或者結構本身彼此引用,但是我猜這個字段是隻是比在SO帖子上回復更復雜。然而,這個答案是重新思考解決整體問題的良好開端。 – Jubatian 2014-12-01 18:10:45

+0

如果數據不再需要或數據需要刪除,您正在修改標題(在閃存中)。但是要這樣做,我如何修改駐留在閃存中的數據而不擦除它? – Durgesh 2014-12-02 10:42:38

+0

@DurgeshTanuku,您可以隨時重新編程從1到0的位而不擦除。但爲了將任何位從0更改爲1,則必須擦除整個扇區。 (擦除將扇區中的所有位設置爲1.)因此,在不擦除的情況下,可以將頭重新編程爲全0,並將其用作指示記錄不再有效。 – kkrambo 2014-12-02 14:08:27

3

首先,再次檢查器件數據表。通常Spansion設備會讓您擁有64kB的頁面大小,而不是256kB。這可能會幫助你,但通常增加粒度會幫助你。其次,您無法避免想要將位從0更改爲1的「寫入前擦除」循環。但是,您始終可以逐個字節地將位從1更改爲0。

您可以重新考慮當前的3字節結構以查看它是否對您有用,也可以轉換爲32字節大小的結構(這是2的冪等,稍微更理智的IMO)。然後,要刪除,您可以簡單地將0xFF的第一個字節設置爲0xFF,這將正常擦除字節設置爲。這意味着你最終會得到空插槽。

就像垃圾收集器的工作方式一樣,您可以重新組織以移動任何已刪除塊的頁面,以便創建空白頁面(全部刪除塊)。確保在將原始頁面從原始頁面中刪除之前將其移動到空白頁面!然後,您可以刪除充滿已刪除塊或重新組織塊的空白頁面。

當您使用閃存時,您必須考慮您的讀取/擦除/寫入策略,以使用可用的閃存。在開始編碼或鎖定內存結構之前,肯定會解決這個問題,因爲通常您需要至少保留一個字節作爲有效性字節,通常您必須利用這一事實,即您始終可以更改設置爲任何字節中的1到0在任何時候都沒有擦除週期。