Reescribiendo páginas DataFlash

2

Atmel recomienda:

  

"si las operaciones de reprogramación ocurren de manera aleatoria en la que cualquier número de páginas es
  actualizado en un orden aleatorio, entonces el sistema debe garantizar que cada página de la matriz de memoria Serial DataFlash se actualice / reescriba al menos una vez dentro de cada 10,000 operaciones de reprogramación de páginas acumulativas "(http://www.piclist.com/techref/atmel/ doc0842.pdf)

Hay un algoritmo propuesto para reescribir páginas, que utiliza el puntero de dirección de página (o contador de reprogramación de página). Mi pregunta es ¿cuál es el lugar correcto para este puntero / contador? ¿Una de las páginas de DataFlash?

    
pregunta

3 respuestas

1

Si es posible, es bueno mantener un número como ese en el software (preferiblemente RAM, posiblemente EEPROM) del dispositivo (por ejemplo, microcontrolador) que controla el flash.

Si tiene que hacerlo en ese dispositivo flash, es posible que desee aprovechar los 8 bytes adicionales por cada página flash de 256 bytes en ese dispositivo para almacenar los punteros; ese es uno de los usos sugeridos.

  

"Los diseñadores de sistemas pueden usar todos   264 bytes de la página para almacenar datos.   Alternativamente, los 8 bytes extra por   La página puede usarse para la detección de errores.   y mecanismos de corrección (EDC) o   información de control asociada, tal   Como punteros, banderas y mensaje telefónico.   direcciones de enrutamiento ".

    
respondido por el Windell Oskay
0

Así es como hago esto para guardar un búfer circular en flash.

Reserve una página (528 bytes) para el Índice. Los primeros 16 bytes son una máscara de bits. El primer 0 en la máscara de bits es la posición de desplazamiento del último valor del índice. Así que la primera página tiene 16 bytes para la máscara de bits seguida de 128 valores de 4 bytes para el Índice.

A medida que escribe en el búfer circular, debe guardar el nuevo valor de índice. Haga esto derribando el siguiente bit '1' en la máscara de bits a un '0' y escribiendo el Índice en esta posición de desplazamiento. Deberá ejecutar un comando "Programa sin borrar" para el flash.

Una vez que todos los bits en la máscara de bits son '0', debes borrar la página y comenzar de nuevo.

    
respondido por el Robert
0

Otra alternativa:

Reserve un bit "reescrito recientemente" en cada página de la memoria de ese chip flash. (Tal vez almacene ese bit en uno de los 8 bytes "adicionales" por página).

Como sugiere la hoja de aplicaciones, cada vez que la aplicación escribe en una página aleatoria, también vuelva a escribir otra página que no haya sido reescrita por un tiempo. Para encontrar esa otra página, escanee todos los bits "recientemente reescritos" buscando un bit "0". El primer "0" bit que encuentre corresponde a la página específica que se va a reescribir. Una vez que lo haya encontrado, vuelva a escribir los datos en la página mientras borra el bit "recientemente reescrito" a "1".

Dado que escanea en orden secuencial, los bits "reescritos recientemente" hacia el principio son todos "1", y los bits hacia el final son todos "0".

(Opcionalmente, mantenga un puntero en la RAM apuntando a la página con la última página con un bit "1" "recientemente reescrito", o la primera página con un bit "0", para que pueda comenzar la búsqueda desde ese punto, en lugar de comenzando desde la página 0 cada vez).

Cuando realice la búsqueda, y la CPU no pueda encontrar ninguna páginas que deban reescribirse (cada bit "recientemente reescrito" es un "1"), luego programe cada "reescrito recientemente "bit a" 0 ", comenzando con ese bit en la página de flash 0. (Puede programar solo un bit por página sin borrar toda la página).

En el momento del arranque, cuando se conecta la alimentación por primera vez, deberá comprobar si el flash está en el estado "normal": todas las páginas hacia el principio tienen un bit "1" "recientemente reescrito", y todas las páginas hacia el final tienen un bit "0" . Cualquier otra cosa indica el estado "interrumpido", en el medio de la programación todos los "bits que se deben volver a escribir" en "0", en cuyo caso la CPU debería terminar de programar todos esos bits "recientemente reescritos" en "0".

(Supongo que podría, en lugar de almacenar ese bit dentro de su página correspondiente, Empaque todos esos bits en una matriz de bits y guárdelos en unas pocas páginas de flash que reserve para ese uso. Por ejemplo, el séptimo bit en esa matriz corresponde a la séptima página de flash. En ese caso, probablemente querrá invertir el significado del bit y programarlo a "0" cuando la página correspondiente se borre y se vuelva a escribir, y de vez en cuando, cada vez que descubra que cada página tiene una "0" bit, borra todos esos bits a "1". El resultado es aproximadamente el mismo que lo que sugiere rdeml).

    
respondido por el davidcary

Lea otras preguntas en las etiquetas