Frage
Für ein eingebettetes System, das ich brauche ein paar Datenstrukturen an festen Adressen zu platzieren, so dass eine separate Steuer-CPU sie an einem bekannten Ort zugreifen können. Ich bin Linker Skripte für das eingebettete Ziel dies zu erreichen, sowie #defines diesen gleichen Adressen für das Steuer-CPU.
Es stört mich, dass diese Adreßkonstanten daher an zwei Stellen definiert sind, die Linker-Skript und eine Header-Datei. Ich möchte nur einen haben. Die beste Lösung, die ich mit so weit kommen habe, ist den Makefile läuft cpp auf der Linker-Skript haben, so dass es den gleichen Header # include.
Gibt es einen besseren Weg, dies zu erreichen? Gibt es eine wenig bekannte Option oder eine Namenskonvention für die Linker-Skript ld, die es automatisch durch cpp laufen?
Lösung
Das ist nicht ganz die Lösung, die Sie suchen, aber eine Option ist das Build-System zu nutzen, um diese Werte zu konfigurieren. Erstellen Sie eine config.h.in und eine target.ld.in, die als Vorlagen handeln und haben das Build-System erzeugt eine config.h mit den richtigen definieren und einer target.ld mit der richtigen Adresse für das Ziel Sie bauen.
Wir verwenden CMake für unsere Embedded-Systeme und unterstützt diese Art der Sache. GNU autoconf auch tut, aber ich nie persönlich mochte es wirklich.
Andere Tipps
Sie können das eingebetteten-C spezifisches Konstrukt @ verwenden, um ein Objekt irgendwo im Adressraum zu platzieren.
static struct SOMESTRUCT somestruct @ 0x40000000;
extern int someextint @ 0x3ffffffc;
char somebuffer[77] @ 0x80000000;
Unter der Annahme eines 32-Bit-MCU.