En términos generales, la memoria flash funciona al proporcionar una operación de borrado que establece incondicionalmente los bits en un estado (por ejemplo, todos), y una operación de programa independiente que establece los bits de manera selectiva en el otro estado (por ejemplo, ceros).
Si se produce un fallo de alimentación durante cualquiera de las operaciones, es posible que no haya cambiado ninguno de los bits, algunos de los bits o todos los bits, y los bits pueden estar en un estado parcialmente modificado. En otras palabras, tienes que asumir que los contenidos no están definidos.
Cuando sabe que se ha producido un fallo de alimentación (o cualquier otro restablecimiento inesperado), necesita realizar verificaciones de integridad en las áreas afectadas de la memoria (suponiendo que sabe cuáles son) y reiniciar la operación interrumpida para poder realizar Seguro que todos los bits se cambian completamente.
Una forma de gestionar esto es aprovechar el hecho de que puede borrar una página de la memoria y luego programar los bits de forma selectiva en esa página de uno en uno. Esto se puede utilizar para crear un "cuadro de indicadores de estado" en el que graba sus intenciones antes de realizar una operación importante en un bloque de memoria. Si se produce una falla en el suministro eléctrico, solo debe mirar esta página del panel de resultados para determinar qué bloques de memoria pueden ser sospechosos y qué operación debe repetirse en ellos.
Una vez diseñé un sistema integrado que podría actualizar su firmware de forma remota. Para hacer que esto sea lo más robusto (e infalible) posible, reservo dos áreas de memoria flash que podrían contener una copia completa del firmware. Un área podría borrarse y programarse con una versión actualizada, mientras que la otra contenía la versión de trabajo existente. El "truco" fue que mantuve el byte de estado para cada área en la otra área . En cada reinicio, el código de inicio examinaría los dos bytes de estado para determinar qué área tenía una copia válida del firmware y si había operaciones parciales que debían completarse en cualquiera de las áreas.