AVR- "Bootloader-Hauptfunktion und Anwendungs-Hauptfunktion"

Ich versuche gerade, einen benutzerdefinierten Bootloader für avr zu bauen. Ich weiß, dass die Bootloader-Funktionen mit dem Anwendungsprogramm geteilt werden können. Ich bin wirklich verwirrt mit der Hauptfunktion. Haben Bootloader und Anwendungsprogramm beide eine Hauptfunktion? Wenn nicht, wie man zwei getrennte Programme mit nur einer Hauptfunktion schreibt

Anwendungsprogramm:

    #include <avr/io.h> // application program at 0x0000
    #include <string.h>
    int main()
    {
     uart_init();
    }

Bootloader-Programm:

    #include <avr/io.h>
    #include <avr/boot.h>
    void uart_init();
    void (*funcptr)( void ) = 0x0000;
    int main(void)
    {
   uart_init();
       //Boot or Goto Application program
    }
    void uart_init()
    {
       //UART initialization code;
    }

Antworten (2)

Ich würde sie getrennt halten.

Was Sie tun können, ist:

  • Erstellen Sie zwei Programme, Ihren Bootloader und Ihre Anwendung
  • Stellen Sie sicher, dass diese beiden Programme mit unterschiedlichen Orten verknüpft sind (z. B. Bootloader mit 0x0 (Rücksetzvektor) und Anwendung mit 0x20000 (Anwendungsadresse).
  • Der Bootloader wird nach einem Reset gestartet und entscheidet sofort, ob er die Bootloader-Routinen starten oder zur Anwendung verzweigen soll. Tun Sie nur das, was absolut notwendig ist, um diese Entscheidung zu treffen (die Regeln für diese Entscheidung liegen bei Ihnen; zB ein besonderer Wert in Flash oder ein Knopfdruck).
Der Bootloader kann nur in den unteren Bereich des Controllers geladen werden und das BOOTRST-Flag sollte aktiviert sein, um ihn nach dem Neustart zu laden. Wie können wir in die 0x00-Adresse schreiben? Ist es überhaupt möglich
Welches Teil verwendest du genau? Ich bin mit der BOOTRST-Sicherung nicht vertraut und würde sie gerne für Ihr spezifisches Teil nachschlagen. Wenn ich das richtig verstehe, bewirkt diese Sicherung, dass der Prozessor von einer anderen Adresse aus startet. Sie müssen dem Linker mitteilen, wo er Ihren Bootloader oder Ihre Anwendung ablegen soll. Für die 32-Bit-Teile (AT32 ...) erfolgt dies über eine Linker-Einstellung + einen Code namens Trampolin (der nur einen Sprung-Opcode ausführt).
Ja, BOOTRST veranlasst den Controller, den Code nach dem Neustart im Boot-Bereich auszuführen. Dann können wir vom Startcode zum Anwendungscode springen
In diesem Fall müssen Sie den Bootloader-Code mit dem Boot-Bereich und den Anwendungscode mit dem "normalen" Anwendungsbereich verknüpfen. Ist das eine Flagge, die Sie beliebig oft programmieren können? Denn dann könnten Sie es als Indikator verwenden, ob der Bootloader eingetragen werden soll oder nicht und Sie müssten den Sprung nicht manuell vornehmen.
Dieses Flag kann nur mit einem Programmiergerät gesetzt und intern nicht geändert werden. Immer wenn Sie beim Schreiben von Anwendungscode auf ein Problem stoßen, wird beschädigter Anwendungscode die gesamte Verwendung beeinträchtigen, und Sie benötigen erneut einen externen Programmierer, wenn Sie den Anwendungscode nach dem Neustart starten. In einem solchen Fall kommt BOOTRST zu Ihrer Rettung

Das Kombinieren von Bootloader und Hauptprogramm in einer Binärdatei macht keinen Sinn, es sei denn, Sie möchten etwas ganz Besonderes erreichen. Der Bootloader wird normalerweise zum Flashen/Upgrade des Hauptprogramms über eine "normale" Schnittstelle (USB, UART) verwendet, und der BL-Code wird normalerweise nur einmal über ISP/JTAG hochgeladen. Der BL-Code unterstützt möglicherweise auch die Verschlüsselung, um Ihren Code nicht an alle weiterzugeben, die Ihr Gerät flashen (Firmware-Upgrade).

Wenn der Bootloader-Code eingegeben wird (abhängig von FUSEs), sollten Sie schnell entscheiden, ob Sie zum Hauptcode springen oder im Bootloader bleiben. Der Standard-Bootloader von Arduino verwendet Timeouts, die auf den Stk-Protokoll-Header auf der seriellen Schnittstelle warten, was sehr ärgerlich ist, da es jeden Bootvorgang um einige Sekunden verlängert. Ich ziehe es vor, wenn eine Benutzeroberfläche vorhanden ist (Taste, ...), schnell zu testen, ob der Benutzer die Firmware zum Flashen bringen möchte (Taste nach dem Aus- und Einschalten gedrückt halten oder so).