Diese Frage bezieht sich auf die AVR-Deprogrammierung selbst .
Projektinfo:
Wir haben ein batteriebetriebenes Produkt mit einem ATMEGA644P. Die Anwendung wird permanent im Ruhemodus ausgeführt und wacht nur einmal pro Sekunde (RTC) oder wenn eine der beiden externen Interruptleitungen ausgelöst wird.
Das Gerät verfügt über einen ziemlich einfachen Bootloader, der über UART kommuniziert (über den RS232-Schnittstellen-IC). Es dient lediglich als bequeme Methode zum Aktualisieren der Firmware, sodass kein Hardware-ISP-Programmierer erforderlich ist. (Der Bootloader erwartet Prüfsummen-gesicherte Telegramme.)
Das Gerät wurde mit internem Brown-Out DISABLED entwickelt, da es den Stromverbrauch verdoppelt und eine lange Akkulaufzeit erforderlich ist (ich denke, dass eine externe Brown-Out-Erkennung hätte verwendet werden müssen - eine Neugestaltung ist in Arbeit).
Problem:
Alle paar Monate funktioniert ein Gerät nicht mehr. Auf diesen Geräten wurden KEINE Firmware-Updates durchgeführt. Nach weiterer Prüfung scheint der Flash-Inhalt dieser Geräte jedoch beschädigt zu sein. Außerdem waren die Batterien einiger dieser Geräte immer noch gut, aber ich möchte eine Unterspannungssituation nicht ausschließen.
Dies ist ein Vergleich des ursprünglichen Flash-Inhalts (links) mit dem beschädigten Inhalt (rechts):
Einige Beobachtungen:
- Ein beschädigter Block besteht immer aus mindestens einer Flash-Seite (256 Byte) und ist seitenausgerichtet. Mit anderen Worten: Es sind nur ganze Seiten betroffen, keine einzelnen Bytes.
- Beschädigter Inhalt liest die meiste Zeit 0xFF, kann aber auch einige andere Werte enthalten oder vollständig "zufällig" sein.
- Der kleine Balken auf der linken Seite des Bildes zeigt alle betroffenen Bereiche. Für dieses Gerät ist es ungefähr ein Zehntel des gesamten Flash-Inhalts.
- Wir hatten ein Gerät, auf dem nur eine Seite betroffen war.
Es ist durchaus plausibel, dass ein Unterspannungszustand beim Schreiben des Flash-Speichers den Flash-Inhalt beschädigen kann. Dies würde jedoch bedeuten, dass einige flashempfindliche Anweisungen ausgeführt werden müssen.
Möglicherweise wird der Controller aufgrund von Unterspannung zufällig neu gestartet, und der Bootloader-Code verhält sich während dieser Zeit völlig unvorhersehbar. Um einen Typen aus einem anderen Forum bezüglich Unterspannung zu zitieren:
"Es werden nicht nur zufällige Anweisungen von Flash ausgeführt, sondern auch zufällige Anweisungen (es gibt keine Garantie dafür, dass der Code von Flash korrekt gelesen und interpretiert wird). Außerdem verhalten sich andere Teile des mcu möglicherweise nicht wie vorgesehen, einschließlich Schutz Mechanismen. "
Frage (n):
Denken Sie, dass das "zufällige Verhalten bei Unterspannung und Ausführung einiger Anweisungen zum Ändern von Daten auf Flash-Seiten" - Erklärung ist richtig? Wenn dies der Fall ist, warum sehen wir diese Art von Fehlern nicht immer nur als Ursache für einige Softwareprobleme (Stapelüberlauf, ungültige Zeiger)?
Haben Sie andere Ideen, was diese Art von Korruption verursachen könnte? Könnte dies durch EMI / ESD verursacht werden?