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?
Respostas:
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
fonte
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.
fonte
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.
fonte
Talvez esse supercapacitor da Sparkfun resolvesse o problema.
fonte
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.
fonte
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).
fonte