¿Cómo protejo la tarjeta SD contra fallas inesperadas de energía?

18

Estoy trabajando en un dispositivo que utiliza la biblioteca Microchip MDDFS para almacenar datos en una tarjeta SD. El registrador registrará los datos a una velocidad máxima de 1 entrada (56bytes) por minuto. El problema es que el dispositivo puede perder energía en cualquier momento, potencialmente en medio de una secuencia de escritura. Me pregunto cuál es la mejor manera de proteger mis datos contra la corrupción. He descubierto que si el archivo está abierto cuando se pierde la energía, se pierden todos los datos que se escribieron en el archivo después del último cierre de archivo. No sé si lo mismo es cierto si se pierde potencia en el medio de la secuencia de escritura.

Como el procedimiento de escritura no ocurre con mucha frecuencia, podría abrir el archivo, escribir los datos y luego cerrar el archivo, cada vez que se registran datos. ¿Este enfoque dañaría la tarjeta SD con el tiempo?

Otro enfoque podría ser mantener el archivo abierto, pero después de cada 10 o 50 escrituras, podría cerrar el archivo y luego volver a abrirlo.

También podría almacenar datos en el búfer en la memoria, luego enjuagar los datos ocasionalmente, tal vez después de un kbyte más o menos.

La última idea que tuve fue que, en mi circuito, podía agregar un condensador grande que proporcionaría energía a mi tarjeta pic / sd el tiempo suficiente después de que se desconecta la alimentación para cerrar rápidamente el archivo. El problema con este enfoque es que el tiempo que lleva cerrar el archivo y / o guardar datos es muy inconsistente. Según tengo entendido, esta vez puede depender mucho del lugar actual en una página flash en la que se encuentre el archivo.

De todos modos, ¿qué sugerirían ustedes?

PICyourBrain
fuente
2
Si cambió a flash NAND sin formato con un sistema de archivos mínimo, podría profundizar en muchas de las capas de abstracción que actualmente obstaculizan su capacidad de realizar pequeñas escrituras, y es probable que obtenga la capacidad de realizar escrituras en bloque parciales inmediatamente cuando los datos estén disponibles. También tendría protección contra un usuario final que sustituye una tarjeta con diferentes detalles de rendimiento (tal vez incluso una marginal en el mercado gris) en el futuro.
Chris Stratton

Respuestas:

16

Pueden suceder algunas cosas cuando escribe datos en un archivo. Voy a describir la secuencia que debe suceder para que los datos estén seguros, no necesariamente las llamadas a la biblioteca.

Cuando está escribiendo y agregando al final del archivo (modo de escritura normal), lee el último bloque del archivo en la memoria, lo modifica con sus datos de escritura y luego vuelve a escribir todo el bloque en la tarjeta SD . Si el bloque está lleno, entonces se debe encontrar un nuevo bloque en la Tabla de asignación de archivos (FAT). Después de encontrar un nuevo bloque, la FAT debe actualizarse, que es un ciclo de lectura-modificación-escritura. Si hemos terminado con el archivo, entonces debemos actualizar los atributos del archivo (como la longitud del archivo) en el directorio raíz, lo que provoca otro ciclo de lectura-modificación-escritura.

Minimizando su tiempo de escritura

  • Asegúrese de que el archivo ya contenga sus datos cuando escriba un sector. Si comienza con un archivo grande y sobrescribe los datos en lugar de agregarlos, los datos estarán seguros tan pronto como finalice la escritura del sector de la tarjeta SD. Puede eliminar uno o dos ciclos de lectura-modificación-escritura de esa manera. Mi código de inicio escribiría 0's en un archivo en incrementos de sector hasta que la tarjeta SD esté llena, y luego retrocedería al comienzo del archivo.

  • Haga el tamaño de sus entradas de datos de manera que un número entero de entradas quepa en un sector. Subiría tus entradas a 64 bytes. Si bien esto es menos eficiente, evitará que necesite leer, modificar y escribir dos sectores.

  • Cree una variante de la función FSwrite que le permita escribir sectores completos. Si mantiene todo el sector en SRAM, su ciclo va de "lectura-modificación-escritura" a "modificación-escritura"

Mantenga su PIC y SD encendidos el mayor tiempo posible

  • Los condensadores grandes son buenos. 470uF debería darle más que suficiente potencia para terminar un ciclo de escritura.

  • ¡Asegúrese de que su fuente de energía no absorba la energía de su condensador de respaldo! Agregue un diodo si es necesario.

Sepa cuando está fuera del poder

  • Una gran tapa de fuente de alimentación le dará 10 ms o más para envolver las cosas con una tarjeta SD, pero no presione su suerte. Use un pin en su microcontrolador para ver si su fuente de alimentación sigue siendo buena, y no comience a escribir si su fuente está muerta.
