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

17

Estoy trabajando en un dispositivo que utiliza la biblioteca MDDFS de Microchip para almacenar datos en una tarjeta SD. El registrador registrará los datos a una velocidad máxima de 1 entrada (56 bytes) 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. Descubrí que si el archivo está abierto cuando se pierde la alimentación, todos los datos que se escribieron en el archivo después de la última pérdida de archivo se pierden. No sé si lo mismo se aplica si se pierde el poder en medio de la secuencia de escritura.

Dado que el procedimiento de escritura no se realiza con mucha frecuencia, podría abrir el archivo, escribir los datos y luego cerrar el archivo, cada vez que se registran. ¿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 la memoria y luego descargar los datos de vez en cuando después de un kbyte o algo así.

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

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

    
pregunta PICyourBrain

6 respuestas

15

Algunas cosas pueden suceder cuando escribes datos en un archivo. Voy a describir la secuencia que debe ocurrir para que los datos estén seguros, no necesariamente llamadas de 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 escribe todo el bloque de nuevo 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, se debe actualizar el FAT, que es un ciclo de lectura-modificación-escritura. Si hemos terminado con el archivo, 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 el tiempo de escritura

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

  • Haga que el tamaño de sus entradas de datos sea tal 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-escribir dos sectores.

  • Cree una variante de la función FSwrite que le permita escribir sectores completos. Si mantienes todo el sector en SRAM, entonces tu ciclo va de "leer-modificar-escribir" a "modificar-escribir"

Mantenga su PIC y SD encendidos el mayor tiempo posible

  • Los condensadores grandes son buenos. 470uF debería darle más que suficiente poder para finalizar 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 cuándo está fuera del poder

  • Una tapa de suministro de energía grande 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 energía sigue siendo buena, y no comience a escribir si su fuente está muerta.
respondido por el W5VO
6

Un problema que aún no se ha mencionado con las tarjetas SD (o MMC, CompactFlash, etc.) es que mientras que una tarjeta SD puede aparecer en el host como una simple colección de sectores de 512 bytes que pueden leerse y escribirse en orden arbitrario, los dispositivos flash generalmente almacenan páginas de 528 bytes en grupos que son de 32 KB si no son más grandes cada uno, y las únicas operaciones compatibles son escribir en una página en blanco o borrar un grupo completo. Para lidiar con esta limitación, el controlador en una tarjeta SD mantendrá una tabla que permitirá que cualquier sector lógico se asigne 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 están escaseando, o en varias otras ocasiones, el controlador moverá un grupo que se pueda borrar lleno de páginas a nuevas direcciones, y luego borrará todo el grupo.

El significado de esto es que el hecho de escribir en un sector lógico particular puede requerir que se barajen 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 en el sector en el que se le pidió a la tarjeta que escribiera. Un buen controlador de tarjeta SD debe estar diseñado para realizar las operaciones de mezcla de datos de tal manera que si se pierde la energía durante una combinación de datos, será capaz de averiguar qué partes de la operación se completaron y cuáles no, y En consecuencia, ser capaz de terminar la operación correctamente. Desafortunadamente, no tengo idea de cómo se puede saber si la tarjeta SD de $ 5 que se 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 se completó, de hecho, sobrevivirá a una falla de alimentación (es decir, asegurando que sea o no todo el el trabajo que causó la escritura está completo, lo suficiente como para que la tarjeta termine la operación cuando se vuelva a aplicar la alimentación, lo que no significa que el sistema operativo del host no tendrá problemas si realiza algunos pero no todos los datos lo escriben tiene la intención No obstante, es importante tener en cuenta que si la tarjeta SD no puede cumplir su parte final de la "negociación", no se puede hacer nada en el software del lado del host para evitar la pérdida de datos debido a una falla eléctrica.

    
respondido por el supercat
5

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

    
respondido por el sybreon
3

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

    
respondido por el pingswept
3
  

Dado que el procedimiento de escritura no   Sucede con mucha frecuencia que podría abrir   el archivo, escriba los datos, y luego   cerrar el archivo, cada vez que los datos son   registrado ¿Dañaría este enfoque la   tarjeta sd con el tiempo?

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

¿Es crítico que no se pierda ningún dato? Luego haría lo anterior. Haría más daño si pierde los datos que arruinando una tarjeta. Es posible que desee hacer una prueba de esfuerzo, para determinar cuántas veces podría realizar esa operación antes de que la tarjeta se corrompa. Si se enfría con el tiempo que tomó antes de que la tarjeta se volviera inutilizable, y parece ser un tiempo aceptable antes de cambiar la tarjeta, seguiría esa ruta.

    
respondido por el J. Polfer
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 potencia y sin suerte, perderá solo una entrada (lo que tal vez sea aceptable en algún sistema).

    
respondido por el mba7

Lea otras preguntas en las etiquetas