Cette question est liée à la déprogrammation AVR elle-même .
Informations sur le projet:
Nous avons un produit alimenté par batterie utilisant un ATMEGA644P. L'application fonctionne en permanence en mode veille et ne se réveille qu'une fois par seconde (RTC) ou lorsque l'une des deux lignes d'interruption externes est déclenchée.
L'appareil dispose d'un chargeur de démarrage assez simple qui communique via UART (en utilisant l'interface IC RS232). Il sert simplement de méthode pratique pour mettre à jour le micrologiciel de sorte qu'aucun programmeur ISP matériel ne soit requis. (Le chargeur de démarrage attend des télégrammes sécurisés par somme de contrôle)
Les appareils ont été conçus avec une fonction de désactivation interne désactivée car cela double la consommation d'énergie et la longue durée de vie de la batterie est obligatoire (je suppose qu'une détection de panne externe aurait dû être utilisée - une nouvelle conception est en cours).
Problème:
tous les quelques mois, un périphérique cesse de fonctionner, aucune mise à jour du micrologiciel n'a été effectuée sur ces périphériques. Cependant, après un examen plus approfondi, le contenu flash de ces périphériques semble être corrompu. De plus, les batteries de certains de ces appareils étaient toujours bonnes, mais je ne veux pas exclure une sorte de situation de sous-tension.
Voici une comparaison du contenu flash d'origine (à gauche) avec le contenu corrompu (à droite):
Quelques observations:
- Un bloc corrompu se compose toujours d'au moins une page flash (256 octets) et est aligné sur la page. En d'autres termes: seules les pages entières sont concernées, pas les octets uniques.
- Le contenu corrompu lit 0xFF la plupart du temps, mais peut également contenir d'autres valeurs ou être complètement "aléatoire".
- La petite barre sur le côté gauche de l'image montre toutes les zones affectées. Pour cet appareil, son environ un dixième du contenu total du flash.
- Nous avions un appareil sur lequel une seule page était affectée.
Il est totalement plausible qu'une condition de sous-tension lors de l'écriture de la mémoire flash puisse corrompre le contenu du flash. Cependant, cela signifierait que certaines instructions sensibles au flash doivent être exécutées.
Peut-être que le contrôleur redémarre de manière aléatoire en raison d'une sous-tension et que le code du chargeur de démarrage agit de manière totalement imprévisible pendant ce temps. Pour citer un gars d'un autre forum concernant la sous-tension:
"Ce n'est pas seulement des instructions aléatoires du flash qui sont exécutées, mais une période d'instructions aléatoires (il n'y a aucune garantie que le code du flash sera lu et interprété correctement). Parallèlement à cela, d'autres parties du mcu peuvent ne pas se comporter comme prévu, y compris la protection mécanismes. "
Question (s):
Pensez-vous que le "comportement aléatoire pendant la sous-tension et l'exécution de certaines instructions modifiant les données dans les pages flash" - l'explication est bonne? Si tel est le cas, pourquoi ne voyons-nous pas ce type d'erreurs tout le temps comme une cause de certains problèmes logiciels (débordement de pile, pointeurs invalides).
Avez-vous d'autres idées sur ce qui pourrait provoquer ce type de corruption? Cela pourrait-il être causé par EMI / ESD?