Bem, a maneira que você pode consertar isso é consertar o problema "poder ser cortado a qualquer momento". É impossível adicionar um minuto de energia da bateria?
Alternativamente, talvez você possa usar dois cartões SD. Escreva os dados para um cartão, sincronize, escreva para o outro. Cada bloco de dados precisaria de um checksum e um número de bloco, mas mesmo com algumas falhas de energia bem ruins, uma das placas deveria estar certa.
Seu problema básico será o nivelamento de desgaste nos cartões SD, que depende do fornecedor do cartão (e talvez até mesmo do lote, eles podem ser alterados sempre que possível). Provavelmente não manipula a falta de energia corretamente. E dependendo do que isso faz, isso pode não apenas significar corromper o bloco no qual você está escrevendo.
- Suponha um cartão trivialmente pequeno - 3 blocos (flash). O bloco 1 recebeu mais gravações do que 2 ou 3. Vou chamar os blocos físicos pelo número e os blocos lógicos A, B, C por letra. Agora, A = 1, B = 2, C = 3.
- Você emite uma gravação no bloco A. Cartão SD é como aha! precisamos usar nivelamento aqui, senão o bloco 1 vai se desgastar antes de 2 e 3. Ele decide trocar os blocos 1 e 2.
- Ele lê o bloco 1 na posição RAM i (no cartão SD, não na RAM do sistema). Atualiza a parte que você queria mudar.
- Ele lê o bloco 2 na posição da RAM ii
- Apaga o bloco 1
- Grava a posição II da RAM no bloco 1.
- Atualiza a tabela de mapeamento para dizer B = 1
- Apaga o bloco 2.
- Grava a posição RAM i no bloco 2.
- Atualiza a tabela de mapeamento para dizer A = 2
Naturalmente, "atualiza a tabela de mapeamento" nem sempre é trivial. E a ordem de 5 a 10 poderia ser diferente (se todas elas forem completas, não importa, bem, os apagamentos devem vir antes das gravações, é claro). Mas uma falha de energia acontece, você pode acabar com não apenas A corrompido (como você espera), mas B também. Ou, se ocorrer falha de energia durante uma atualização de mapeamento, quem sabe que tipo de corrupção causará.