Во-первых, управление блок:
Поместите меньший заголовок в начале каждого блока. Главное, что вам нужно отслеживать «самые старые» и «самые новые», это номер блока, который просто увеличивает модуль k. k должно быть больше вашего общего количества блоков. В идеале сделайте k меньше вашего значения MAX (например, 0xFFFF), чтобы вы могли легко узнать, что такое стертый блок.
При пуске, код считывает заголовки каждого блока в свою очередь, и размещает первый и последний кадры в последовательности, которая представляет собой н + 1 = (п я + 1) по модулю К. Старайтесь не путать стираемые блоки (номер блока - например, 0xFFFF) или данные, которые каким-то образом повреждены (например, неполное удаление).
В пределах каждого блока
Каждый блок сначала начинается пустым (каждый байт 0xFF). Каждая запись просто записывается один за другим. Если у вас есть записи фиксированного размера, вы можете получить к нему доступ простым индексом. Если у вас есть записи с переменным размером, то для его чтения вам нужно выполнить сканирование с начала стиля, связанного списка.
Если вы хотите иметь записи с переменным размером, но избегайте линейного сканирования, тогда у вас может быть четко определенный заголовок для каждой записи. Например. используйте 0 в качестве разделителя записей и COBS -encode (или COBS/R -encode) каждая запись. Или используйте байт по вашему выбору в качестве разделителя и «выбери» этот байт, если он встречается в каждой записи (аналогично PPP protocol).
При запуске, как только вы узнаете свой последний блок, вы можете выполнить линейное сканирование последней записи. Если у вас есть фиксированные записи или разделители записей, вы можете выполнить двоичный поиск.
планирования Erase
Для некоторых чипов флэш-памяти, стирание блока может занять значительное время - например. 5 секунд. Рассмотрите планирование удаления в качестве фоновой задачи немного «раньше времени». Например. когда текущий блок равен x%, затем начните стирание следующего блока.
Запись нумерации
Вы можете пронумеровать записи. То, как я это делал в прошлом, - поставить в заголовке каждого блока номер записи первой записи. Затем программное обеспечение должно содержать количество номеров каждой записи в блоке.
Контрольная сумма или CRC
Если вы хотите, чтобы обнаружить поврежденные данные (например, неполная запись или стирание из-за неожиданный сбой питания), то вы можете добавить контрольную сумму или CRC для каждой записи, и, возможно, к блоку заголовок. Обратите внимание, что заголовок блока CRC будет охватывать только заголовок, а не записи, поскольку он не может быть переписан, когда записывается каждая новая запись.
I «Я смущен вашим языком. Буфер, на мой взгляд, является быстрой, изменчивой частью памяти, которая часто меняется. Как вы правильно отметили, флэш-память может иметь некоторые проблемы с этим. Можете ли вы предоставить немного больше контекста или подробностей относительно того, что вы пытаетесь сделать и почему? – Mikeb
Я хочу сохранить данные в энергонезависимой памяти. Энергонезависимая память, которая у меня есть, мигает. Энергонезависимость важна, потому что продукт может быть отключен в течение определенного периода времени, и я не хочу потерять данные. Когда питание снова включается, ему необходимо поместить следующий фрагмент данных после последнего. – Robert