Memoria persistente en msp430 sin FRAM

1 respuesta

1

Se pueden usar muchos enfoques diferentes para usar un dispositivo de memoria flash para emular un almacenamiento de memoria no volátil [es decir, algo que puede acomodar pequeñas actualizaciones frecuentes, a diferencia de actualizaciones grandes pero poco frecuentes]. He utilizado varios enfoques diferentes en varias aplicaciones (y algunas veces combiné múltiples enfoques dentro de una aplicación), ya que ningún enfoque único será óptimo para todos los propósitos (mucho dependerá de la frecuencia de las actualizaciones, la cantidad de información que cambia con frecuencia). , etc.) Otra cosa importante a considerar es la probabilidad de escrituras parciales o borrados parciales. En muchas situaciones, puede ser razonable esperar que, en caso de un corte de energía, las tapas de derivación puedan suministrar suficiente energía para completar cualquier operación de escritura que se haya iniciado, pero no lo suficiente para completar cualquier borrado. Si un borrado es interrumpido por una pérdida de energía, uno no debe hacer suposiciones sobre el estado de la memoria borrada, incluso si aparece en blanco . Es completamente posible que los bytes de datos en un bloque parcialmente borrado estén en un estado extraño que a veces se lee como FF y otras como otra cosa. En consecuencia, cada vez que se borre un bloque de memoria, debería haber algo escrito en alguna otra área de memoria de otro que indique eso.

Si hay cuatro o más bloques flash que se pueden borrar por separado, puede ser útil escribirlos en rotación, manteniendo el invariante de que algún byte en particular (por ejemplo, el primer byte de cada bloque) se programará en cada bloque, excepto para el bloque donde se escriben los nuevos datos y el bloque que sigue (ajuste), que se debe suponer que no es válido. Si no hay espacio para escribir más datos en el bloque actual, borre el siguiente bloque (sin tener en cuenta si ya está en blanco), escriba lo necesario para que sea válido y, finalmente, programe el primer byte del bloque que se acaba de rellenar (bautizar el bloque recién borrado como el nuevo lugar para colocar datos). Tenga en cuenta que el código de encendido que intenta decidir qué bloque debe contener los datos recién escritos puede leer el primer byte de un bloque que se borró parcialmente, pero el patrón de programación en los otros bloques será tal que no lo hará. importa si esa página se lee como está programada o no.

Si utiliza este método y desea utilizar un número determinado de, por ejemplo, Los bloques flash de 4Kbytes para simular una memoria RAM de 255 bytes (no 256), se podrían usar los bytes 1-255 del bloque "que se está escribiendo actualmente" para contener el contenido de la memoria RAM desde el momento en que el programa comenzó a escribir en ese bloque ; el resto del bloque usaría pares de bytes para almacenar los cambios. Si el primer byte en un par no es FF, el segundo byte indicará el valor del byte RAM correspondiente. Al escribir en un byte de RAM, identifique el último par que no se lee como FFFF, escriba el segundo byte de ese par con el nuevo valor de ese byte de RAM, y luego escriba el primer byte de el par con la "dirección". Tenga en cuenta que si la energía falla entre la escritura de datos y la escritura de dirección, habrá un "registro" con un campo de datos que no es FF pero una dirección FF; la siguiente escritura debe ir después de eso.

Usando este enfoque, si uno hubiera p. ej. 64K de flash con 100,000 ciclos de borrado, uno podría acomodar aproximadamente 3,200,000,000 operaciones discretas de actualización de parámetros. Si con frecuencia se escriben varios bytes a la vez, o si se necesita simular una RAM de más de 255 bytes, se podrían usar otros métodos; las 3,200,000,000 de actualizaciones discretas probablemente se encuentren dentro de un factor de dos del número óptimo que uno podría esperar lograr en ausencia de una interrupción de advertencia de alimentación anticipada (tal interrupción podría permitir que uno renuncie a escribir cualquier actualización para que parpadee hasta que se apague la alimentación). -la interrupción se dispara, lo que permite actualizar los parámetros un número ilimitado de veces).

    
respondido por el supercat

Lea otras preguntas en las etiquetas