Pregunta

necesito para almacenar artículos de diversa longitud en una cola circular en un chip flash. Cada elemento tendrá su encapsulación por lo que puedo entender lo grande que es y dónde empieza el siguiente elemento. Cuando hay suficientes elementos en la memoria intermedia, bajara hasta el principio.

¿Qué es una buena manera de almacenar una cola circular en un chip flash?

Hay una posibilidad de decenas de miles de artículos me gustaría almacenar. Así que comenzar por el principio y la lectura al final del búfer no es lo ideal, ya que tendrá tiempo para buscar hasta el final.

Además, debido a que es circular, tengo que ser capaz de distinguir el primer elemento de la última.

El último problema es que esta se almacena en flash, si se borran cada bloque es a la vez mucho tiempo y solo se puede realizar un número determinado de veces para cada bloque.

¿Fue útil?

Solución

En primer lugar, la gestión de bloques:

Ponga una pequeña cabecera al comienzo de cada bloque. Lo principal que hay que hacer un seguimiento de los "más" y "más reciente" es un número de bloque, que simplemente incrementa en módulo k . k debe ser mayor que su número total de bloques. Idealmente, hacer k menos de su valor máximo (por ejemplo 0xFFFF) por lo que puede decir fácilmente lo que es un bloque borrado.

En el arranque, el código lee las cabeceras de cada bloque a su vez, y localiza la primera y última bloques en la secuencia que es n i + 1 = (n i + 1) módulo k. Tenga cuidado de no confundirse con bloques borrados (número de bloque es 0xFFFF por ejemplo) o los datos que de alguna manera está dañado (por ejemplo, borrado incompleto).

Dentro de cada bloque

Cada bloque comienza inicialmente vacía (cada byte es 0xFF). Cada registro se anota una tras otra. Si tiene registros de tamaño fijo, entonces se puede acceder a ella con un índice simple. Si tiene registros de tamaño variable, y luego de leerlo usted tiene que escanear desde el inicio del bloque, el estilo de lista enlazada.

Si usted quiere tener registros de tamaño variable, pero evite exploración lineal, entonces usted podría tener un encabezado bien definido en cada registro. P.ej. 0 utilizar como un delimitador de registro, y MAZORCAS -encode (o / R -encode ) cada registro. O utilizar un byte de su elección como un delimitador, y 'escape' ese byte si se produce en cada registro (similar a la PPP protocolo ).

En el arranque, una vez que conozca su último bloque, se puede hacer una exploración lineal para el último disco. O registros o delimitadores de registro de tamaño fijo, si usted tiene, usted podría hacer una búsqueda binaria.

Borrar la programación

Para algunos chips de memoria flash, borrando un bloque puede tomar mucho tiempo - por ejemplo. 5 segundos. Considere programar un borrado como una tarea en segundo plano un poco "antes de tiempo". P.ej. cuando el bloque actual es x% de su capacidad, a continuación, comenzar a borrar el siguiente bloque.

numeración Registro

Es posible que desee los registros de número. La forma en que lo he hecho en el pasado es poner, en la cabecera de cada bloque, el número de registro del primer registro. A continuación, el software tiene que llevar la cuenta de los números de cada registro dentro del bloque.

suma de comprobación o CRC

Si desea detectar datos corruptos (por ejemplo, escribe o borra debido a la falta de energía inesperada incompleto), entonces se puede añadir una suma de comprobación o CRC para cada registro, y tal vez a la cabecera del bloque. Tenga en cuenta la cabecera del bloque CRC sólo cubriría la cabecera en sí, no a los registros, ya que podría no ser re-escrito cuando cada nuevo registro está escrito.

Otros consejos

Mantener un bloque independiente que contiene un puntero al comienzo del primer registro y el final del último registro. También puede mantener más información como el número total de registros, etc.

Hasta que en un inicio se queda sin espacio, la adición de registros es tan simple como escribir a la final del búfer y actualizar el puntero de cola.

A medida que necesita para recuperar espacio, eliminar registros suficientes para que pueda adaptarse a su registro actual. Actualizar el puntero de cabeza mientras se eliminan registros.

Usted necesitará hacer un seguimiento de la cantidad adicional de espacio se ha liberado. Si se mantiene un puntero al final de la última grabación, la próxima vez que necesite añadir un registro, se puede comparar eso con el puntero al primer registro para determinar si es necesario eliminar cualquier más registros.

Además, si esto es NAND, usted o el controlador de flash se tiene que hacer el desbloqueo y el desgaste de nivelación, sino que debe estar todo en una capa inferior de asignar espacio para el buffer circular.

Creo que ahora lo entiendo. Parece que el problema más grande será, después de haber llenado el espacio disponible para la grabación, lo que sucede a continuación? Los nuevos datos deben sobrescribir los datos más antiguos, que es creo lo que entendemos por un buffer circular. Pero ya que los datos no se fija la longitud puede sobrescribir más de un registro.

Estoy asumiendo que la cantidad de variabilidad en la longitud es suficientemente alto para que el relleno de todo lo que fuera a una longitud fija no es una opción.

