Como protejo o cartão SD contra falhas inesperadas de energia?

18

Estou trabalhando em um dispositivo que usa a biblioteca Microchip MDDFS para armazenar dados em um cartão SD. O criador de logs registrará dados a uma taxa máxima de 1 entrada (56 bytes) a cada minuto. O problema é que o dispositivo pode perder energia a qualquer momento, potencialmente no meio de uma sequência de gravação. Gostaria de saber qual é a melhor maneira de proteger meus dados contra corrupção. Descobri que, se o arquivo é aberto quando a energia é perdida, todos os dados que foram gravados no arquivo após o último fechamento do arquivo são perdidos. Não sei se o mesmo vale se a energia for perdida no meio da sequência de gravação.

Como o procedimento de gravação não ocorre com muita frequência, eu poderia abrir o arquivo, gravar os dados e depois fechar o arquivo, toda vez que os dados forem registrados. Essa abordagem danificaria o cartão SD ao longo do tempo?

Outra abordagem seria manter o arquivo aberto, mas após cada 10 ou 50 gravações eu poderia fechar o arquivo e reabri-lo.

Eu também poderia armazenar dados em buffer na memória e liberá-los ocasionalmente, talvez depois de um kbyte.

A última idéia que tive foi que, no meu circuito, eu poderia adicionar um capacitor grande que forneceria energia ao meu cartão pic / sd por tempo suficiente após a energia ser desconectada para fechar rapidamente o arquivo. O problema com essa abordagem é que o tempo necessário para fechar o arquivo e / ou salvar os dados é muito inconsistente. Pelo que entendi, esse tempo pode depender muito do local atual em uma página flash em que o arquivo está.

Enfim, o que vocês sugerem?

PICyourBrain
fonte
2
Se você alternar para o flash NAND bruto com um sistema de arquivos mínimo, poderá analisar muitas das camadas de abstração atualmente impedindo sua capacidade de confirmar pequenas gravações e provavelmente obter a capacidade de fazer gravações parciais em bloco imediatamente quando os dados estiverem disponíveis. Você também teria proteção contra um usuário final substituindo um cartão com diferentes detalhes de desempenho (talvez até um mercado marginal cinza) mais adiante.
Chris Stratton

Respostas:

16

Algumas coisas podem acontecer quando você grava dados em um arquivo. Vou descrever a sequência que precisa acontecer para que os dados sejam seguros, não necessariamente chamadas de biblioteca.

Ao escrever e adicionar no final do arquivo (modo de gravação normal), você lê o último bloco do arquivo na memória, modifica-o com seus dados de gravação e depois grava todo o bloco de volta no cartão SD . Se o bloco estiver cheio, um novo bloco deverá ser encontrado na Tabela de Alocação de Arquivos (FAT). Depois de encontrar um novo bloco, o FAT deve ser atualizado, que é um ciclo de leitura-modificação-gravação. Se terminarmos com o arquivo, precisamos atualizar os atributos do arquivo (como o tamanho do arquivo) no diretório raiz, o que causa outro ciclo de leitura-modificação-gravação.

Minimizando seu tempo de gravação

  • Verifique se o arquivo já está mantendo seus dados quando você escreve um setor. Se você começar com um arquivo grande e sobrescrever os dados em vez de anexá-los, eles estarão seguros assim que a gravação no setor do cartão SD for concluída. Você pode eliminar de um a dois ciclos de leitura, modificação e gravação dessa maneira. Meu código de inicialização gravaria zeros em um arquivo em incrementos de setor até que o cartão SD estivesse cheio e, em seguida, rebobinasse o início do arquivo.

  • Defina o tamanho das entradas de dados para que um número inteiro de entradas caiba em um setor. Eu aumentaria suas entradas para 64 bytes. Embora isso seja menos eficiente, impedirá que você precise ler, modificar, gravar dois setores.

  • Crie uma variante da função FSwrite que permita escrever setores inteiros. Se você mantiver todo o setor na SRAM, seu ciclo passará de "leitura-modificação-gravação" para "modificação-gravação"

Mantenha sua energia PIC e SD o maior tempo possível

  • Capacitores grandes são bons. O 470uF deve fornecer energia mais que suficiente para concluir um ciclo de gravação.

  • Certifique-se de que sua fonte de alimentação não consome energia do seu capacitor de backup! Adicione um diodo, se necessário.

Saiba quando você está fora do poder

  • Um grande limite de fonte de alimentação oferece 10ms ou mais para você finalizar com um cartão SD, mas não perca a sorte. Use um alfinete no microcontrolador para verificar se a fonte de energia ainda está boa e não inicie uma gravação se a fonte estiver morta.
