Forum: Compiler & IDEs GCC-Linker (Linkerfile *.ldf)


von D.Peters (Gast)


Lesenswert?

Ich verwende aktuell einen LCP2132(ARM7).

Das FLASH liegt von $00000000-$0000ffff.
Dabei sind die ersten 8 Sektor jeweils 4kByte groß, gefolgt von einem 
32kByte Sektor.

Im ersten Sektor liegen unteranderem die Resetvektoren.

Ich muss im FLASH Konfiguratiosndaten dauerhaft abspeichern; ich haben 
mir dazu  folgende FLASH-Belegung ausgedacht:
  - $00000000-$00000FFF   Vektoren und Progamm
  - $00001000-$00001FFF   --Reserviert für Konfigdaten
  - $00002000-$0000FFFF   Restliches Programm

Wie erkläre ich es dem Linker?


Gruß D.Peters

von Krapao (Gast)


Lesenswert?

Mit dem entsprechenden linker control script

Als Vorlage kann das Default-lcs deines µC deiner Toolchain dienen. Du 
bekommst raus, welches das ist, wenn du die Toolchain mal mit der -v 
Option aufrufst, um die vom gcc Compilerdriver erzeugten Kommandozeilen 
auszugeben und dann die auf ldscripts untersuchst.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du deine Konfigdaten ganz hinten im Flash ablegst, solltest du
auch rein mit Kommandozeilenoptionen auskommen.  Das Standard-LCS
bastelt eine Section namens .text an den Anfang des Flashs, und
du packst deine Konfigdaten einfach in eine zweite Section (mit
beliebigem Namen), deren Startadresse du dann mittels der
Linkeroption --section-start festlegst (wenn man vom Compiler aus
eine Linkeroption festlegen will, gibt man als Präfix ein «-Wl,» an).

von D.Peters (Gast)


Lesenswert?

Wenn ich meine Konfiguration ganz nach hinten lege, liegt diese im 
32K-Sektor und diesen müsste ich beim erneuten Abspeichern der 
Konfiguration vollständig löschen, um ihn neu beschreiben zu können, 
dadurch wäre dann aber auch das Porgamm betroffen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Tja, wenn dem so ist, dann hat NXP da wohl eine ungeschickte Aufteilung
des Flashs (ich finde in deren Datenblättern und Appnotes gerade keine
relevante Information dazu).  Dann bleibt dir weiter nichts übrig,
als im Linkerscript die Tabellen am Anfang vom eigentlichen Programmcode
zu trennen, damit deine eigenen Daten dazwischen geschoben werden
können.

von D.Peters (Gast)


Lesenswert?

Da ich das Linkerscript irgendwie nicht verstehe, habe ich folgende 
Lösung gefunden:
  - Ich habe in der startup.s hinter den Vectoren fix n*0xffffffff
    eingetragen, dadurch habe ich den Bereich reserviert ,muss nur
    mit einer fixen Adresse für die Configdaten arbeiten.

  - Müssen die Configdaten gespeichert werden, so kopiere ich zunächst
    den kompletten Sector0(4K) ins RAM, trage in die Kopie die 
Configdaten
    ein, lösche den Sektor0 und schreiben anschließend die geänderte
    Kopie ins FLASH.
    ACHTUNG: Während des Löschens und Beschreiben des FLASH's müssen
    die IRQ's gesperrt werden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

D.Peters schrieb:
> Da ich das Linkerscript irgendwie nicht verstehe

Warum postest du es nicht hier und beschreibst, was du darin
nicht verstehst?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.