W5VO
fuente
Gracias por la info. Muy útil.
Veré
¿Cuánto tiempo crees que tomaría escribir todos los ceros en una tarjeta de 4 gb? Parece mucho tiempo Además, ¿tiene algún ejemplo de código que pueda compartir para modificar la función fswrite para permitir escrituras completas en sectores completos?
PICyourBrain
Además, si escribe todos los ceros en el archivo. ¿Cómo realiza un seguimiento de dónde está el final de sus datos reales? ¿Acabas de leer todos los datos al principio y encuentras la cadena de ceros?
PICyourBrain
1
Si está usando FAT16, creo que está limitado a 2GB. Creo que la tarjeta SD / MMC tiene una función de "borrar bloques", que no parece estar implementada en la biblioteca MDDFS. Utilicé una biblioteca de código patentada para mi proyecto de tarjeta SD, por lo que no puedo compartir ningún ejemplo de código. Para encontrar los últimos datos, deberá leer hasta que encuentre todos los 0 en un registro de datos. Si su registro de datos puede ser todo 0, aconsejaría agregar algunos datos que no sean cero, o un delimitador de algún tipo.
W5VO
6

Un problema que aún no se menciona con las tarjetas SD (o MMC, CompactFlash, etc.) es que, aunque una tarjeta SD puede aparecer para el host como una simple colección de sectores de 512 bytes que pueden leerse y escribirse en un orden arbitrario, los dispositivos flash en general almacene páginas de 528 bytes en grupos de 32 KB si no es más grande cada uno, y las únicas operaciones admitidas son escribir en una página en blanco o borrar un grupo completo. Para hacer frente a esta limitación, el controlador en una tarjeta SD mantendrá una tabla que permitirá asignar cualquier sector lógico a cualquier página física. Cuando se realiza una solicitud para escribir un sector, el controlador encontrará una página en blanco en algún lugar del chip y actualizará la asignación con la nueva dirección del sector en cuestión. Si las páginas en blanco escasean, o en otros momentos,

La importancia de esto es que el acto de escribir en un sector lógico particular puede requerir barajar los datos de muchos sectores lógicos. Si algo sale mal en ese proceso, podría resultar en la corrupción de cualquier sector arbitrario, no solo del sector que se le pidió que escribiera la tarjeta. Un buen controlador de tarjeta SD debe estar diseñado para realizar las operaciones de combinación de datos de tal manera que si se pierde la energía durante una combinación de datos, podrá determinar qué partes de la operación se completaron y cuáles no, y en consecuencia poder terminar la operación correctamente. Desafortunadamente, no tengo idea de cómo se puede saber si la tarjeta SD de $ 5 que recogió en una tienda de descuento será buena en ese sentido.

Para estar seguro, incluso si una tarjeta SD es absolutamente perfecta desde el punto de vista de garantizar que cada operación de escritura que se informó que ha sido completada, de hecho, sobrevivirá a una falla de energía (es decir, garantizar que si todo el trabajo funciona o no la escritura habría causado que se haya completado, se haya completado lo suficiente como para que la tarjeta termine la operación cuando se vuelva a aplicar la energía), eso no significa que el sistema operativo host no tendrá problemas si realiza algunas pero no todas las escrituras de datos que pretende. Sin embargo, es importante tener en cuenta que si la tarjeta SD no puede cumplir con su parte del "trato", no se puede hacer nada en el software del lado del host para evitar la pérdida de datos debido a una falla de energía.

Super gato
fuente
Ese es un comentario muy perspicaz.
fred basset
5

También sugeriría usar algún tipo de suma de verificación para verificar que los datos en la SD sean correctos siempre que sea necesario leerlos.

sybreon
fuente
3

Quizás este supercondensador en Sparkfun resolvería el problema.

pingswept
fuente
2
Retendría la memoria del PIC, pero tiene una clasificación de corriente máxima de 10uA. No creo que puedas escribir en una tarjeta SD con tanta corriente.
W5VO
1
Sin embargo, el concepto es bueno. Una búsqueda rápida encontró Illinois Capacitor ( illinoiscapacitor.com ) tiene un supercondensador de hasta 8 F y es capaz de soportar corrientes de hasta 4 A. Agregar uno de estos, o una batería, le daría al micro la oportunidad de terminar una escritura y apagar las cosas. muy bien si falla la fuente de energía principal.
The Photon
3

Como el procedimiento de escritura no ocurre con mucha frecuencia, podría abrir el archivo, escribir los datos y luego cerrar el archivo, cada vez que se registran datos. ¿Este enfoque dañaría la tarjeta SD con el tiempo?

Al igual que con cualquier problema de ingeniería, tendrá que lidiar con las compensaciones aquí.

¿Es crítico que no se pierdan datos? Entonces haría lo anterior. Tendría más daño al perder los datos que al arruinar una tarjeta. Es posible que desee hacer una prueba de esfuerzo, de algún tipo, para determinar cuántas veces podría realizar esa operación antes de que la tarjeta se corrompa. Si está de acuerdo con el tiempo que pasó antes de que la tarjeta se volviera inutilizable, y parece que es un período de tiempo aceptable antes de cambiar la tarjeta, seguiría esa ruta.

J. Polfer
fuente
1

Si solo desea almacenar datos, no es necesario un sistema de archivos. La operación de escritura se realizará directamente sobre el SPI seleccionando la dirección de bloque. Al hacerlo, minimiza el tiempo de escritura y el riesgo de corrupción de datos.

Incluso en caso de pérdida de energía y falta de suerte, perderá solo una entrada (que puede ser aceptable en algunos sistemas).

mba7
fuente