24 votos

La nivelación del desgaste de un microcontrolador de la EEPROM

Por ejemplo: La hoja de datos para el ATtiny2313 (como la mayoría de Atmel AVR hojas de datos) de los estados:

128 Bytes En el Sistema Programable de la EEPROM de la Resistencia: 100,000 Escritura/Borrado Los ciclos de

Imagina un programa sólo requiere de dos bytes para almacenar la configuración, las otras 126 bytes son efectivamente se desperdicia. Lo que me preocupa es que las actualizaciones regulares de la configuración de los dos bytes que se pueden llevar a cabo el dispositivo de la EEPROM y la hacen inútil. Todo el dispositivo podría no ser fiable, porque en un momento determinado, simplemente no se puede seguir la pista de los cuales bytes en la EEPROM no son fiables.

Es allí una manera inteligente de hacer la nivelación del desgaste de un microcontrolador de la EEPROM cuando efectivamente el uso de sólo uno o dos bytes disponibles 128?

26voto

xilun Puntos 261

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.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X