por Fábio Pereira » 04 Ago 2020 09:42
Olá,
Uma técnica que já utilizei no passado consiste em utilizar 0xFF como operador de controle e funciona assim: iniciando do primeiro endereço de dados da flash, o firmware lê cada byte até encontrar 0xFF ou atingir o fim do bloco. Em qualquer caso, o último valor lido (diferente de 0xFF) é o dado a ser utilizado.
Na gravação, o procedimento é similar, iniciando do primeiro endereço válido da flash, o firmware procura sequencialmente por uma posição com 0xFF ou até atingir o final do bloco, caso encontre 0xFF, o firmware escreve naquele endereço o novo dado, caso não tenha encontrado 0xFF e tenha atingido o fim do bloco, apaga o mesmo e grava o dado no primeiro endereço do bloco.
Em arquiteturas onde somente é possível gravar words (16 ou 32 bits) você terá de utilizar uma word ao invés de um byte, mas basicamente o procedimento é o mesmo.
Esta técnica também pode ser utilizada para armazenamento de estruturas e outros dados com tamanho constante, desde que você possa garantir que um valor lido contendo somente 1s seja considerado inválido para a aplicação.
No exemplo acima, o único limite é que você não pode salvar um dado contendo 0xFF na flash.
Há outras técnicas também (como mapas de bit) que permitem salvar bytes inteiros (inclusive 0xFF) mas que envolvem maior complexidade na determinação da endereço contendo o dado válido que pode ser lido e o próximo endereço livre que pode ser escrito.
Apesar das limitações, estas técnicas possuem alguns pontos muito positivos:
1- Wear-off grandemente reduzido (já que o número de apagamentos é reduzido consideravelmente);
2- Mais rápido e simples do que utilizar emulação de EEPROM;
3- Melhor desempenho em aplicações low-power, já que o número de apagamentos é reduzido e o tempo de apagamento é substancialmente maior que o tempo de escrita;
Espero que seja útil.
Ps.: depois que escrevi o post acima é que vi que o Zé também propôs basicamente a mesma técnica acima. Então o que escrevi acima basicamente só serve para validar a idéia dele!