Адрес отслеживания при записи на флешку

Моя система должна хранить данные во флеш-памяти EEPROM. Строки байтов будут записываться в EEPROM по одной, а не непрерывно сразу. Длина струн может быть разной. Я хочу, чтобы строки сохранялись в порядке, не тратя впустую места, продолжая с последнего адреса записи. Например, если первая строка байтов была записана по адресу 0x00 ~ 0x08, то я хочу, чтобы вторая строка байтов была записана, начиная с адреса 0x09.

Как этого добиться? Я обнаружил, что некоторые команды записи EEPROM не требуют указания адреса и просто продолжают с последней записанной точки. Но EEPROM, который я использую, не поддерживает это. (Я использую Spansion S25FL1-K). Я думал о выделении части памяти для отслеживания адреса и о сохранении адреса каждый раз, когда я пишу, но это могло быстрее изнашивать флеш-память. Какой метод решения такой проблемы широко используется?

Спасибо.

РЕДАКТИРОВАТЬ: Я спрашиваю, как отслеживать / сохранять адрес энергонезависимым способом, чтобы при следующей записи я знал, с какого адреса начать.


person Megool    schedule 25.02.2016    source источник
comment
вы читали таблицу? команды начинаются с адреса, тогда у вас может быть от 1 до 256 байт. Итак, вы знаете, с какого адреса вы начали, вы знаете, какой длины строка, поэтому вы знаете, где вы находитесь на странице, когда вы запускаете другую команду, вы знаете, какой адрес использовать. Не уверен, в чем ваш вопрос. В любом случае вам необходимо предварительно проверить длину строк, чтобы убедиться, что вы не превышаете каких-либо ограничений, будь то ограничение для части / страницы или используемый вами контроллер spi, может иметь ограничение на количество байтов на команду, которую вы можете отправить, и т. Д. Таким образом, вы всегда знаете начальный адрес и длину.   -  person old_timer    schedule 25.02.2016
comment
Это устройство, которое вы назвали, не является EEPROM. Это серийная вспышка NOR.   -  person Brian McFarland    schedule 25.02.2016
comment
@dwelch Данные не записываются сразу за другими. Система собирает данные через Bluetooth и записывает их во флэш-память, когда она свободна, и подтверждает, что собранные данные безопасны для записи. Это может быть через некоторое время после предыдущей записи. Как вы сказали, да, я знаю, где я нахожусь на странице в тот момент, когда происходит запись. я спрашиваю, как запомнить этот адрес, чтобы я мог использовать его в качестве начального адреса при следующей записи. Нет, если это мое объяснение достаточно ясно ...   -  person Megool    schedule 25.02.2016
comment
@BrianMcFarland, в чем разница между ними? Отличается ли серийная флеш-память NOR от EEPROM, когда дело доходит до реализации на C?   -  person Megool    schedule 25.02.2016
comment
Самое большое отличие с точки зрения программистов заключается в том, что EEPROM могут записывать отдельные байты, и нет четкого цикла / операции стирания. И NAND, и NOR flash требуют поблочного / постраничного стирания с фиксированным размером и границами местоположения, прежде чем вы сможете их перезаписать. возможно, вам придется стирать 4 КБ за раз во флэш-памяти.   -  person Brian McFarland    schedule 25.02.2016
comment
энергонезависимая, как при цикле включения питания, или энергонезависимая, как при от одного вызова некоторой функции до другого вызова той же функции (просто используйте глобальную). для другого, очевидно, вам нужно где-то сохранить этот адрес. Чтобы вспышка не изнашивалась, существует множество схем. можно было бы держать его в оперативной памяти, обнаруживать снижение мощности, иметь достаточную объемную емкость, чтобы выдержать запись, и выполнять запись при выключении питания в зарезервированную область флэш-памяти.   -  person old_timer    schedule 25.02.2016
comment
резервное копирование батареи и т. д. или вам действительно нужно быть энергонезависимым, и можете ли вы сделать формат данных на флэш-памяти таким образом, чтобы, когда вы просыпаетесь, вы могли анализировать вспышку и видеть, где вы остановились, вместо того, чтобы сохранять адрес где-нибудь? и есть много способов сделать это, чтобы его можно было обнаружить, когда вы просыпаетесь.   -  person old_timer    schedule 25.02.2016
comment
Напишите какой-нибудь токен конца файла после строки. Когда будет записана следующая строка, сотрите токен и перепишите его после новой строки. После сброса во время загрузки прочитайте буфер с самого начала, пока не найдете токен, чтобы определить, куда продолжить запись. Если строки являются ASCII, используйте символ EOF для токена. Если данные являются двоичными, разработайте некую escape-последовательность для идентификации маркера конца файла.   -  person kkrambo    schedule 26.02.2016


Ответы (1)


Я никогда не работал с этой конкретной вспышкой, но я реализовал нечто подобное. К сожалению, не зная ваших ограничений / приоритетов (эффективность памяти или процессора, частота записи и т. Д.), Невозможно дать однозначный ответ. Вот несколько приемов, которые вы можете рассмотреть. Я не знаю, широко ли они используются.

Вариант 1. Запишите перед строкой X байтов, содержащих длину строки. Затем при инициализации вы можете проанализировать свою флеш-память: прочитать длину n, перейти на n байтов вперед; читать следующий байт. Если он пуст (все для вашей флеш-памяти в соответствии с таблицей данных), то вы получили свой первый пустой бит. В противном случае вы только что прочитали длину следующей строки, поэтому повторите то же самое еще раз.

  • Этот метод позволяет быстро найти последний использованный сектор, поскольку первый байт использованного сектора гарантированно имеет значение. Обратной стороной здесь являются дополнительные n байтов (в зависимости от максимальной длины строки) каждый раз, когда вы пишете строку, и необходимость ее анализа для получения значения (хотя это можно сделать только один раз при загрузке).

Вариант 2. Вместо того, чтобы добавлять размер, добавьте уникальную последовательность «конца строки», а затем выполните синтаксический анализ при загрузке для последней последовательности перед последовательностями, представляющими пустую флеш-память.

  • Недостатком здесь является более длинный синтаксический анализ, но вы можете избежать накладных расходов длиной всего 1 байт для каждой строки.

Вариант 3 был бы именно тем, о чем вы уже думали: выделение отдельного сектора, который будет содержать нужное вам значение. Чтобы уменьшить износ флэш-памяти, вы также можете записывать эти значения подряд и искать последнее при каждой загрузке. Кроме того, вы можете рассмотреть ожидаемый срок службы устройства, которое вы программируете, по сравнению со 100000 стираний, которые может выдержать ваша вспышка (опять же, в соответствии с таблицей данных) - это даже проблема с износом? Это, конечно, зависит от того, как часто будут сохраняться данные.

Надеюсь, это поможет.

person ZenJ    schedule 29.02.2016