В настоящее время я работаю над проектом, который предполагает быструю непрерывную регистрацию довольно специфичной для приложения метрики в течение длительного срока. Для этого я использовал NXP M0 и флэш-чип SPI 32 МБ. Регистрация ведется непрерывно и должна длиться много лет в полевых условиях (10+) и периодически проверяется человеком на предмет выявления тенденций. В конце концов буфер заполняется и начинает перезаписывать старые данные, что совершенно нормально. Я придумал простой алгоритм обхода всего флэш-устройства, чтобы найти текущую головку после включения питания (устройство довольно часто выключается вне моего контроля), поэтому ведение журнала может просто продолжаться с того места, где оно остановилось. Я могу просто перебрать силу и пройти это с ~ 4s в худшем случае.
Это заставило меня задуматься, существуют ли какие-либо файловые системы со структурой журналов, предназначенные для флэш-устройств и микроконтроллеров? JFFS и все другие хорошо известные структурированные журналы FS, которые я представляю, были бы немного тяжелыми для простого микроконтроллера (конечно, зависит от применения). Чтобы быть более конкретным, я хотел бы знать о любых алгоритмах, которые специально разработаны для циклического журнала с быстрым временем поиска и / или алгоритмов, разработанных для «традиционной» файловой системы на флэш-устройстве, которое может быть запущено на микроконтроллер. Традиционно в этом смысле он находится на одном уровне с чем-то вроде JFFS, где есть структура данных, представляющая коллекцию изменяемых файлов произвольного доступа в иерархическом пространстве имен.
Ответы:
структура данных веревки
Я очарован структурой данных веревки, У меня есть хобби-проект, в котором я пытаюсь адаптировать его к микроконтроллеру с несколькими байтами ОЗУ, подключенными к огромной флэш-памяти, чтобы я мог вставлять, удалять и иным образом произвольно редактировать текст переменной длины в огромных текстовых файлах. Текстовые файлы слишком велики, чтобы поместиться в ОЗУ. Стирание последней половины файла и перезапись его во флэш-память, смещение на один байт, каждый раз, когда я вставляю или удаляю символ в середине текстового файла размером в несколько мегабайт, будет слишком медленным, но структура данных веревки может сделать это намного быстрее Поскольку структура данных веревки может представлять такие изменяемые файлы произвольного доступа с переменной длиной, как неизменяемые фрагменты фиксированной длины, кажется, что это хорошее совпадение с флэш-памятью - все изменения записываются в форме кругового журнала. Увы, все ошибки в моем коде еще не проработаны. :-(
хронологические журналы фиксированной длины
Я получил аналогичную систему циркулярного журнала для продукта, который помог разработать.
Я просто писал записи фиксированной длины одну за другой, заполняя flash как круговой массив.
(С полностью пустой флэш-памятью я начал записывать записи примерно за 3 блока до конца массива, поэтому я мог протестировать циклический переход после того, как было сохранено только несколько записей данных, вместо того, чтобы начинать с нуля записи и ждать данные за месяц, которые нужно записать, прежде чем узнавать, что в моем циклическом коде произошла ошибка).
Я позаботился о том, чтобы всегда было как минимум 2 стёртых «блока стирания», готовых для записи. После записи записи, если после нее оставалось только 2 «стертых блока», которые были пустыми, я безоговорочно удалял самый старый блок данных - 3-й блок самых старых данных после 2 «стертых блоков». (Ближе к концу флеш-памяти «после» означает «переход к началу флеш-памяти». (Возможно, одного стертого блока было бы достаточно - я забыл, почему мне показалось, что мне нужно как минимум 2, а иногда и 3). ,
Я точно забыл, сколько записей я поместил в каждый «блок стирания», но я позаботился о том, чтобы у меня никогда не было записей, перекрывающих два блока стирания - первые 2 байта каждого блока стирания флэш-памяти были либо «стертым» значением 0xFFFF, либо первые два байта контрольной суммы Fletcher-16 (которая никогда не равна 0xFFFF) в заголовке каждой записи.
Это позволило быстро сканировать его при следующем включении и найти заголовок циклического журнала - мне нужно было только взглянуть на первые два байта каждого блока стирания, чтобы различить «стертые» и «блоки данных». (Я немного беспокоился о «сбое питания в середине стирания блока», в результате чего первые два байта были стерты до 0xFFFF, но оставил не стертые байты в середине блока, поэтому я написал код для проверки микроконтроллером для этого и перезапустите процесс «стереть блок»).
Пожалуйста, сообщите мне, если вы найдете другие дружественные для флэш-памяти структуры данных или файловые системы
источник
Прошло уже довольно много лет, но я хотел бы продолжить, если кто-нибудь еще пройдет мимо. Похоже, что в настоящее время существует несколько проектов, которые активно поддерживаются (по состоянию на январь 2020 года) и представляют собой файловые системы, предназначенные для микроконтроллеров, предназначенных для флэш-памяти NOR SPI.
Обратите внимание, что я не проверял их ни в каком качестве, но они делают именно то, что искал исходный вопрос: «... структура данных, которая представляет собой набор изменяемых файлов с произвольным доступом ...»
https://github.com/ARMmbed/littlefs - Создано ARM, лицензировано BSD
https://github.com/joembedded/JesFs - на самом деле не похоже на лицензию, но было специально разработано для SPI NOR flash.
источник