Arduino Bootloader Details

11

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_startein 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

vicatcu
quelle
1
stackoverflow.com/questions/3652233/arduino-bootloader/… Ich habe mich gefragt, wohin meine Antwort ging ...
Nick T

Antworten:

12
void (*app_start)(void) = 0x0000; 

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.

Toby Jaffey
quelle
Wo befindet sich dann der Bootloader-
Hauptcode?
1
@Joby, ah ok ... siehe Update zu meiner Frage - Ich möchte versuchen, den Bootloader auf einen Tiny AVR zu portieren, der keinen separaten Speicherplatz für den Bootloader-Code hat.
Vicatcu
1
@Joby, daher basiert der Bootloader-Code auf "... die Boot-Reset-Sicherung kann so programmiert werden, dass der Reset-Vektor nach einem Reset auf die Boot-Flash-Startadresse zeigt. In diesem Fall wird der Bootloader nach einem Reset gestartet. ""
Vicatcu
3
Wollten Sie speziell den Arduino Bootloader? Es emuliert einen STK500-Programmierer und ist als solcher etwas sperrig. Es gibt eine atmega8-Version im Bootloader-Verzeichnis, die mit gcc-3 auf unter 1 KB kompiliert wird, aber selbst das lässt Sie ziemlich wenig verfügbaren Flash.
Peter Gibson
3
Würdest du überhaupt einen Bootloader wollen? Für einen ATTiny lohnt es sich sicherlich eher, das Gerät mit einem ICSP-Programmierer (wie dem usbTinyISP) zu programmieren
SingleNegationElimination