2009-11-18 98 views
5

我試圖開發一個報警歷史結構存儲在非易失性閃存中。閃存的寫週期數量有限,所以我需要一種方法來向結構添加記錄,而不必每次都重寫結構中的所有閃存頁面,或者寫出更新的指向隊列頭部/尾部的指針。報警歷史堆棧或隊列?

此外,一旦可用閃存空間已被使用,我想要開始覆蓋以前存儲在閃存中的記錄,並以先入先出的先記錄開始。這使我認爲循環緩衝區對於添加項目最有效。但是,在查看記錄時,我希望結構像堆棧一樣工作。例如。記錄將按逆時間順序顯示後進先出。

結構大小,頭部,尾部索引不能存儲,除非它們存儲在記錄本身中,因爲如果它們每次寫出到固定位置,它將超過它們存儲在頁面上的最大寫週期。

所以我應該使用堆棧,隊列還是一些混合結構?我應該如何將頭部,尾部,尺寸信息存儲在閃存中,以便在加電後可以重新初始化?

+0

您是直接在閃存上工作還是在閃存上使用文件系統? – stefaanv 2009-11-18 19:44:05

+0

沒有文件系統。直接寫入閃存。 – mjh2007 2009-11-18 19:48:21

回答

4

查找ring-buffer

假設你可以工作,這是最後一個條目(從時間標記等等這樣就不需要寫標記),這也具有最好的損耗均衡的性能。

2

編輯:不適用於OP的閃存控制器:您不必擔心代碼中的wear leveling。閃存控制器應該在幕後處理這個問題。

但是,如果您仍想繼續操作,只需使用常規循環緩衝區和keep pointers to the head and tail的堆棧。

您也可以考慮使用Least Recently Used cache來管理閃存的存儲位置。

+0

這不完全是磨損平衡。他需要儘可能少地專注於寫作。 – 2009-11-18 19:47:07

+0

我很確定閃存控制器不提供損耗均衡。我正在使用AT45DB642D。 – mjh2007 2009-11-18 19:47:18

+0

@ mjh2007:你說得對,控制器在其規格手冊中似乎沒有任何特殊的管理。 – 2009-11-18 19:52:39

0

你絕對需要一個環形緩衝區。但是你是對的,元信息有點...有趣。

0

將您的輸入映射到多個部分。當部分已滿時,從第一部分開始覆蓋。添加序列號(nbr序列號> 2 *條目),因此在重新啓動時,您知道第一個條目是什麼。

0

你可以做一個環形緩衝區的版本,其中存儲在頁面中的第一個元素是該頁面被寫入的次數。通過查找數字低於上一頁的第一頁,您可以確定下一個應該寫的位置。如果他們都是一樣的,你從下一個數字開始。