Algunas preguntas generales de NAND flash

2

Tengo algunas preguntas sobre nand recuerdos.

  1. ¿Debemos borrar todo el bloque para volver a escribir una sola página?
  2. Si es verdadero, ¿cuál es el algoritmo? Almacenar en caché todo el bloque > editar una página > borrar todo el bloque > escribir bloque entero?
  3. ¿Cómo funciona la entrada de datos aleatorios? ¿Necesitamos borrar el bloque para ingresar pocos bytes en modo aleatorio?

p.s. Estoy escribiendo la aplicación MSD con STM32F207ZG mcu + K9F1G08U0B nand

EDITAR para novatos como yo

Cómo funciona NAND Flash:

Podemos realizar lectura y escritura en la página o utilizar entradas aleatorias o salidas aleatorias en cualquier página. No hay nada especial en la lectura, pero escucho que la lectura, como la escritura, puede llevar páginas.

Después de borrar todos los bits en el área borrada, se establece en 1, y cuando escribimos, solo establecemos algunos bits en 0. Una vez que el bit se establece en 0, no se puede establecer en 1 nuevamente, solo se puede establecer el bit en 1 borrando la región que contiene ese bit. Como consecuencia, si necesitamos completar alguna región con 0x00, no necesitamos borrar esta región.

Y nota: el borrado se puede realizar solo en bloques (no en páginas). Descubrí que cuando especifique la dirección de la página para borrar, el bloque que contiene esa página se borrará. Por lo tanto, debemos especificar no un número de bloque para borrar, sino, por ejemplo, el número de la primera página en el bloque.

Espero que esta información sea correcta y que sea útil para alguien. Lo siento por mi inglés roto;)

Gracias a Supercat por la explicación.

    
pregunta The Architect

1 respuesta

3

Si la interoperabilidad con otros sistemas no es necesaria, su elección de algoritmos dependerá de los recursos que tenga disponibles (principalmente RAM) y sus patrones de uso. Si puede arreglárselas con la granularidad a nivel de bloque, y si no se tendrá que volver a escribir ningún bloque demasiadas veces, el enfoque más simple es simplemente asignar páginas lógicas directamente a bloques físicos fijos. Algunas aplicaciones son susceptibles a tal enfoque, pero otras no. En general, lo que se hace es tener direcciones de página lógicas y mantener una tabla de dónde se almacena actualmente cada página en el chip. Cuando se debe cambiar una página, se selecciona una nueva ubicación en blanco para ella, los datos se escriben allí, la tabla de ubicación se actualiza y la página antigua se invalida. Si después de dicha operación, un bloque contiene muchas páginas no válidas y ninguna válida, bórrelo. Si el número de páginas en blanco es bajo, el sistema debe identificar un bloque que contenga muchas páginas no válidas y mover las páginas aún válidas a nuevas ubicaciones en otros bloques, e invalidar las copias en las ubicaciones antiguas; Una vez hecho esto, el bloque no contendrá más páginas válidas y, por lo tanto, podrá borrarse.

Este enfoque tiene muchas variaciones basadas en cosas como la cantidad de RAM disponible para las tablas de páginas, la cantidad de tiempo que uno está dispuesto a dedicar a buscar páginas, etc. Si la cantidad de páginas es demasiado grande para mantener un espacio completo. en la memoria, puede ser necesario almacenar algo de la tabla en flash. Si se hace esto, puede ser útil tener una asignación virtual entre los números de bloque lógicos y los bloques físicos, y hacer que la operación de "limpieza" encuentre un nuevo bloque en blanco, copie todas las páginas válidas del bloque anterior a las páginas correspondientes en el nuevo, y asigne al nuevo bloque el mismo número de bloque lógico que tenía el anterior. Si uno hace esto, puede evitar actualizar las tablas que contienen las ubicaciones de las páginas dentro del bloque.

    
respondido por el supercat

Lea otras preguntas en las etiquetas