Ich versuche zu verstehen, dass, wenn für die STM32F405-MCU ein benutzerdefinierter Bootloader auf der MCU verwendet wird, jedes der beiden Projekte für den benutzerdefinierten Bootloader und den Anwendungscode über eigene „startup.s“-Dateien verfügt.
Was ich verstehe ist, dass beide der beiden Binärdateien, dh der Bootloader und der Anwendungscode, beide an verschiedenen Stellen im Flash liegen.
Wenn nun der benutzerdefinierte Bootloader beendet wird und die Steuerung zurückgibt, sollte die Steuerung an den Startcode des Anwendungscodes übergeben werden. Aber ich weiß nicht, wie es wirklich passiert. Befinden sich die beiden Binärprogramme an zusammenhängenden Orten, sodass nach Abschluss des Bootloaders die nächste Anweisung die des Startcodes ist?
Oder befinden sie sich an verschiedenen Orten und irgendwie wird die Startadresse des Starts des Anwendungscodes als Sprungadresse am Ende der Bootloader-Binärdatei gespeichert?
Macht es einen Unterschied in der Art und Weise, wie es tatsächlich implementiert wird, wenn ich den Keil- oder GCC-Compiler verwende?
Das kompilierte Abbild einer STM32-Anwendung beginnt mit einer Vektortabelle, in der das erste Wort den anfänglichen Stapelzeigerwert enthält, das nächste die Adresse der ersten Anweisung.
Der Bootloader muss natürlich die Adresse kennen, unter der die Anwendung geladen wird (wie könnte er sie sonst laden?), damit er sich die ersten beiden Wörter des gerade geflashten Images ansehen kann.
Bei der Festlegung der Startadresse der Anwendung müssen Sie das Layout der Flash-Sektoren berücksichtigen. Wenn Teile des Bootloaders und der Anwendung im selben Flash-Sektor landen, kann der Bootloader die App nicht neu flashen.
Die Designer dieser MCU hatten genau zu diesem Zweck ein paar kürzere Sektoren zu Beginn des Flashs angeordnet. Vielleicht möchten Sie 32 KB für den Bootloader reservieren und die Anwendung 0x08008000
beispielsweise unter platzieren, es liegt an Ihnen (und der Komplexität des Bootloaders).
Macht es einen Unterschied in der Art und Weise, wie es tatsächlich implementiert wird, wenn ich den Keil- oder GCC-Compiler verwende?
Der einzige Unterschied bestünde in den Linker-Konfigurationsdateien, die dem Linker mitteilen, wo er die Anwendung laden soll. Der GNU-Linker entnimmt es einem Linker-Skript ( *.ld
), Keil nennt es Scatter-Datei . Sie haben den gleichen Zweck, aber eine unterschiedliche Syntax. Sie sollten auch das Linker-Skript/die Scatter-Datei des Bootloaders anpassen, um die verfügbare Flash-Menge zu begrenzen.
Compiler spielt keine Rolle, einer kann für den Bootloader und ein anderer für die Anwendung verwendet werden. Zuerst schreiben Sie den Bootloader und sehen, wie groß er ist. Dann runden Sie auf die nächste Flash-Sektorgrenze auf, da Sie keinen Sektor mit Bootloader-Code löschen möchten. Lassen Sie den Bootloader zum Start des ersten freien Sektors springen. Weisen Sie dann den Linker an, Code zu generieren, damit der Anwendungscode nicht bis zum Start des Flash geladen wird (Bootloader ist vorhanden), sondern zum Start des ersten freien Sektors nach dem Bootloader.
Chris Stratton
Alt-Rose