Schreiben von Daten während der Kompilierungszeit an eine bestimmte Adresse

9

Ich hoffe, der Titel ist beschreibend genug. Also hier ist, was ich tun möchte und womit ich gespielt habe.

Warten Sie, zuerst ist dies eine eingebettete Anwendung. Atmel SAM4L-Mikrocontroller, mit der Atmel Studio IDE und GCC-Compiler / Linker.

Richtig, ich schreibe einen Bootloader, aber ich möchte die Bootloader-Version im Programmspeicher bis zum Ende des zugewiesenen Speicherplatzes für den Bootloader speichern (sagen wir 0x3FF0). Auf diese Weise kann die App auch die Bootloader-Version überprüfen, indem sie nur die spezifische Adresse anschaut. In diesem Moment bin ich beschäftigt mit einem Dienstprogramm für die App, um den Bootloader selbst zu aktualisieren, aber ich möchte nicht, dass die App oder der Bootloader die Version bei 0x3FF0 mit einem Befehl oder im Code aktualisieren, ich will es als Teil der. bin / .hex Datei, wenn ich also den Bootloader aufleuchtet, wird die Version mit geblinkt. Zur Zeit habe ich eine #define für den Bootloader-Typ, Hauptversion und Nebenversion, die alle in einer Datei globals.h im Projekt sind. Im Grunde möchte ich nur diese 3 Bytes zu 0x3FF0 schreiben, wenn ich kompiliere.

Wie ich es verstehe, gibt es ziemlich viele Tricks, die ich mit dem Linker ziehen kann, aber noch nie zuvor mit Linker-Skripten bis gestern gespielt habe und einige Dinge damit machen konnte, aber nicht das, was ich will. Das Projekt erzeugt auch ein ziemlich intensives Linker-Skript, also bin ich auch vorsichtig, wohin ich springen und meine drei Bytes ausgeben soll. Ich weiß, dass Sie den Adresszeiger nicht zurück verschieben dürfen.

Hier ist das Linker-Skript, das vom Projekt generiert wurde

%Vor%

Soweit mir bekannt ist, ist .ARM.exxid der letzte im ROM platzierte Abschnitt und .relocate wird basierend auf den Regionen und MEMORY-Deklarationen im RAM (ab 0x20000000) platziert, so dass meine drei Bytes irgendwo dazwischen liegen sollten diese beiden.

Was WIE angeht, habe ich dieses Beispiel versucht Ссылка aber ich sehe es nicht in meinen .bin- oder .hex-Dateien. Ich nehme an, dass es nur den Speicher zuweist und tatsächlich nichts lädt, da es nur eine Variable ist. Ich habe auch solche Dinge gefunden gcc linker beschreibung datei erzwingen symbol spezifisch sein Adresse , aber ich tue es nicht, da es nicht der tatsächliche Code ist, den ich versuche, auf eine bestimmte Adresse zu laden, ich sehe nicht, wie ich diese Methode verwenden kann.

Ich spiele immer noch damit herum, das Linker-Skript zu manipulieren und zu sehen, was ich erreichen kann, aber jede Hilfe wäre sehr willkommen.

Wenn weitere Informationen erforderlich sind, fragen Sie bitte und ich werde zur Verfügung stellen. (Oder wenn ich den Titel oder die Tags für bessere Treffer ändern muss.)

    
kowalski5233 18.11.2014, 09:58
quelle

2 Antworten

0

Also, für diejenigen, die hier auf der Suche nach Antworten landen, ist dies das detailliertere Beispiel für das, was ich getan habe.

In main.c habe ich einen Prototyp definiert, damit das Beispiel funktioniert. Danach habe ich versucht, ein Array zu bekommen:

%Vor%

Dann, in dem Linker-Skript, nachdem der letzte Abschnitt in der 'rom' Region platziert wurde, füge ich meine Sachen hinzu, die ich in der 'rom' Region hinzufügen möchte:

%Vor%

Hinweis: Ich musste das Beispiel optimieren, indem ich den Zeiger einfach auf einen Wert stellte, der nicht funktionierte. Ich musste eine Variable erstellen und die AT-Funktion verwenden. Während meiner Tests habe ich die Region 'rom' hinzugefügt und habe nicht überprüft, ob es immer noch funktioniert, wenn ich es entferne.

Wenn ich kompiliere, bekomme ich folgendes Ergebnis:

%Vor%

Vom letzten Code bis 0x3FF0 füllt sich die .bin-Datei mit 0x00, dann die paar Byte Code für meine jver (void) -Funktion (was wahrscheinlich nur ein Aufruf der jamba_TxBuff-Funktion ist), dann füllt 0x00 den ganzen Weg zu 0x4100 wo "0123456789" befindet. BOOM!!! Alles, was ich jetzt hinzufügen werde, ist die 'FILL' -Funktion im Linker-Skript, die mit 0xFF anstelle von 0x00 gefüllt wird.

Nochmals vielen Dank für die Hinweise und Ratschläge.

    
kowalski5233 20.11.2014, 15:31
quelle
1

Die Adresse der Dinge wird in der Linker-Phase bestimmt und für den Linker ist alles nur ein Symbol. Also während Ihr gcc linker description file force to to an einer bestimmten Adresse sein  Geben Sie ein Beispiel für eine Funktion an, die für Daten gleichermaßen funktioniert. Definieren Sie Ihre Version und legen Sie sie im C-Code in einen separaten Abschnitt "Version". Dann kann der Linker diesen Abschnitt irgendwo platzieren.

Nun ist es schwierig, es zum Ende des Roms zu bringen, was bedeutet, dass eine Startadresse gerade so niedrig ist, dass der Abschnitt am Ende von rom endet. Eine feste Größe (Ihre 3 Bytes) zu machen macht das einfacher. Sehen Sie sich an, wie ram_end im Linker-Skript definiert ist. Tun Sie dasselbe für rom_version_start , aber mit rom statt ram und verwenden Sie das, um den Anfang des Abschnitts "version" mit '. = rom_version_start ;

    
Goswin von Brederlow 18.11.2014 21:42
quelle