2009-11-18 22 views
5

Estoy tratando de desarrollar una estructura de historial de alarmas para almacenarla en una memoria flash no volátil. La memoria flash tiene un número limitado de ciclos de escritura, por lo que necesito una manera de agregar registros a la estructura sin volver a escribir todas las páginas flash en la estructura cada vez o escribir punteros actualizados en la cabecera/cola de la cola.Pila o cola del historial de alarmas?

Además, una vez que se ha utilizado el espacio disponible en la memoria flash, quiero comenzar a sobrescribir los registros previamente almacenados en flash comenzando con el primer registro agregado primero en entrar-primero en salir. Esto me hace pensar que un búfer circular funcionaría mejor para agregar elementos. Sin embargo, al ver los registros, quiero que la estructura funcione como una pila. P.ej. Los registros se mostrarán en orden cronológico inverso último en entrar-primero en salir.

Tamaño de estructura, encabezado, cola, índices no pueden almacenarse a menos que estén almacenados en el registro en sí ya que si se escriben cada vez a una ubicación fija, excederían los ciclos de escritura máximos en la página donde fueron almacenados .

¿Debo usar una pila, una cola o alguna estructura híbrida? ¿Cómo debo almacenar la información de cabeza, cola, tamaño en flash para que pueda volver a inicializarse después del encendido?

+0

¿Está trabajando directamente en flash o está utilizando un sistema de archivos en flash? – stefaanv

+0

Sin sistema de archivos. Escribir para flashear directamente. – mjh2007

Respuesta

4

búsqueda ring-buffer

Suponiendo que se puede trabajar fuera, que es la última entrada (de una marca de tiempo, etc por lo que no necesita escribir un marcador) esto también tiene el mejor rendimiento de nivelación de desgaste.

2

Editar: No se aplica al controlador de flash OP: No debe tener que preocuparse por wear leveling en su código. El controlador de memoria flash debe manejar esto detrás de las escenas.

Sin embargo, si todavía quiere seguir adelante y hacer esto, solo use un buffer circular regular, y keep pointers to the head and tail de la pila.

También podría considerar usar un Least Recently Used cache para administrar dónde en flash para almacenar datos.

+0

No es exactamente la nivelación del desgaste. Él tiene que concentrarse en escribir el menor número de veces posible. –

+0

Estoy bastante seguro de que el controlador de memoria flash no proporciona nivelación de desgaste. Estoy usando AT45DB642D. – mjh2007

+0

@ mjh2007: Tiene razón, ese controlador no parece tener una administración especial en su manual de especificaciones. –

0

Definitivamente quiere un buffer en anillo. Pero tienes razón, la metainformación es un poco ... interesante.

0

Localice sus entradas en varias secciones. Cuando las secciones están llenas, sobrescríbalo comenzando con la primera sección. Agregue un número de secuencia (nbr números de secuencia> 2 * entradas), por lo que al reiniciar sabrá cuál es la primera entrada.

0

Puede hacer una versión del anillo-buffer, donde el primer elemento almacenado en la página es el número de veces que esa página ha sido escrita. Esto le permite determinar dónde debe escribir a continuación al encontrar la primera página donde el número es más bajo que la página anterior. Si son todos iguales, empiezas desde el principio con el siguiente número.

Cuestiones relacionadas