Kann jemand bitte erklären, wie der Arduino Bootloader funktioniert? Ich suche hier keine Antwort auf hoher Ebene, ich habe den Code gelesen und verstehe das Wesentliche. Ich habe auch diesen anderen Beitrag gelesen (ich war sogar einer der Antwortenden darauf).
Es gibt eine Reihe von Protokollinteraktionen zwischen der Arduino IDE und dem Bootloader-Code, die letztendlich zu einer Reihe von Inline-Montageanweisungen führen, die den Flash selbst programmieren, wobei das Programm über die serielle Schnittstelle übertragen wird.
Was mir nicht klar ist, steht in Zeile 270:
void (*app_start)(void) = 0x0000;
... was ich als Deklaration und Initialisierung eines Funktionszeigers auf NULL erkenne. Es gibt nachfolgende Aufrufe von app_start an Stellen, an denen der Bootloader an die Ausführung des vom Benutzer geladenen Codes delegieren soll.
Sicherlich muss irgendwann app_start
ein Nicht-NULL-Wert erreicht werden, damit dies alles zusammenkommt. Ich sehe das nicht im Bootloader-Code ... ist es magisch durch das Programm verknüpft, das vom Bootloader geladen wird? Ich gehe davon aus, dass der Hauptteil des Bootloaders der Einstiegspunkt in die Software nach einem Zurücksetzen des Chips ist.
In den rund 70 Montagelinien muss der geheime Decoderring verpackt sein, der dem Hauptprogramm mitteilt, wo sich app_start wirklich befindet. Oder ist es vielleicht ein implizites Wissen, das von der Arduino IDE ausgenutzt wird? Ich weiß nur, dass wenn jemand app_start nicht so ändert, dass er auf einen anderen Wert als 0 zeigt, sich der Bootloader-Code für immer auf sich selbst dreht ... also, was ist der Trick?
Wäre es in einem separaten Hinweis möglich, dass sich der Bootloader-Code auf Interrupts stützt, oder ist das ein Nein-Nein?
Bearbeiten
Ich bin daran interessiert, den Bootloader auf einen Tiny AVR (insbesondere den ATTiny44A) zu portieren, der keinen separaten Speicherplatz für den Bootloader-Code hat. Da mir klar wird, dass der Bootloader-Code von bestimmten Sicherungseinstellungen und Chip-Unterstützung abhängt, ist es mir wirklich wichtig zu wissen, was erforderlich ist, um den Bootloader auf einen Chip ohne diese Sicherungen und Hardware zu portieren Unterstützung (hat aber immer noch Selbstprogrammierfähigkeit)?
Ich dachte, ich könnte die Implementierung von AVR307 verwenden, um die USI als Halbduplex-UART zu verwenden (verwendet Timer0-Interrupt und Pin-Change-Interrupt). Kann jemand eine Anleitung zum Schreiben / Portieren des Bootloader-Codes für einen Chip geben, der keine Hardware-Unterstützung für Bootloader bietet?
Ich nehme an, ich würde meinen Bootloader-Code an der normalen Stelle für die Adresse main platzieren (z. B. 0x029e oder wo immer der Compiler main setzt). Ich würde es dann so machen, dass 'Adresse' im Bootloader-Code einen Offset hinzufügt, der mich kurz nach dem Ende von main bringt, und 'app_start' auf diese Adresse gesetzt habe. Denke ich richtig darüber nach oder vermisse ich etwas total? Vielen Dank!
BEARBEITEN 2
FWIW, ich habe einen dokumentierten Prozess zum Laden von Arduino-Skizzen auf einen ATTiny85 gefunden , wo ich ursprünglich mit dieser Frage hingegangen bin ... ziemlich ordentlich, denke ich
quelle
Antworten:
Dies ist kein NULL-Zeiger. Dies ist wirklich die Adresse des Starts des Anwendungscodes, zu dem der Bootloader springt. Der Linker sorgt dafür, dass Ihr Anwendungscode bei Adresse 0 beginnt. Siehe Tabelle 26-6 im ATMEGA168-Datenblatt.
Der Bootloader-Code wird in Flash höher gestartet. Wo genau hängt von den Bootloader-Sicherungen ab.
quelle