Esta questão está relacionada à própria desprogramação do AVR .
Informações do projeto:
Temos um produto alimentado por bateria usando um ATMEGA644P. O aplicativo é executado permanentemente no modo de suspensão e acorda apenas uma vez por segundo (RTC) ou quando uma das duas linhas de interrupção externas é acionada.
O dispositivo possui um carregador de inicialização bastante simples que está se comunicando pelo UART (usando o IC da interface RS232). Ele serve apenas como um método conveniente para atualizar o firmware, para que nenhum programador de ISP de hardware seja necessário. (O carregador de inicialização espera telegramas seguros com soma de verificação)
Os dispositivos foram projetados com desativação interna desativada porque duplica o consumo de energia e a bateria de longa duração é obrigatória (acho que uma detecção de desativação externa deveria ter sido usada - um novo design está em andamento).
Problema:
Todos os meses, um dispositivo para de funcionar, NENHUMA atualização de firmware é executada nesses dispositivos. No entanto, após um exame mais aprofundado, o conteúdo do flash desses dispositivos parece estar corrompido. Além disso, as baterias de alguns desses dispositivos ainda estavam boas, mas não quero descartar algum tipo de situação de subtensão.
Esta é uma comparação do conteúdo original do flash (à esquerda) com o conteúdo corrompido (à direita):
Algumas observações:
- Um bloco corrompido sempre consiste em pelo menos uma página flash (256 bytes) e está alinhado. Em outras palavras: Somente páginas inteiras são afetadas, não bytes únicos.
- O conteúdo corrompido lê 0xFF na maioria das vezes, mas também pode conter alguns outros valores ou ser completamente "aleatório".
- A pequena barra no lado esquerdo da imagem mostra todas as áreas afetadas. Para este dispositivo, é cerca de um décimo do conteúdo total do flash.
- Tínhamos um dispositivo em que apenas uma única página foi afetada.
É totalmente plausível que uma condição de subtensão ao gravar a memória flash possa corromper o conteúdo do flash. No entanto, isso significa que algumas instruções sensíveis ao flash precisam ser executadas.
Talvez o controlador esteja reiniciando aleatoriamente devido à subtensão e o código do carregador de inicialização esteja agindo totalmente imprevisível durante esse período. Para citar alguém de outro fórum sobre subtensão:
"Não são apenas instruções aleatórias do flash sendo executadas, mas também um período de instruções aleatórias (não há garantia de que o código do flash seja lido e interpretado corretamente). Junto com isso, outras partes do mcu podem não se comportar como projetadas, incluindo proteção mecanismos ".
Pergunta (s):
Você acha que o "comportamento aleatório durante a subtensão e a execução de algumas instruções alterando os dados em páginas flash" - a explicação é correta? Se for esse o caso, por que não vemos esse tipo de erro o tempo todo, apenas como causa de alguns problemas de software (estouro de pilha, ponteiros inválidos).
Você tem alguma outra idéia do que poderia causar esse tipo de corrupção? Isso pode ser causado por EMI / ESD?