19 votos

¿Cómo puedo proteger la tarjeta SD contra cortes de corriente inesperados?

Estoy trabajando en un dispositivo que utiliza la biblioteca MDDFS de Microchip para almacenar datos en una tarjeta SD. El registrador registrará datos a una velocidad máxima de 1 entrada (56bytes) cada 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 corta la corriente, todos los datos que se escribieron en el archivo después del último cierre se pierden. No sé si ocurre lo mismo si se pierde la alimentación en medio de la secuencia de escritura.

Dado que el procedimiento de escritura no se produce con mucha frecuencia, podría abrir el archivo, escribir los datos y, a continuación, cerrar el archivo cada vez que se registren 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 los datos en la memoria, y luego vaciarlos de vez en cuando, tal vez después de un kbyte más o menos.

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

En cualquier caso, ¿qué me sugieren?

15voto

BWW Puntos 302

Cuando se escriben datos en un archivo pueden ocurrir varias cosas. Voy a describir la secuencia que debe suceder para que los datos estén seguros, no necesariamente las llamadas a la biblioteca.

Cuando escribe y añade datos al final del archivo (modo de escritura normal), lee el último bloque del archivo en la memoria, lo modifica con los datos de escritura y, a continuación, vuelve a escribir todo el bloque en la tarjeta SD. Si el bloque está lleno, hay que buscar un nuevo bloque en la tabla de asignación de archivos (FAT). Después de encontrar un nuevo bloque, hay que actualizar la FAT, lo que supone un ciclo de lectura-modificación-escritura. Si hemos terminado con el archivo, entonces tenemos que 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.

Minimizar el tiempo de escritura

  • Asegúrate de que el archivo ya contiene tus datos cuando escribas un sector. Si empieza con un archivo grande y sobrescribe los datos en lugar de añadirlos, los datos estarán seguros en cuanto termine la escritura del sector de la tarjeta SD. Puedes eliminar uno o dos ciclos de lectura-modificación-escritura de esa manera. Mi código de inicio escribiría 0's a un archivo en incrementos de sector hasta que la tarjeta SD esté llena, y luego rebobinaría al principio del archivo.

  • Haz que el tamaño de las entradas de datos sea tal que quepa un número entero de entradas en un sector. Yo aumentaría las entradas a 64 bytes. Aunque esto es menos eficiente, evitará que tengas que leer-modificar-escribir dos sectores.

  • Crear una variante de la función FSwrite que permita escribir sectores enteros. Si mantienes todo el sector en SRAM, entonces tu ciclo pasa de "lectura-modificación-escritura" a "modificación-escritura"

Mantén tu PIC y SD encendidos el mayor tiempo posible

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

  • Asegúrate de que tu fuente de alimentación no absorba la energía de tu condensador de reserva. Añade un diodo si es necesario.

Sepa cuándo se queda sin energía

  • Un gran tapón de alimentación te dará 10 ms o más para acabar con una tarjeta SD, pero no tientes a la suerte. Usa un pin en tu microcontrolador para ver si tu fuente de alimentación todavía está bien, y no empieces una escritura si tu fuente está muerta.

8voto

Alex Andronov Puntos 178

Una cuestión que aún no se ha mencionado en relación con las tarjetas SD (o MMC, CompactFlash, etc.) es que, mientras que una tarjeta SD puede parecer al host una simple colección de sectores de 512 bytes que pueden leerse y escribirse en un orden arbitrario, los dispositivos flash suelen almacenar páginas de 528 bytes en grupos de 32 KB o más cada uno, y las únicas operaciones que admiten son escribir en una página que, de otro modo, estaría en blanco, o borrar un grupo entero. Para hacer frente a esta limitación, el controlador de una tarjeta SD mantiene una tabla que permite asignar cualquier sector lógico a cualquier página física. Cuando se solicite la escritura de 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 escasean las páginas en blanco, o en otras ocasiones, el controlador moverá un grupo borrable lleno de páginas a nuevas direcciones y luego borrará todo el grupo.

El significado de esto es que el acto de escribir en un sector lógico en particular puede requerir barajar los datos de muchos sectores lógicos. Si algo va mal en ese proceso, podría resultar en la corrupción de cualquier sector arbitrario - no sólo el sector de la tarjeta se le pidió que escribiera. Un buen controlador de tarjetas SD debería estar diseñado para realizar las operaciones de barajado de datos de tal forma que, si se pierde la alimentación durante un barajado de datos, sea capaz de averiguar qué partes de la operación se han completado y cuáles no y, en consecuencia, pueda finalizar la operación correctamente. Por desgracia, no tengo ni idea de cómo se puede saber si la tarjeta SD de 5 dólares que compramos en una tienda de descuento es buena en este sentido.

Para estar seguros, incluso si una tarjeta SD es absolutamente perfecta desde el punto de vista de garantizar que cada operación de escritura que se informó de que se había completado, de hecho, sobrevivir a un corte de energía (es decir, garantizar que si todo el trabajo que la escritura habría causado es completa o no, lo suficiente se ha completado que la tarjeta va a terminar la operación cuando la energía se vuelve a aplicar) eso no significa que el sistema operativo host no tendrá problemas si se realiza algunos, pero no todos los datos se escribe que se propone. No obstante, es importante tener en cuenta que si la tarjeta SD no puede cumplir su parte del "trato", no hay nada que se pueda hacer en el software del host para evitar la pérdida de datos por un fallo de alimentación.

5voto

Shane Meyers Puntos 583

También sugeriría utilizar algún tipo de suma de comprobación para verificar que los datos de la SD son correcto siempre que sea necesario leerlo.

3voto

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

3voto

Arjun Attam Puntos 82

Dado que el procedimiento de escritura muy a menudo, puedo abrir abrir el archivo, escribir los datos cerrar el archivo, cada vez que se registrados. ¿Este enfoque dañaría el tarjeta sd con el tiempo?

Como en cualquier problema de ingeniería, tendrás que hacer concesiones.

¿Es fundamental que no se pierda ningún dato? Entonces haría lo anterior. Te haría más daño perder los datos que estropear una tarjeta. Es posible que desee hacer una prueba de estrés, de tipo, para determinar cuántas veces se puede realizar esa operación antes de la tarjeta se corrompe. Si te parece bien el tiempo que pasó antes de que la tarjeta se volviera inutilizable, y parece ser un tiempo aceptable antes de cambiar la tarjeta, yo seguiría ese camino.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X