EEPROM потому как оный в большинстве случаев лежит "мёртвым грузом". В лучшем случае хранит какой-нить сериал и с десяток параметров :) В общем - дармовая память :) у меня сделан кольцевой буфер во встроенном еепроме (для внешнего на SPI, будет так же).
первым байтом по указателю на свободный EEPROM-байт, пишется длина сообщения (включая КС), вторым его номер, далее само тело, в конце CRC16 CCITT. Пишу побайтно. Есть жирный электролит в питании (как правило 470-1000мкф, через шоттку, которого гарантированно хватает на запись десятка байт, да если и не хватит на весь вектор - не беда :) Просто запись будет считаться битой :)
по старту просматриваю весь журнал и определяю его конец (по CRC, и заголовкам записей), потом в ОЗУ пишу EEPROM-адрес первой свободной ячейки. Формат записей разный, для разных проектов. Где-то вообще без меток времени, где-то внутренние часики, где-то настоящее время с RTC.
ПРограммно можно извращаться по разному, но аппаратно, главное - грамотно мониторить падение питания, обеспечить буферную ёмкость для записи, чтобы корректно её завершить (если вектор длинный, и не укладывается во временной лимит, то можно не завершать его запись. Главное - блокировать процедуру записи, дописав корректно текущий байт, и уходить в глухой цикл пока питание не упадёт до нижней границы допустимого, после чего затыкаем проц внутренним или внешним BODом.
При пропадании питания, пишется специальная запись "PowerFail" (4..8байт), а затем основная статистика работы. А вообще
ну как-то так.
...делать нужно так, как нужно. А как ненужно - делать не нужно (С) Винни-Пух :)