2016-02-25 42 views
0

我的系統需要將數據存儲在EEPROM閃存中。字節串將一次寫入一個EEPROM,而不是一次連續寫入。字符串的長度可能會有所不同。我希望字符串按順序保存,而不會從最後寫入地址繼續浪費任何空間。例如,如果第一個字節的字符串被寫入地址0x00〜0x08,那麼我希望從地址0x09開始寫入第二個字節的字符串。寫入閃存時的跟蹤地址

如何實現?我發現一些EEPROM的寫命令不需要指定地址,只是從最後寫入的點開始繼續。但是我使用的EEPROM不支持。 (我正在使用Spansion的S25FL1-K)。每次寫入時我都會考慮分配部分內存來跟蹤地址並存儲地址,但這可能會更快地消耗掉閃存。什麼是廣泛使用的方法來處理這種情況?

謝謝。

編輯: 我問的是如何以非易失性的方式跟蹤/保存地址,以便下次寫入時,我知道要開始的地址。

+0

您是否閱讀過數據表?命令以地址開始,然後您可以有一個到256個字節。所以你知道你開始的地址是什麼,你知道這個字符串有多長,所以當你啓動另一個命令時,你知道你在頁面中的位置,你知道使用哪個地址。不確定你的問題是什麼。你必須預先檢查字符串長度,以確保你不超過任何限制,不論你使用的部件/頁面或spi控制器的限制是多少,你可以發送每個命令有多少字節的限制等等。所以你總是知道起始地址和長度。 –

+0

您指定的設備是* not * EEPROM。它是一個串行NOR閃存。 –

+0

@dwelch數據未被正確寫入。該系統通過藍牙收集數據,並在閃存空閒時寫入閃存,並確認收集的數據可以安全地寫入。之前的寫作可能會持續一段時間。就像你說的那樣,是的,我知道寫這個時刻我在頁面上的位置。我問的是如何記住這個地址,以便在下一次寫入時可以將它作爲起始地址。我不是,如果這我的解釋是清楚的.. –

回答

0

我從來沒有使用過這個特殊的Flash,但我實現了類似的東西。不幸的是,如果不知道你的限制/優先級(內存或CPU高效率,寫入發生的頻率等),不可能給出明確的答案。以下是您可能需要考慮的一些技巧。我不知道它們是否被廣泛使用。

選項1:在字符串之前寫入包含字符串長度的X字節。然後在初始化時你可以解析你的閃存:讀取長度n,向前跳轉n個字節;讀下一個字節。如果它是空的(根據數據表,所有的閃光燈),那麼你得到你的第一個空位。否則,你只是讀了下一個字符串的長度,所以重複一遍。

  • 該方法允許您快速搜索最後使用的扇區,因爲使用扇區的第一個字節保證有一個值。這裏的另一面是額外的n字節開銷(取決於字符串的最大長度),每次你寫一個字符串,並且必須解析它才能得到值(儘管這隻能在啓動時完成一次)。

選項2:除了前面加上大小,添加獨特的「結束串」序列,然後那些代表空閃光之前就啓動了最後一個序列解析。

  • 這裏的缺點是分析時間較長,但每個字符串的開銷只有1字節長。

選項3將正是您已經想到的:分配一個單獨的扇區,將包含您需要的值。爲了減少閃存磨損,您也可以將這些值背對背寫入,並在每次啓動時搜索最後一個值。此外,您可能會考慮您設計的設備的預期使用壽命與您的閃存可以承受的100,000次擦除(再次根據數據表) - 甚至出現問題?這當然取決於數據保存的頻率。

希望有所幫助。