La técnica que yo uso normalmente es el prefijo de los datos con un 4-byte rolling número de secuencia donde se encuentra el mayor número representa la última / valor actual. En el caso de almacenamiento de 2 bytes de datos reales que daría 6 total de bytes y luego me formulario en una cola circular de acuerdo así que para 128 bytes de memoria EEPROM que contiene 21 de entradas y aumentar la resistencia de 21 veces.
Luego cuando arranque el mayor número de secuencia se puede utilizar para determinar tanto el número de secuencia siguiente para ser utilizado y el actual de la cola de la cola. La C siguiente pseudo-código de la muestra, esto supone que al inicio de la programación de la EEPROM de la zona ha sido borrada a los valores de 0xFF así que ignorar un número de secuencia de 0xFFFF:
struct
{
uint32_t sequence_no;
uint16_t my_data;
} QUEUE_ENTRY;
#define EEPROM_SIZE 128
#define QUEUE_ENTRIES (EEPROM_SIZE / sizeof(QUEUE_ENTRY))
uint32_t last_sequence_no;
uint8_t queue_tail;
uint16_t current_value;
// Called at startup
void load_queue()
{
int i;
last_sequence_no = 0;
queue_tail = 0;
current_value = 0;
for (i=0; i < QUEUE_ENTRIES; i++)
{
// Following assumes you've written a function where the parameters
// are address, pointer to data, bytes to read
read_EEPROM(i * sizeof(QUEUE_ENTRY), &QUEUE_ENTRY, sizeof(QUEUE_ENTRY));
if ((QUEUE_ENTRY.sequence_no > last_sequence_no) && (QUEUE_ENTRY.sequence_no != 0xFFFF))
{
queue_tail = i;
last_sequence_no = QUEUE_ENTRY.sequence_no;
current_value = QUEUE_ENTRY.my_data;
}
}
}
void write_value(uint16_t v)
{
queue_tail++;
if (queue_tail >= QUEUE_ENTRIES)
queue_tail = 0;
last_sequence_no++;
QUEUE_ENTRY.sequence_no = last_sequence_no;
QUEUE_ENTRY.my_data = v;
// Following assumes you've written a function where the parameters
// are address, pointer to data, bytes to write
write_EEPROM(queue_tail * sizeof(QUEUE_ENTRY), &QUEUE_ENTRY, sizeof(QUEUE_ENTRY));
current_value = v;
}
Para una pequeña memoria EEPROM 3-secuencia de bytes sería más eficiente, aunque requieren un poco de bits rebanar en lugar de utilizar tipos de datos estándar.