Облегченный алгоритм циклического журнала (подобный файловой системе) для флэш-памяти

8

В настоящее время я работаю над проектом, который предполагает быструю непрерывную регистрацию довольно специфичной для приложения метрики в течение длительного срока. Для этого я использовал NXP M0 и флэш-чип SPI 32 МБ. Регистрация ведется непрерывно и должна длиться много лет в полевых условиях (10+) и периодически проверяется человеком на предмет выявления тенденций. В конце концов буфер заполняется и начинает перезаписывать старые данные, что совершенно нормально. Я придумал простой алгоритм обхода всего флэш-устройства, чтобы найти текущую головку после включения питания (устройство довольно часто выключается вне моего контроля), поэтому ведение журнала может просто продолжаться с того места, где оно остановилось. Я могу просто перебрать силу и пройти это с ~ 4s в худшем случае.

Это заставило меня задуматься, существуют ли какие-либо файловые системы со структурой журналов, предназначенные для флэш-устройств и микроконтроллеров? JFFS и все другие хорошо известные структурированные журналы FS, которые я представляю, были бы немного тяжелыми для простого микроконтроллера (конечно, зависит от применения). Чтобы быть более конкретным, я хотел бы знать о любых алгоритмах, которые специально разработаны для циклического журнала с быстрым временем поиска и / или алгоритмов, разработанных для «традиционной» файловой системы на флэш-устройстве, которое может быть запущено на микроконтроллер. Традиционно в этом смысле он находится на одном уровне с чем-то вроде JFFS, где есть структура данных, представляющая коллекцию изменяемых файлов произвольного доступа в иерархическом пространстве имен.

Крис Бансен
источник
FAT32 или FAT16 на SD-карте слишком медленные?
Викачу
2
Этот вопрос полностью относится к теме здесь, но если вы не получите хороших ответов, StackOverflow может помочь. Будем надеяться, что мы сможем получить здесь хорошие ответы!
Kellenjb
@vicatcu Не то, чтобы это было слишком медленно, для моего приложения SD-карта плюс разъем более дорогой, а SD-карты могут быть менее надежными. Kellenjb Я не был уверен, где это поставить. Подобно множеству вопросов о встроенном дизайне, этот тип падает посередине. Если бы здесь не получилось, я бы с удовольствием переместил это.
Крис Бансен,
Это сырой флеш чип? Если так, как вы справляетесь с мертвыми блоками? Довольно большая часть реализации Flash FS связана с мертвыми блоками. Если вы чувствуете, что JFFS / JFFS2 слишком тяжелый, вы можете попробовать YAFFS. Это похоже на очень простую файловую систему, по крайней мере, поэтому она должна быть достаточно легкой.
Лев
Да, это так. Плохие блоки не так уж страшны в этом конкретном приложении, поскольку его столь длительный срок, что извлекаемые данные - это просто грубая тенденция, и в большинстве случаев я сомневаюсь, что регистрация будет вообще использоваться.
Крис Бансен,

Ответы:

2

структура данных веревки

Я очарован структурой данных веревки, У меня есть хобби-проект, в котором я пытаюсь адаптировать его к микроконтроллеру с несколькими байтами ОЗУ, подключенными к огромной флэш-памяти, чтобы я мог вставлять, удалять и иным образом произвольно редактировать текст переменной длины в огромных текстовых файлах. Текстовые файлы слишком велики, чтобы поместиться в ОЗУ. Стирание последней половины файла и перезапись его во флэш-память, смещение на один байт, каждый раз, когда я вставляю или удаляю символ в середине текстового файла размером в несколько мегабайт, будет слишком медленным, но структура данных веревки может сделать это намного быстрее Поскольку структура данных веревки может представлять такие изменяемые файлы произвольного доступа с переменной длиной, как неизменяемые фрагменты фиксированной длины, кажется, что это хорошее совпадение с флэш-памятью - все изменения записываются в форме кругового журнала. Увы, все ошибки в моем коде еще не проработаны. :-(

хронологические журналы фиксированной длины

Я получил аналогичную систему циркулярного журнала для продукта, который помог разработать.

Я просто писал записи фиксированной длины одну за другой, заполняя flash как круговой массив.

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

Я позаботился о том, чтобы всегда было как минимум 2 стёртых «блока стирания», готовых для записи. После записи записи, если после нее оставалось только 2 «стертых блока», которые были пустыми, я безоговорочно удалял самый старый блок данных - 3-й блок самых старых данных после 2 «стертых блоков». (Ближе к концу флеш-памяти «после» означает «переход к началу флеш-памяти». (Возможно, одного стертого блока было бы достаточно - я забыл, почему мне показалось, что мне нужно как минимум 2, а иногда и 3). ,

Я точно забыл, сколько записей я поместил в каждый «блок стирания», но я позаботился о том, чтобы у меня никогда не было записей, перекрывающих два блока стирания - первые 2 байта каждого блока стирания флэш-памяти были либо «стертым» значением 0xFFFF, либо первые два байта контрольной суммы Fletcher-16 (которая никогда не равна 0xFFFF) в заголовке каждой записи.

Это позволило быстро сканировать его при следующем включении и найти заголовок циклического журнала - мне нужно было только взглянуть на первые два байта каждого блока стирания, чтобы различить «стертые» и «блоки данных». (Я немного беспокоился о «сбое питания в середине стирания блока», в результате чего первые два байта были стерты до 0xFFFF, но оставил не стертые байты в середине блока, поэтому я написал код для проверки микроконтроллером для этого и перезапустите процесс «стереть блок»).

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

davidcary
источник
Ваш подход звучит несколько похоже на мой. Я бы предложил добавить еще один небольшой поворот: зарезервируйте пару байтов в каждом блоке, чтобы указать, что он «запущен» и «заполнен». Все блоки, кроме стертых, должны иметь запрограммированные биты запуска. Когда пришло время стереть блок, установите «полный» байт в последнем байте данных, затем стерте блок, а затем немедленно установите «начальный» бит самого старого стертого блока. При запуске, если вы видите, что «последний» блок является «полным», а не «запущенным», повторите удаление.
суперкат
Такой подход может показаться излишним, но если флэш-блок частично стерт, байты могут произвольно принять решение прочитать FF или что-то еще. Тот факт, что блок выглядит пустым, не является гарантией того, что биты не появятся там самопроизвольно. Если вы теряете мощность во время удаления, подождите немного при следующем запуске, а затем повторите удаление, даже если блок кажется пустым .
суперкат
Спасибо за информацию, я посмотрю на нее немного глубже, когда я на самом деле нажму на код для флэш-памяти и дам вам знать, что происходит.
Крис Баннсен,
@supercat: Спасибо, это звучит как отличная идея.
Дэвидкари
@ davidcary: я не знаю, что у меня когда-либо был блок, который выглядел полностью пустым и отсутствовал, но у меня был блок, который давал бы разные результаты при последовательных чтениях. Возможно, что блок был неверно прочитан как пустой, мой код все равно пытался его запрограммировать, что привело к нечетной путанице новых запрограммированных данных и старому мусору с прерывистым стиранием. В любом случае, сценарий, в котором блок иногда будет казаться пустым, вряд ли является нереальным.
Суперкат
0

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

Обратите внимание, что я не проверял их ни в каком качестве, но они делают именно то, что искал исходный вопрос: «... структура данных, которая представляет собой набор изменяемых файлов с произвольным доступом ...»

https://github.com/ARMmbed/littlefs - Создано ARM, лицензировано BSD

https://github.com/joembedded/JesFs - на самом деле не похоже на лицензию, но было специально разработано для SPI NOR flash.

Крис Бансен
источник