Verhalten des AVR-Mikrocontrollers, der nur Bootloader enthält

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.

„Leer“ gibt es nicht. Es gibt einige Daten, die ausgeführt werden.
Hast du nicht gerade gesagt, dass es diese 2 Sekunden verwendet, damit du es programmieren kannst?
@EugenSch. "Es dauert jedes Mal zwei Sekunden zusätzlich zum Bootloader-Timeout, wenn der AVR neu gestartet wird." Mit anderen Worten, es dauert vier Sekunden, wenn das Bootloader-Timeout auf zwei Sekunden eingestellt ist. Wenn also der Zeiger auf die Adresse 0 gesetzt wird, von der ich annehme, dass sie alle 0xFF ist, nachdem der Flash vor dem Programmieren des Bootloaders gelöscht wurde, wird er nach genau zwei Sekunden zurückgesetzt. Und dann dauert es weitere zwei Sekunden, bis das Zeitlimit wieder überschritten wird. Und so geht es in einem Vier-Sekunden-Takt.
@PlasmaHH Auch wenn der Flash gelöscht wird, bevor der Bootloader programmiert wird? Steht der Flash dann nicht auf 0xFF? Was passiert, wenn der AVR versucht, 0xFF auszuführen?
@Oystein: Sofern Sie mit "löschen" nicht "mit einer Zange abreißen" meinen, enthält es einige Daten. 0xFF sind auch Daten.
Hast du den Quellcode für den Bootloader?
@PlasmaHH Du sagst das Offensichtliche. Ich frage mich, was passiert, wenn der Bootloader, der sich am anderen Ende des Flash-Speichers befindet, den Befehlszeiger an den Anfang des Flash-Speichers befiehlt, der gelöscht wird. Warum dauert es zwei Sekunden, bis der Bootloader wieder startet? Gibt es irgendetwas, das dieses Verhalten steuert, das ich konfigurieren kann?
@EugenSch. Ja, es basiert auf AVR109, also habe ich Zugriff auf den Quellcode. Der Bootloader läuft nur zwei Sekunden lang in einer While-Schleife, bevor er einen Funktionszeiger aufruft, der auf die Adresse 0 (die leer ist) gesetzt ist. Aber es dauert weitere zwei Sekunden, bis der Bootloader wieder startet, und meine Frage ist, warum das so ist.
Haben Sie Debugging-Möglichkeiten?
Wo sitzt die "Hauptanwendung" im Flash? Was ist die Befehlstaktfrequenz?
@EugenSch. Nein, leider habe ich derzeit keine Debugging-Möglichkeiten. Die Hauptanwendung beginnt bei Adresse 0. Befehlstaktfrequenz? Der AVR läuft auf einem externen 16-MHz-Quarz, wenn Sie das meinen ...?
Warten Sie.. Also habe ich die Frage nicht bekommen. Meinen Sie, dass Sie nach dem Löschen 4 Sekunden zum Programmieren haben? Wo sitzt der Bootloader? Woher weiß es, dass es beim Start zur Bootloader-Adresse springen muss?
Es dauert wahrscheinlich zwei Sekunden, bis er alle unbekannten Anweisungen im Flash ausgeführt hat und wieder zum Start des Bootloaders gelangt.

Antworten (1)

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.

+1. Tatsächlich führen AVRs einfach Anweisungen aus, egal was passiert .
+1 @TomCarpenter Vielen Dank für Informationen darüber, dass AVR nur Speicherorte durchläuft, bis es auf eine gültige Anweisung trifft. Und für Informationen zum "richtigen" Bootloader-Verhalten (dass er den Speicher an Position 0 überprüfen sollte, bevor er dorthin springt).