Ich würde gerne wissen, was der Zweck der ARM-Scatter-Datei und der ARM-Linker-Adress-MAP-Datei ist. Wie helfen sie beim Kompilieren und schließlich beim Laden der ausführbaren Datei?
Um C-Code in ein ausführbares Image zu kompilieren, das Sie auf einem ARM-Mikrocontroller ausführen können, sind zwei Schritte erforderlich: Kompilieren und Linken.
Beim Kompilieren wird der C-Code schließlich in Objektcode umgewandelt, der für sich allein nicht verwendbar ist. In der Mitte des Prozesses können Sie möglicherweise vorläufige Assembly-Listen für die C-Dateien erstellen.
Während des Linkens werden die Objektdateien alle miteinander kombiniert und die Funktionsaufrufe und globalen Variablen werden verknüpft. Es entscheidet auch, wo im Speicherbereich des Ziels alles landet (Code, Nur-Lesen-Daten, Lesen/Schreiben-Daten).
So können Sie so etwas aufrufen, printf
ohne den Code in Ihrer Datei zu haben. Wenn Sie kompilieren, weiß es nichts über printf
außer dem Prototyp in stdio.h
. Bei der Verknüpfung füllt der Linker die Details darüber aus, wo sich printf
der Speicher tatsächlich befindet.
Der Linker verwendet eine Scatter-Datei, um zu wissen, wo im Ziel bestimmte Speicherbereiche vorhanden sind. Typischerweise ordnet ein Mikrocontroller den internen Flash der Adresse zu 0x00000000
. Internes SRAM existiert an einer anderen Adresse, sagen wir 0x20000000
, und externes DRAM oder Flash könnte an einer anderen Adresse existieren, 0x80000000
. Die Scatter-Datei informiert den Linker über diese Bereiche und weist ihn an, bestimmte Abschnitte der Ausgabe in bestimmten Bereichen zu platzieren. Normalerweise befindet sich Ihr ausführbarer Code in dem text
Abschnitt, der normalerweise in Ihrem internen Flash gespeichert wird. Ihre schreibgeschützten Daten würden in dem aufgerufenen Abschnitt leben rodata
und auch im Flash gespeichert werden. Lese-/Schreibdaten sind normalerweise in bss
(auf Null initialisiert) oderdata
(mit Wert initialisiert), und dies würde im RAM platziert, wobei initialisierte Werte in einem anderen Abschnitt im Flash gespeichert werden.
Diese Abschnittsnamen sind in gewisser Weise Toolchain-spezifisch, obwohl sie normalerweise für alle Tools ähnlich sind.
Die Linker-Map-Datei ist eine Ausgabedatei, die Ihnen nach dem Linken mitteilt, wo all Ihre Symbole gelandet sind. Beispielsweise kann es Ihnen sagen, dass sich in Flash main()
befindet 0x00000278
und dass sich die globale Variable in RAM int x
befindet . 0x20001012
Es wird Ihnen auch sagen, wo Linker-generierte Abschnitte platziert wurden. Dazu gehören Ihr C-Stack, möglicherweise ein Interrupt-Stack und möglicherweise auch ein Heap. In der Scatter-Datei können Sie normalerweise auch die Größe dieser Abschnitte angeben.
Olin Lathrop
DoxyLover
Abhijit K Rao