Forum: Mikrocontroller und Digitale Elektronik Wer kennt sich mit GNU- Linker aus (bei Studio6)?


von Marcel K. (viewer)


Lesenswert?

Ich kenne die Software von IAR. Dort hat man die Möglichkeit ein 
Linkerfile zu erstellen (.xcl).  In diesem Linkerfile sieht es z.B. so 
ähnlich aus:



// Grenzen für die Applikation definieren
-D_..X_APL_CODE_START=5600     // Start des Applikation -Code
-D_..X_APL_CODE_END=6FFF      // Ende des Applikation –Code

// Grenzen für den Savecode definieren
-D_..X_SAVE_CODE_START=7000    // Start des Save-Code
-D_..X_SAVE_CODE_END=78FF      // Ende des Save-Code

// Grenzen für Applikations- Daten
-D_..X_APL_DATA_START=100      // Start der Applikation Data
-D_..X_APL_DATA_END=800      // Ende der Applikation Data

// Bereich für Applikation definieren
-Z(CODE)APL_CODE=(_..X_APL_CODE_START)-(_.. X_APL_CODE_END)

// Bereich für den Save- Code
-Z(CODE)SAVE_CODE=(_..X_ SAVE_CODE_START)-(_.. X_ SAVE_CODE_END)

// Bereich für die Daten der Applikation definieren
-Z(DATA)APL_DATA=(_..X_ APL_DATA_START)-(_..X_ APL_DATA_END)


Dann hat man im Quellcode die Möglichkeit die Daten und Funktionen an 
die definierten Stellen im µC zu platzieren:

unsigned char data @"APL_DATA";

void functions_init(void)@"APL_CODE"
{ …}
void main(void)@" APL_CODE "
{…}
void save_init(void)@" SAVE_CODE "
{…}

Jetzt arbeite ich auch mit dem ATMEL Studio6. Dort würde ich genauso 
solche Bereiche definieren. Ich habe schon etwas im I-Net gesucht aber 
ich habe nichts Brauchbares gefunden. Ich habe das Dokument: “The GNU 
linker“ durchgelesen. Ich gehe davon aus, dass dies schon möglich ist 
aber ich konnte keine passenden Beispiele finden. Ich gehe davon aus, 
dass man die Grenzen im Studio6 unter „Projekt- 
Properties/Toolchain/AVR/GNU Linker/Memory Settings“ definieren muss. 
Wie verwendet man dann aber die Definitionen im Quellcode?

Kann mir jemand hier im Forum weiter helfen?
Viele Grüße

: Bearbeitet durch User
von Dr. Sommer (Gast)


Lesenswert?

Im Linker Script ( 
https://sourceware.org/binutils/docs-2.24/ld/Scripts.html#Scripts ) 
kannst du Sections definieren und diese nacheinander in den Flash 
packen, z.B.:
1
  .mysection :
2
  {
3
    . = ALIGN(4);
4
    KEEP(*(.mysection)) // dein zeug
5
    . = ALIGN(4);
6
  } >FLASH
7
8
  .text :
9
  {
10
    . = ALIGN(4);
11
    *(.text) // normaler Programmcode
12
  } >FLASH
Im Code kannst du dann bei Funktionen und Variablen mit 
__attribute__((section(".mysection"))) in eben diese Section packen. Mit 
dem ". = " operator kannst du die Adressen in der Ausgabe manipulieren.

von Marcel K. (viewer)


Lesenswert?

Hallo Dr. Sommer ;o)

Danke für Deine Antwort. Ich habe jetzt auch noch mal die 
Atmel-Application Note "AVR32795" (Using the GNU Linker) gelesen. Das 
ist zwar für den AVR32 geschrieben aber ich denke das wird ähnlich sein.
Darin ist beschrieben, dass man das Linker-Sktipt in sein aktuelle 
Projekt kopieren sollte, wenn man noch eigene Bereiche definieren 
möchte. Jetzt habe ich das Problem, dass ich das allgemeine Linkerfile 
nicht finden kann. Ich habe zwar im Unerordner "Atmel" nach ".ld" 
gesucht, allerdings gibt es da sehr viele Dateien. Welches sollte ich 
den als Vorlage verwenden?

Grüße (",)

von Dr. Sommer (Gast)


Lesenswert?

Marcel K. schrieb:
> Welches sollte ich
> den als Vorlage verwenden?
Keine Ahnung wie das bei dem Atmel Gedöns organisiert ist, vielleicht 
gibts da ja eines das so heißt wie dein Ziel-Controller. Du musst 
jedenfalls beim Linken mit dem "-T" Flag dem Linker/GCC das Linkerscript 
angeben.

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.