2016-04-20 11 views
-1

Ich bin sehr verwirrt, mit dem Unterschied zwischen Bootloader und Startup-Code in Mikrocontroller (wie AVR atmega) verwendet und ich habe einige Fragen, die beantwortet werden müssen:Bootloader/Start-Code Embedded System

Kann ich sowohl in die gleiche Zeit oder wenn ich eine benutze, kann ich die andere nicht benutzen?

Welche sollte beim Neustart des AVR zuerst ausgeführt werden?

Welche ist in Assembly geschrieben und welche ist in C geschrieben?

Kann der Bootloader die Startup-Funktion ausführen? like (Kopieren von initialisierten Daten vom ROM zum RAM, Initialisieren des Stack-Pointers des Prozessors, Aufruf von main, ... etc).

Welcher ist im AVR "eingebaut" und welchen sollte ich entwickeln?

Vielen Dank im Voraus!

Antwort

2

Ich denke, Sie sprechen über Bootstrap nicht Bootloader. Ein C-Bootstrap möchte in Assembly geschrieben werden, sonst hast du ein Henne-und-Ei-Problem. Sie können einiges davon in C schreiben, aber dieser C-Code kann nicht vollständig mit dem Standard übereinstimmen (kann nicht davon ausgehen, dass Variablen in bss Null sind oder vorinitialisierte Variablen initialisiert werden, wenn dieser C-Code diese beiden Dinge tut).

Zum Booten einer High-Level-Sprache ist nichts mit Mikrocontrollern oder einem bestimmten Befehlssatz zu tun, sondern global. Eine Hochsprache, sogar C, hat bestimmte Annahmen (der Stapelzeiger wurde eingerichtet, globale Variablen, die mit einem Anfangswert definiert sind, sind dieser Wert, und andere sind Null, jede C-Bibliotheksvorbereitung (Heapspeicherort)) main() oder was auch immer der Einstiegspunkt in C ist. Gleiches gilt für andere Sprachen.

Dies ist der Grund, warum der Bootstrap normalerweise in asm ist, da er keine dieser Regeln hat und Zugriff auf Dinge wie den Stack-Zeiger hat, den die High-Level-Sprachen nicht haben.

Wenn Sie bereit sind, auf einige Sprachkompatibilität zu verzichten, kann der Bootstrap einfacher sein. Mit dem Arm-Cortex-M bietet die Hardware eine Lösung für die Initialisierung des Stack-Pointers ohne Code und startet in C, wenn Sie es für den Einstiegspunkt wollen, aber Sie erhalten nicht die globale Variable Initialisierung, wenn Sie das tun, also wenn Sie wollen verzichten Sie darauf, dass Sie dann nur einen Weg brauchen, um die Vektortabelle zu definieren (asm-Direktiven sind bei weitem die einfachsten, da die Werkzeuge alle da sind).

Jetzt vielleicht, was Sie Startup-Code aufrufen Ich rufe Bootstrap.

Ein Bootloader ist ein Programm, das in der gewünschten Sprache geschrieben wird und den Chip oder das System anzeigt. Es kann Uhren einschalten oder ddr aufladen oder Speicher löschen, um ecc zu aktivieren, was auch immer Sie benötigen. Und dann starten Sie die Hauptanwendung (geschrieben in welcher Sprache, jeder dieser Dinge der Bootloader und die Hauptanwendung hat Startcode nach den Sprachregeln wie oben erwähnt als Bootstrap den Begriff, den ich verwende). Das ist der Boot-Teil des Bootloaders. Der Loader-Teil impliziert, dass jemand den Startvorgang vom Starten der Anwendung abbrechen kann, sodass ein Entwickler in irgendeiner Weise mit einer anderen Anwendung experimentieren kann, indem er entweder die Anwendung in einem nichtflüchtigen RAM überschreibt oder in die Anwendung rammt und sie anstelle des normalen Boot-Pfads ausführt .

Einige Bootloader sind in Teilen konzipiert, so dass Sie den Bootloader mit dem Bootloader aktualisieren können, zum Beispiel könnte Ihr Bootloader so gestaltet sein, dass er sich vor allem anderen in ram kopiert, wenn Sie den Bootloader selbst modifizieren wollen Sie können, mit dem Bootloader den Flash überschreiben, in der Hoffnung, nicht selbst zu mauern. Sie können auch einige Schutzmechanismen wie zwei Bootloader setzen, der erste hat Code, der sich selbst überprüft, wenn er beschädigt ist oder wenn Sie einen Strap haben oder was auch immer es den sekundären startet, der sekundäre kann verwendet werden, um den primären zu überschreiben, den der primäre überschreiben kann sekundär. Sie haben immer noch ein Problem mit Huhn und Ei mit dem kleinen Code oben, der den Gurt überprüft oder eine Prüfsumme vor dem Start in den Rest des Codes. du brichst das und du bist immer noch vermauert.

