Frage

Ich versuche, ARM zu programmieren mit Eclipse + CDT + Yagarto (Gnu Toolchain) + OpenOCD. In mehreren Beispielprojekten (von Yagarto Website zum Beispiel) fand ich Linker-Skripte (* .LD), wo viele Verknüpfungsinformationen angegeben (zusammen mit Abschnitten Definitionen). Eigentlich habe ich nicht diese Dateien konfrontiert, bevor (IAR nicht, sie braucht), und ich finde sich etwas schwierig von einem ersten Blick zu verstehen. So ist meine Frage kann ich eine einzige solche Skript-Datei für meinen Zielprozessor verwenden (STR710FZ2T6) mit allen meinen Projekten oder ich habe kennen zu lernen in dieser Skripte zu schreiben und schreiben sie für jedes Projekt. Wenn ich einzelne Datei für alle Projekte für bestimmten Zielprozessor verwenden kann, können Sie bitte Rat, wo ich so universal finden kann.

War es hilfreich?

Lösung

ist Meine Vermutung jeder Dritte ein anderes Skript oder Lösung. Es gibt eine Reihe von Problemen, die gelöst werden müssen, unterschiedliche Linker werden diejenigen, die in unterschiedlicher Weise zu lösen. Ich denke, GNU gemacht hat es viel zu schwierig, wenn nicht schwarze Magie.

Für ein eingebettetes System Sie gehen oft einen Blitz haben oder EEPROM oder eine andere Form von Nur-Lese-Speicher aus zu booten. Wie bei anderen Prozessoren der ARM hat eine Vektortabelle ihm im Wesentlichen zu sagen, wo der Reset-Code ist und unterbrechen usw. Damit Tabelle in einem bestimmten Ort sein und Sie müssen den Linker sagen setzen in diesem bestimmten Ort (erster) .

Eines der Skripte ich verwenden möchte, ist:

MEMORY
{
    bob (RX) : ORIGIN = 0x0000000, LENGTH = 32K
    joe (WAIL) : ORIGIN = 0x2000000, LENGTH = 256K
}

SECTIONS
{
    JANE : { startup.o } >bob
}

Normalerweise verwende ich RAM und ROM als Namen anstelle von Bob und Joe aber demonstrieren hier, dass es spielt keine Rolle, was die Namen sind sie nur Etiketten.

Eine weitere Variation des Themas:

MEMORY
{
    rom(RX)   : ORIGIN = 0x00000000, LENGTH = 0x8000
    ram(WAIL) : ORIGIN = 0x20000000, LENGTH = 0x2000
}

SECTIONS
{
    .text : { *(.text*) } > rom
}

Der erste können Sie die Dateien auf dem Linker Befehlszeile in beliebiger Reihenfolge bringen, aber sie haben die Vektortabelle in der startup.o Datei haben. Letztere können Sie verwenden, was Dateinamen aber die erste Datei auf dem Linker-Skript muss die Vektortabelle haben.

arm-thumb-elf-gcc -Wall $(COPS) vectors.o putget.o blinker2.c -T memmap -o blinker2.elf

oder mit ld direkt

arm-thumb-elf-ld vectors.o putget.o blinker2.o -T memmap -o blinker2.elf

Der RX teilt den Linker mit lesen zu setzen und so in diesem Speicherbereich ausführen und die WAIL ist im Grunde alles anderes. Wenn Sie nur einen Widder zum Beispiel haben, können Sie alle Flaggen setzen RXWAIL auf der Linie, die sagt, wo der Widder ist. Je nach Ihren Lader in diesem Fall können Sie auf der Elf-Datei verlassen, um den Lader zu sagen, wohin zu verzweigen zu starten, oder Sie können einfach den Eintrag den Anfang des binären Punkt machen und der Lader kann einfacher sein. Die Arme (nicht die Cortex-M3) einen Verzweigungsbefehl als erster Vektor für das Reset-Vektor so können Sie nur eine Vektortabelle sowieso für eine Ramme Lösung zu bauen so tun, und werden nur funktionieren.

Das gibt eine Reihe von Problemen mit dieser Lösung, die mich nicht passieren zu stören. Ich initialisieren Variablen in meinem Code, nicht bei der Deklaration.

Das

int rx;

int main ( void )
{
  rx = 7;

statt

int rx=7;

int main ( void )
{

Ich gehe davon auch nie, dass eine Variable Null ist, wenn der Code beginnt ich es immer etwas zu initialisieren, bevor ich beginne. Ihr Startcode plus Linker-Skript als Team zusammenarbeiten kann, es einfacher zu machen, das Zurücksetzen des bss Code und Kopierens nicht-Null init Daten von ROM zu automatisieren Boote rammen auf. (Das int rx = 7;. Oben erfordert einige Code, kopiert den Wert 7 von irgendwo in rom und schreibt sie in dem Speicherplatz im RAM für die Variable rx zugeordnet, so dass, wenn main () die 7 beginnt es

Mein Boot-Code ist auch ganz einfach als Ergebnis dieser Methode:

.globl _start
_start:
    b reset
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang
    b hang

hang : b hang

reset:
    ldr sp,=0x10004000
    bl main
    b hang

Sie werden über Lösungen sehen oder zu lesen, dass der Startcode und der Linker Skript erlauben, zusammen zu arbeiten, um nicht Stapelzeiger, Heap-Speicher zu codieren zu haben, solche Dinge, können Sie wieder eine Menge Arbeit in komplizierter Inbetriebnahme setzen Code und Linker-Skripte einige Automatisierung und vielleicht sparen einige Arbeit, vielleicht auch nicht zu gewinnen. Die Automatisierung, ob / wann kann arbeiten und menschliche Fehler reduzieren und das kann eine gute Sache sein, auch wenn Sie Chips häufig wechseln oder versuchen, ein Stück Code zu schreiben, der in einer Familie von Chips funktioniert können Sie diese Automatisierung wollen auch .

Mein Fazit ist, JA Sie mit nur einem Linker-Skript für alle Ihre ARM Arbeit leben können. Aber Sie haben Ihre Arbeit zu diesem Skript anzupassen. Sie werden wahrscheinlich nicht ein Skript zu finden, die mit everyones Beispielcode funktioniert. Je komplizierter das Skript desto schwieriger wird es zu leihen sein. Ja, mein Skripte oben kann wahrscheinlich auf der ld Kommandozeile erfolgen, aber Art und Weise zurück, wenn (gcc 2.95) Ich könnte nicht, dass so die minimale Skript entwickelt, um die Arbeit oben und haben sie seitdem mit. Mußte das zweite Skript aus irgendeinem Grunde zu ändern, aber mit 4.x.x, sicherlich 4.4.x Ich bin in der Lage entweder eine verwenden.

Andere Tipps

Es gibt keine universelle Linker-Skript. Diese Skripte sind sehr wichtig, da sie definieren, wo im Speicher (RAM oder ROM) die verschiedenen Daten und Programmteile platziert werden. Es ist etwas Gleichwertiges in IAR Compiler (xcl Dateien, wenn ich mich richtig erinnere). Sie haben offenbar nur die Standardeinstellung, bis jetzt verwendet.

Es gibt ein schönes Dokument über STR7xx namens „Open-Source-Tools für STR7xx Kreuz Entwicklung“. Sie einen Link in Yagarto Homepage finden. Ich empfehle Ihnen, einen Blick auf sie und versuchen zu verstehen, wie Linker-Dateien arbeiten. Darüber hinaus gibt es einige weitere Konfigurationsdateien, die Sie benötigen ein gewisses Verständnis haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top