Лично я предпочитаю формат с теговой таблицей.
В этом формате ваши данные разделяются на серию «таблиц». Каждая таблица имеет заголовок, который соответствует предсказуемому формату, и тело, которое может изменяться по мере необходимости.
Вот пример того, как будет выглядеть одна из таблиц:
Byte 0: Table Length (in 16-bit words)
Byte 1: Table ID (used by firmware to determine what this data is)
Byte 2: Format Version (incremented every time the format of this table changes)
Byte 3: Checksum (simple sum-to-zero checksum)
Byte 4: Start of body
...
Byte N: End of body
Я не хранил много данных, поэтому использовал каждый байт для каждого поля в заголовке. Вы можете использовать любой размер, который вам нужен, при условии, что вы никогда его не измените. Таблицы данных записываются одна за другой в EEPROM.
Когда вашей прошивке нужно прочитать данные из EEPROM, она начинает читать с первой таблицы. Если микропрограмма распознает идентификатор таблицы и поддерживает указанную версию таблицы, она загружает данные из тела таблицы (конечно, после проверки контрольной суммы). Если идентификатор, версия или контрольная сумма не проверены, таблица просто пропускается. Поле длины используется для поиска следующей таблицы в цепочке. Когда микропрограмма видит таблицу с нулевой длиной, она знает, что она достигла конца данных и что больше нет таблиц для обработки.
Я считаю этот формат гибким (я могу добавить любой тип данных в тело таблицы) и надежным (сохраняйте формат заголовка постоянным, и таблицы данных будут совместимы как с прямой, так и с обратной связью).
Есть несколько предостережений, хотя они не слишком обременительны. Во-первых, вы должны убедиться, что ваша прошивка может справиться со случаем, когда важные данные либо отсутствуют в таблице, либо используют версию неподдерживаемого формата. Вам также нужно будет инициализировать первый байт области памяти EEPROM нулем (чтобы при первой загрузке вы не начинали загрузку в мусоре, думая, что это данные). Поскольку каждая таблица знает свою длину, можно расширить или уменьшить таблицу; однако вам необходимо переместить остальную часть области хранения таблиц, чтобы не было «дыр» (если вся цепочка таблиц не помещается в памяти вашего устройства, тогда этот процесс может раздражать). Лично я не считаю, что что-то из этого является большой проблемой, и это стоит того, чтобы сэкономить на использовании других методов хранения данных.