Algoritmo de registro circular ligero (similar a un sistema de archivos) para almacenamiento basado en flash

8

Actualmente estoy trabajando en un proyecto que implica el registro rápido y continuo de una métrica específica de la aplicación durante una larga vida útil. Para hacer esto, terminé usando un NXP M0 y un chip flash de 32MiB SPI. El registro es continuo y debe durar muchos años en el campo (10+), y un humano lo verifica periódicamente para detectar tendencias. Finalmente, el búfer se llena y comienza a sobrescribir datos antiguos, lo que está perfectamente bien. Se me ocurrió un algoritmo simple para recorrer todo el dispositivo flash para encontrar el cabezal actual después de un encendido (el dispositivo se apaga con bastante frecuencia fuera de mi control) para que el registro pueda continuar donde lo dejó. Solo puedo hacer fuerza bruta en esta caminata y hacerlo con ~ 4s como peor escenario.

Esto me hizo pensar, ¿hay algún sistema de archivos de registro estructurado que esté dirigido a dispositivos flash y microcontroladores? JFFS y todos los demás conocidos Log FS estructurados Me imagino que sería un poco pesado Para un simple microcontrolador (depende de la aplicación, por supuesto). Para ser más específicos, me gustaría conocer cualquier algoritmo que esté diseñado específicamente para ser un registro circular con un rápido tiempo de búsqueda de cabezas y / o cualquiera que esté diseñado para un sistema de archivos "tradicional" en un dispositivo flash que pueda ejecutarse en un microcontrolador En este sentido, es tradicional estar a la par con algo como JFFS, donde hay una estructura de datos que representa una colección de archivos de acceso aleatorio mutables en un espacio de nombres jerárquico.

    
pregunta Kris Bahnsen

1 respuesta

2

estructura de datos de cuerda

Estoy fascinado por la estructura de datos de la cuerda . Tengo un proyecto de hobby que trata de adaptarlo a un microcontrolador con solo unos pocos bytes de RAM enganchados a una enorme memoria Flash, de modo que pueda insertar y eliminar y, de lo contrario, editar arbitrariamente texto de longitud variable en grandes archivos de texto. Archivos de texto demasiado grandes para caber en la memoria RAM. Borrar la última mitad del archivo y volver a escribirlo en flash, desplazado en un byte, cada vez que inserto o elimine un carácter en medio de un archivo de texto de varios megabytes, sería demasiado lento, pero la estructura de datos de cuerda Puede hacer esto mucho más rápido. Como la estructura de datos de la cuerda puede representar tales archivos de longitud variable de acceso aleatorio mutables como piezas de longitud fija inmutables, parece ser una buena combinación para la memoria flash: todas las ediciones se escriben de forma circular. Por desgracia, todos los errores aún no están resueltos en mi código. :-(

registros cronológicos de longitud fija

Obtuve un sistema de registro circular similar para un producto que ayudé a desarrollar.

Simplemente escribí registros de longitud fija uno tras otro, rellenando flash como una matriz circular.

(Con un flash completamente en blanco, comencé a escribir registros aproximadamente 3 bloques antes del final de la matriz, por lo que pude probar el resumen circular después de que solo se almacenaran unos pocos registros de datos, en lugar de comenzar en el registro cero y esperando que se escriba un mes de datos antes de descubrir que hubo un error en mi código de resumen).

Me aseguré de que siempre hubiera al menos 2 "bloques de borrado" borrados listos para escribir. Después de escribir un registro, si solo había 2 "bloques borrados" después de que estaban vacíos, borré incondicionalmente el bloque de datos más antiguo: el tercer bloque de datos más antiguos después de los 2 "bloques borrados". (Cerca del final de la memoria flash, "después de" significa "envolver al principio de la memoria flash). (Quizás un solo bloque borrado hubiera sido adecuado. Olvidé por qué pensé que necesitaba al menos 2 y, a veces, 3).

Olvidé exactamente cuántos registros puse en cada "bloque de borrado", pero me aseguré de que nunca tuve un registro entre dos bloques de borrado: los primeros 2 bytes de cada bloque de flash de borrado eran el valor "borrado" 0xFFFF, o los dos primeros bytes de una suma de comprobación Fletcher-16 (que nunca es 0xFFFF) en el encabezado de cada registro.

Eso hizo que la exploración de la próxima vez que se encendiera y la cabeza del registro circular fuera más rápida, solo tuve que mirar los dos primeros bytes de cada bloque de borrado para distinguir entre "borrado" y "datos" bloques (Estaba un poco preocupado por el "fallo de alimentación en el medio de borrar un bloque", lo que provocó que los dos primeros bytes se borraran a 0xFFFF pero dejé los bytes sin borrar en el medio del bloque, por lo que escribí un código para que el microcontrolador verificara para esto y reinicie el proceso de "borrar un bloque").

Por favor, dígame si encuentra otras estructuras de datos o sistemas de archivos compatibles con flash.

    
respondido por el davidcary

Lea otras preguntas en las etiquetas