Лучшая логика для стирания меньшего количества байтов, чем размер сектора (минимальный стираемый размер) во флеш-памяти

Я использую флэш-память Spansion объемом 16 МБ. Размер сектора 256 КБ. Я использую флеш-память для чтения / записи / удаления 30-байтовых блоков (структур). Я обнаружил в техническом паспорте ИС, что минимальный стираемый размер составляет 256 КБ. Один из способов удаления определенного блока -

  1. Прочтите сектор, содержащий удаляемый блок, во временный массив.
  2. Сотрите этот сектор.
  3. Удалите требуемый блок во временном массиве
  4. Запишите временный массив обратно во Flash.

Я хочу спросить, есть ли лучшая альтернативная логика.


person Durgesh    schedule 01.12.2014    source источник
comment
Разве нельзя просто переписать измененные данные в сектор, не стирая его?   -  person ooga    schedule 01.12.2014
comment
Нет, запись данных без удаления местоположения невозможна   -  person Durgesh    schedule 02.12.2014


Ответы (2)


Невозможно стереть во флэш-памяти размер сектора, который может быть меньше минимального, для стирания.

Однако существует типичный способ сделать недействительными небольшие структуры в большом секторе флеш-памяти. Просто добавьте заголовок, чтобы указать состояние данных в этом месте структуры.

Простой пример:

  • 0xffff Структура стерта и доступна для использования.
  • 0xa5a5 Структура содержит действительные данные.
  • 0x0000 Структура содержит недопустимые данные.

После стирания заголовок будет 0xffff. При записи новых данных в структуру установите заголовок 0xa5a5. Когда эти данные больше не нужны, установите заголовок 0x0000.

Данные фактически не будут удалены, но могут быть определены как недействительные. Это позволяет дождаться заполнения сектора, а затем очистить недопустимые записи и, возможно, сжать действительные.

person D Krueger    schedule 01.12.2014
comment
Проблема плаката может быть более сложной, например, ему может потребоваться доступ к структурам по индексам, или сами структуры ссылаются друг на друга, однако я предполагаю, что это поле намного сложнее, чем в сообщении SO. Однако этот ответ - хорошее начало для переосмысления решения общей проблемы. - person Jubatian; 01.12.2014
comment
Вы говорите изменить заголовок (во флэш-памяти), если данные больше не нужны или данные необходимо удалить. Но как для этого изменить данные, хранящиеся во флеш-памяти, не стирая их? - person Durgesh; 02.12.2014
comment
@DurgeshTanuku, Вы всегда можете перепрограммировать биты с 1 на 0 без стирания. Но для того, чтобы изменить какие-либо биты с 0 на 1, вы должны стереть весь сектор. (Стирание устанавливает все биты в секторе на 1.) Таким образом, без стирания, вы можете перепрограммировать заголовок на все 0 и использовать это как указание на то, что запись больше не действительна. - person kkrambo; 02.12.2014
comment
@Jubatian. Если автор желает использовать флеш-память в качестве изменяемой памяти с произвольным доступом, его проблемы действительно выходят за рамки одного вопроса SO. Поскольку его вопрос был сосредоточен на удалении блоков, я предположил, что это его основная проблема, но не подумал, что он мог их удалять, чтобы записать туда новые данные. - person D Krueger; 03.12.2014

Во-первых, еще раз проверьте техническое описание устройства. Обычно устройства Spansion позволяют иметь размер страницы 64 КБ вместо 256 КБ. Это может помочь вам, а может и не помочь, но в целом вам поможет повышенная степень детализации.

Во-вторых, вы не можете избежать цикла «стереть перед записью», когда вы хотите изменить биты с 0 на 1. Однако вы всегда можете изменить биты с 1 на 0 побайтно.

Вы можете либо переосмыслить свою текущую 3-байтовую структуру, чтобы увидеть, пригодится ли она вам, либо перейти к структуре размером 32 байта (которая является степенью 2 и, таким образом, немного более разумной IMO). Затем, чтобы удалить, вы можете просто установить первый байт на 0x00 из 0xFF, в который будет установлен обычный стертый байт. Это означает, что у вас останутся пустые слоты.

Подобно тому, как работает сборщик мусора, вы можете затем реорганизовать, чтобы переместить любые страницы, на которых были удалены блоки, так, чтобы вы создавали пустые страницы (полные удаленных блоков). Убедитесь, что вы переместили хорошие блоки на пустую страницу, прежде чем удалять их с исходной страницы! Затем вы можете стереть пустую страницу, которая была заполнена удаленными или реорганизованными блоками.

Когда вы работаете с флэш-памятью, вы должны продумать свою стратегию чтения / стирания / записи для работы с имеющейся у вас флэш-памятью. Определенно проработайте это до того, как вы начнете кодировать или блокировать структуры памяти, потому что обычно вам нужно зарезервировать хотя бы один байт в качестве байта действительности, и обычно вы должны воспользоваться тем фактом, что вы всегда можете изменить биты, которые установлены на От 1 до 0 в любом байте в любое время без цикла стирания.

person Brian Sidebotham    schedule 01.12.2014