Ich arbeite an einer Implementierung von AVR109, bei der der Bootloader nach zwei Sekunden abläuft, wenn eine bestimmte Reihe von Bytes nicht auf der seriellen Schnittstelle empfangen wird, und dann die Hauptanwendung mit einem Funktionszeiger auf Adresse 0 startet.
Der Bootloader funktioniert einwandfrei und ich kann den AVR über die serielle Schnittstelle programmieren. Wenn der AVR jedoch nur den Bootloader enthält und der Flash-Speicher an Position 0 leer ist, dauert es bei jedem Neustart des AVR zusätzlich zum Bootloader-Timeout zwei Sekunden. Warum geht das nicht sofort? Warum wird der AVR nicht sofort zurückgesetzt, wenn der Bootloader den Zeiger auf einen leeren Bereich im Flash setzt? Kann ich das konfigurieren?
BEARBEITEN: Mein Bootloader-Rätsel wurde tatsächlich von PEBCAK verursacht . Ein Fehler in der anfänglichen Zeitschleife im Bootloader verursachte die zusätzliche Verzögerung von zwei Sekunden und wurde behoben. Beim Sprung an den Anfang eines leeren/gelöschten Flash-Speichers dauerte es tatsächlich nur wenige Millisekunden, bis der Bootloader wieder hochgefahren ist, also kein großes Problem. Der beste Ansatz ist jedoch , den Speicherort des Flash-Speichers zu überprüfen, bevor Sie dorthin springen. Wenn es gelöscht ist, starten Sie einfach den Bootloader neu, anstatt in den leeren Bereich zu springen.
Nun, die Antwort auf das Verhalten des Systems ist "wer weiß", weil Sie im Grunde ein undefiniertes Verhalten haben, weil nichts zum Flashen in die MCU geschrieben wurde, wird versuchen, das zu verwenden, was sich an Adresse 0 als Reset-Vektor für die Anwendung befindet. Wenn gelöscht wird, versucht er, 0xffff zu verwenden, und ich glaube nicht, dass der AVR eine Ausnahme ausgibt, wenn Sie die Speichergrenzen verlassen, und er führt eine zufällige Anweisung aus und bleibt wahrscheinlich dort hängen, bis der Watchdog oder eine andere ungültige Anweisung einen Reset verursacht. Die meisten Bootloader neigen dazu, den Wert am Reset-Vektor (normalerweise Adresse 0) zu überprüfen, um sicherzustellen, dass er nicht leer ist, und wenn dies der Fall ist, führen sie den Bootloader einfach in einer Endlosschleife aus, um zu verhindern, dass die MCU auf undefiniertes Verhalten stößt.
PlasmaHH
Eugen Sch.
Oystein
Oystein
PlasmaHH
Eugen Sch.
Oystein
Oystein
Eugen Sch.
Eugen Sch.
Oystein
Eugen Sch.
Tom Tischler