Во-первых, управление блокировкой:
Поместите меньший заголовок в начале каждого блока. Главное, что вам нужно для отслеживания «самого старого» и «самого нового», — это номер блока, который просто увеличивается по модулю k. k должно быть больше общего количества блоков. В идеале сделайте k меньше вашего максимального значения (например, 0xFFFF), чтобы вы могли легко определить, что является стертым блоком.
При запуске ваш код по очереди считывает заголовки каждого блока и находит первый и последний блоки в последовательности ni+1 = (ni + 1) ПО МОДУЛЮ k. Будьте осторожны, чтобы не запутаться со стертыми блоками (номер блока, например, 0xFFFF) или данными, которые каким-либо образом повреждены (например, неполное стирание).
В каждом блоке
Каждый блок изначально начинается пустым (каждый байт равен 0xFF). Каждая запись просто пишется одна за другой. Если у вас есть записи фиксированного размера, вы можете получить к ним доступ с помощью простого индекса. Если у вас есть записи переменного размера, то для их чтения вам придется сканировать с начала блока в стиле связанного списка.
Если вы хотите иметь записи переменного размера, но избегаете линейного сканирования, вы можете иметь четко определенный заголовок для каждой записи. Например. используйте 0 в качестве разделителя записи и COBS-encode (или COBS/R-encode ) каждой записи. Или используйте байт по вашему выбору в качестве разделителя и «экранируйте» этот байт, если он встречается в каждой записи (аналогично протокол PPP).
При запуске, как только вы узнаете свой последний блок, вы можете выполнить линейное сканирование для последней записи. Или, если у вас есть записи фиксированного размера или разделители записей, вы можете выполнить двоичный поиск.
Удалить расписание
Для некоторых микросхем флэш-памяти стирание блока может занять значительное время. 5 секунд. Подумайте о том, чтобы запланировать стирание как фоновую задачу немного «заблаговременно». Например. когда текущий блок заполнен на x%, начните стирать следующий блок.
Нумерация записей
Возможно, вы захотите пронумеровать записи. Раньше я делал это так: в заголовке каждого блока помещался номер первой записи. Затем программа должна вести подсчет номеров каждой записи в блоке.
Контрольная сумма или CRC
Если вы хотите обнаружить поврежденные данные (например, незавершенную запись или стирание из-за неожиданного сбоя питания), вы можете добавить контрольную сумму или CRC к каждой записи и, возможно, к заголовку блока. Обратите внимание, что CRC заголовка блока будет охватывать только сам заголовок, а не записи, поскольку его нельзя перезаписывать при записи каждой новой записи.
person
Craig McQueen
schedule
03.11.2009