Esta pregunta está relacionada con desprogramación AVR en sí misma .
Información del proyecto:
Tenemos un producto alimentado por batería utilizando un ATMEGA644P. La aplicación se ejecuta permanentemente en modo de suspensión y solo se activa una vez por segundo (RTC) o cuando se activa una de las dos líneas de interrupción externas.
El dispositivo cuenta con un cargador de arranque bastante simple que se está comunicando a través de UART (utilizando la interfaz RS232 IC). Simplemente sirve como un método conveniente para actualizar el firmware de modo que no se requiera ningún programador ISP de hardware. (El gestor de arranque espera telegramas asegurados de suma de comprobación)
Los dispositivos se diseñaron con un apagón interno DESACTIVADO porque duplica el consumo de energía y la duración de la batería es obligatoria (supongo que se debería haber utilizado una detección de apagones externos; el rediseño está en funcionamiento). / p>
Problema:
Cada pocos meses, un dispositivo deja de funcionar, NO se realizaron actualizaciones de firmware en esos dispositivos. Sin embargo, tras un examen más detenido, los contenidos flash de esos dispositivos parecen estar dañados. Además, las baterías de algunos de esos dispositivos aún eran buenas, pero no quiero descartar algún tipo de situación de bajo voltaje.
Esta es una comparación del contenido original de flash (izquierda) con el contenido dañado (derecha):
Algunasobservaciones:
- Unbloquedañadosiempreconstadealmenosunapáginaflash(256bytes)yestáalineadaconlapágina.Enotraspalabras:soloseafectanlaspáginascompletas,nolosbytesindividuales.
- Elcontenidodañadolee0xFFlamayorpartedeltiempo,perotambiénpuedecontenerotrosvaloresosercompletamente"aleatorio".
- La barra pequeña en el lado izquierdo de la imagen muestra todas las áreas afectadas. Para este dispositivo, es aproximadamente una décima parte del contenido total de flash.
- Tuvimos un dispositivo en el que solo una página se vio afectada.
Es totalmente plausible que una condición de bajo voltaje al escribir la memoria flash pueda corromper el contenido del flash. Sin embargo, esto significaría que se deben ejecutar algunas instrucciones sensibles al flash.
Tal vez el controlador se reinicie aleatoriamente debido a la falta de voltaje y el código del cargador de arranque esté actuando de manera impredecible durante este tiempo. Para citar a alguien de otro foro en relación con el bajo voltaje:
"No solo se trata de instrucciones aleatorias de flash que se ejecutan, sino de períodos de instrucciones aleatorias (no hay garantía de que el código de flash se lea y se interprete correctamente). Junto con esto, otras partes del mcu pueden no comportarse como diseñado, incluyendo mecanismos de protección ".
Preguntas:
¿Cree que el "comportamiento aleatorio durante el voltaje bajo y la ejecución de algunas instrucciones que cambian los datos en páginas flash" - la explicación es sólida? Si ese es el caso, ¿por qué no vemos este tipo de errores todo el tiempo como causa de algunos problemas de software (desbordamiento de pila, punteros no válidos)?
¿Tiene alguna otra idea sobre qué podría causar este tipo de corrupción? ¿Podría ser causado por EMI / ESD?