W5VO
fonte
Obrigado pela informação. Muito útil. Vou ver o que posso fazer com isso ...
PICyourBrain
Quanto tempo você acha que levaria para escrever todos os zeros em um cartão de 4GB? Parece muito tempo. Além disso, você tem algum exemplo de código que possa compartilhar para modificar a função fswrite para permitir gravações inteiras em setores inteiros?
PICyourBrain
Além disso, se você escrever todos os zeros no arquivo. Como você controla onde está o final dos seus dados reais? Você acabou de ler todos os dados no começo e encontrar a sequência de zeros?
PICyourBrain
11
Se você estiver usando o FAT16, acredito que esteja limitado a 2 GB. Acredito que o cartão SD / MMC tenha uma função "apagar blocos", que não parece ter sido implementada na biblioteca MDDFS. Eu usei uma biblioteca de códigos proprietária para o meu projeto de cartão SD, portanto não posso compartilhar nenhum exemplo de código. Para encontrar os últimos dados, você precisaria ler até encontrar todos os 0s em um registro de dados. Se o seu registro de dados puder ter todos os 0, aconselho adicionar alguns dados diferentes de zero ou um delimitador de alguns tipos.
W5VO
6

Um problema ainda não mencionado nos cartões SD (ou MMC, CompactFlash etc.) é que, embora um cartão SD possa aparecer para o host como uma simples coleção de setores de 512 bytes que podem ser lidos e gravados em ordem arbitrária, os dispositivos flash geralmente armazene páginas de 528 bytes em grupos de 32 KB, se não maiores, e as únicas operações suportadas são gravar em uma página em branco ou apagar um grupo inteiro. Para lidar com essa limitação, o controlador em um cartão SD manterá uma tabela que permitirá que qualquer setor lógico seja mapeado para qualquer página física. Quando uma solicitação é feita para escrever um setor, o controlador encontra uma página em branco em algum lugar do chip e atualiza o mapeamento com o novo endereço do setor em questão. Se as páginas em branco forem escassas ou em vários outros momentos,

O significado disso é que o ato de gravar em um setor lógico específico pode exigir a troca de dados de muitos setores lógicos. Se algo der errado nesse processo, poderá resultar em corrupção de qualquer setor arbitrário - não apenas no setor que o cartão foi solicitado a escrever. Um bom controlador de cartão SD deve ser projetado para executar as operações de embaralhamento de dados de modo que, se a energia for perdida durante um embaralhamento de dados, ele será capaz de descobrir quais partes da operação foram concluídas e quais não foram, e consequentemente, será capaz de finalizar a operação corretamente. Infelizmente, não tenho idéia de como saber se o cartão SD de US $ 5 que foi adquirido em uma loja de descontos será bom nesse sentido.

Certamente, mesmo que um cartão SD seja absolutamente perfeito do ponto de vista de garantir que todas as operações de gravação que foram relatadas como concluídas sobreviverão de fato a uma falha de energia (ou seja, garantir que todo o trabalho seja gravado ou não Se a causa do término da operação for concluída, o cartão concluirá a operação quando a energia for reaplicada), o que não significa que o sistema operacional do host não terá problemas se executar algumas, mas nem todas as gravações de dados pretendidas. No entanto, é importante ter em mente que, se o cartão SD não pode sustentar o fim da "pechincha", não há nada que possa ser feito no software do host para impedir a perda de dados por falta de energia.

supercat
fonte
Esse é um comentário muito perspicaz.
Fred basset
5

Eu também sugeriria usar algum tipo de soma de verificação para verificar se os dados no SD estão corretos sempre que precisam ser lidos.

sybreon
fonte
3

Talvez esse supercapacitor da Sparkfun resolvesse o problema.

pingswept
fonte
2
Ele manteria a memória do PIC, mas possui uma classificação de corrente máxima de 10uA. Eu não acho que você poderia escrever em um cartão SD com tanta corrente.
W5VO
11
O conceito é bom. Uma pesquisa rápida encontrada no Illinois Capacitor ( illinoiscapacitor.com ) tem supercapacitor de até 8 F e capaz de suportar correntes de até 4 A. A adição de um desses, ou uma bateria, daria ao micro a chance de terminar uma gravação e desligar as coisas muito bem se a fonte de energia principal falhar.
The Photon
3

Como o procedimento de gravação não ocorre com muita frequência, eu poderia abrir o arquivo, gravar os dados e depois fechar o arquivo, toda vez que os dados forem registrados. Essa abordagem danificaria o cartão SD ao longo do tempo?

Como em qualquer problema de engenharia, você precisará lidar com as compensações aqui.

É essencial que nenhum dado seja perdido? Então eu faria o acima. Você teria mais danos ao perder os dados do que arruinar um cartão. Você pode fazer um tipo de teste de estresse para determinar quantas vezes você pode executar essa operação antes que o cartão seja corrompido. Se você estiver bem com o tempo que levou para o cartão ficar inutilizável, e parece ser um período aceitável antes de mudar o cartão, eu seguirei esse caminho.

J. Polfer
fonte
1

Se você deseja apenas armazenar dados, não há necessidade de um sistema de arquivos. a operação de gravação será feita diretamente sobre o SPI, selecionando o endereço do bloco. ao fazer isso, você minimiza o tempo de gravação e o risco de corrupção de dados.

Mesmo em caso de perda de energia e falta de sorte, você perderá apenas uma entrada (o que talvez seja aceitável em algum sistema).

mba7
fonte