Chips wie der AVR haben Hardware-Möglichkeiten, um sich von gemauert zu erholen, und haben auch hardwaregeschützte Bootloader, manchmal werkseitig programmiert, bevor Sie den Chip bekommen, von dem Sie einen Riemen oder einen Schlüssel oder was auch immer zu starten und Laden Sie Ihre Anwendung.

+0

Sie sagen also, dass der Bootloader einen "Bootstrap" hat, der für den Bootteil verantwortlich ist und in Assembly geschrieben werden sollte, da er keine der oben genannten Regeln hat? –

+1

ein Bootloader ist ein Programm wie jedes andere, wenn es in einer Hochsprache geschrieben ist, dann erfordert es einen Bootstrap, um es auszuführen, richten Sie die Stapelkopie .data ein, falls nötig. null .bss und so weiter. hat nichts mit seiner Aufgabe oder der Umgebung oder Plattform zu tun, auf der es läuft.Ein Bootloader ist nur ein Programm wie ein Betriebssystem ist nur ein Programm wie ein Webbrowser ist nur ein Programm. –

2

Der "Startup-Code" wird eigentlich C-Laufzeit genannt. Es wird Ihrem Programm vom Compiler hinzugefügt. Sie können den Assembler-Code in den mit WinAVR und Atmel Studio installierten src-Dateien sehen. Es wird so etwas wie crt5.asm genannt, je nachdem, welchen Prozessor Sie verwenden.

Wenn Sie die C-Laufzeit ändern möchten, können Sie. Schreiben Sie Ihre eigene Kopie und kompilieren Sie sie mit Ihren Programmdateien mit dem Compiler-Schalter --nostartfiles. Sie können es in Assembly oder C schreiben, aber Assembly ist einfacher.

Ein Bootloader ist ein Programmcode, der auch vor der C-Laufzeit und Ihrem Programmcode aufgerufen wird. Der Code prüft, ob eine Bedingung erfüllt ist, etwa wie eine Schaltfläche gedrückt wird. Wenn die Schaltfläche gedrückt wird, lädt der Bootloader neuen Code in den Flash. Wenn nicht, springt der Code zum Reset-Vektor und Ihre C-Laufzeit und der Code laufen normal.

Der Bootloader-Code befindet sich in einem speziellen Flash-Abschnitt nahe dem Ende, und einige Sicherungseinstellungen bewirken, dass die Ausführung dort beginnt, anstatt wie bei normalem Start mit dem Reset-Vektor zu Beginn des Flash.

Was die Frage von C versus Assembler betrifft, ist die Antwort, dass jeder Code in jeder Sprache geschrieben werden kann. Der Compiler konvertiert den Quellcode in Maschinenanweisungen für die Zielarchitektur, die als Objektcode bezeichnet werden. Normalerweise gibt es eine Compiler-Option, um den in Assembleranweisungen umgewandelten C-Quellcode auszugeben, bevor er in den Objektcode kompiliert wird, damit Sie ihn betrachten können. Dies ist praktisch, wenn Sie in C schreiben und dann den Code in der Montagephase optimieren möchten.

+0

So wie der Bootloader vor C-Laufzeit ausgeführt wird, muss es in Assembly geschrieben werden? Kann ich irgendwie diesen Bootloader ändern? –

+0

Wenn Sie den Bootloader-Quellcode haben, können Sie ihn modifizieren und kompilieren. Sie können es jedoch nicht mit dem vorhandenen Bootloader auf den Prozessor laden. Sie müssen es mit AVRIce über JTAG oder ein ähnliches Gerät laden. – UncleO

+0

@MarwanAhmed Sie benötigen normalerweise ein spezielles Gerät, um den Bootloader zu ersetzen. Der ganze Punkt des Bootloaders auf etwas wie eine AVR-CPU ist eigentlich, um die Notwendigkeit für diese Art von Gerät zu entfernen. Andernfalls würde man ohne ein Bootloader ein solches Gerät brauchen, um irgendwelche Programme darauf zu installieren. –