Su segmento de escritura necesita para realizar un seguimiento de la dirección que representa el inicio del siguiente registro a escribir. Si se conoce el tamaño de un bloque a escribir antes de tiempo, se puede decir si va a terminar al final de la memoria intermedia lógica y empezar de nuevo a '0'. No me dividir un registro con un poco al final y algunos al principio.

Un registro separado puede seguir el principio; este es el dato más antiguo que no ha sido sobrescrito todavía. Si usted fue a la lectura de los datos aquí es donde comenzaría.

El escritor de datos y luego comprobaría, dada la dirección de escritura de inicio y la longitud de los datos de su punto de cometer, si se debe volcar el registro de lectura, que examinaría el primer bloque y ver la longitud, y avanzar a la siguiente registro, hasta que haya suficiente espacio para escribir lo que será la información. Habrá una brecha de datos basura que vive entre el final de los datos escritos y el inicio de los datos más antiguos, probablemente. Pero de esta manera, sólo puede estar escribiendo una dirección o dos como gastos generales, y no la reordenación de los bloques.

Al menos, eso es probablemente lo que haría. HTH

veo tres opciones:

option1: es rellenar todo lo que fuera al mismo tamaño, esto es simple, almacenar un puntero a la cabeza y la cola de la memoria intermedia para que sepa dónde escribir y dónde comenzar a leer desde, utiliza el tamaño de cada objeto a conseguir un desplazamiento a la siguiente, esto significa que debe de atravesar el búfer como lo haría con una lista enlazada, también conocido como su lenta si se necesita el artículo 5000.

opcion2: es almacenar sólo los punteros a los datos reales en el buffer circular, de esa manera cuando bucle alrededor de usted no tiene que lidiar con el tamaño mis-matchs. si almacena los datos reales en un buffer circular y no lo hace la almohadilla hacia fuera usted podría funcionar en unas situaciones en las que su Witting sobre varios elementos, con 1 nuevo objeto de datos, supongo que esto no es aceptable.

almacenar los datos reales en otras partes de flash, la mayoría de flash tendrá algún tipo de nivelación de desgaste integrada y si por lo que no necesita preocuparse por sobrescribir el mismo lugar varias veces, el CI averiguar dónde realmente almacenarlo en el chip, acaba de escribir para al siguiente espacio libre disponible.

Esto significa que necesita para elegir un tamaño máximo de la memoria intermedia circular de cómo se hace esto depende de la variabilidad de los datos. Si el tamaño de los datos simplemente cambia mucho, por decir sólo unos pocos bytes, entonces sólo debe almohadilla hacia fuera y la opción 1. Uso Si cambia el tamaño violentamente y de manera impredecible, elegir el tamaño más grande que podría ser y averiguar cuántos objetos de ese tamaño podría encajar en su flash, usar eso como el número máximo de entradas en la memoria intermedia. Esto significa que los residuos un montón de espacio.

Opción 3: si el objeto puede realmente ser de cualquier tamaño, su en el punto en el que sólo debe utilizar un sistema de archivos, el nombre de los archivos en orden y bucle de nuevo cuando su mantenimiento completo en cuenta si la nueva entrada es grande se puede tiene que eliminar varias entradas antiguas a entrar. Esto es en realidad una extensión de la opción 2 como opcion2 es en muchos aspectos un sistema simple de archivos.

El "circular" en un instante se puede hacer sobre la base de tamaño de bloque, lo que significa que se debe declarar cuánto bloques del flash que asignar a este buffer.

El tamaño real de la memoria intermedia será en cada momento en particular entre n-1 (n es el número de bloques) y n.

Cada bloque debe comenzar con una cabecera que contiene el número secuencial o marca de tiempo que podría ser utilizado para determinar qué bloque es mayor que el otro.

Cada artículo encapsulado con un encabezado y un pie de página. el encabezado predeterminado contiene lo que quiera pero de acuerdo con esta cabecera que debe conocer el tamaño del elemento. El pie de página predeterminado es 0xFFFFFFFF. Este valor indica una terminación nula.

En la memoria RAM debe guardar un puntero al bloque más antiguo y el último bloque y puntero sobre el objeto más antiguo y más reciente artículo. Al encender usted se pasa de todos los bloques encontrar los bloques correspondientes y carga Esta miembros.

Cuando se desea almacenar un nuevo elemento, que comprueba si el último bloque contiene suficiente espacio para este artículo. Si lo hace se guarda el elemento al final del punto anterior y el cambio del pie de página anterior para señalar a este elemento. Si no contiene suficiente espacio que necesita para borrar el bloque más antiguo. Antes de borrar este bloque Cambiar los miembros más antiguos de bloque (RAM) al punto en el próximo bloque y el elemento más antiguo a punto en el primer elemento de este bloque. A continuación, puede guardar el nuevo elemento en este bloque y cambiar el pie de página de la última elemento a señalar este artículo.

Sé que la explicación puede parecer complicado, pero el proceso es muy simple y si usted lo escribe corregir se puede hacer incluso a prueba de fallos de potencia (siempre tener en mente que el orden de las escrituras).

Tener en cuenta que la circularidad de la memoria intermedia no se guarda en el flash, pero el flash sólo contiene unos bloques con elementos que se pueden decidir de acuerdo a los bloques encabezados y artículos cabeceras de lo que es el orden de estos elementos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top