Forum: Mikrocontroller und Digitale Elektronik ATMega128: Section DATA ins externe RAM


von Stefan Kellermann (Gast)


Lesenswert?

Hallo,

ich moechte gerne das Segment DATA ins externe RAM legen.
Dazu uebergebe ich dem Compiler die Linker-Option -Wl,data=0x801100
Das ganze laesst sich auch compilieren und linken, jedoch liegt DATA
weiterhin auf 0x800100 (internes RAM).
Kann mir jemand sagen, was ich falsch gemacht habe?

Gruss,
Stefan

von Stefan Kellermann (Gast)


Lesenswert?

Sorry,

ich hab' ganz vergessen Euch mitzuteilen, dass ich ich mit dem GNU
AVR-GCC V3.4.5 arbeite und die LDFLAGS fuer den Linker im zugehoerigen
Makefile mit obiger Option erweitert habe:

override LDFLAGS = -Wl,-Map,$(PRG).map
-Wl,--section-start=.EXUART=0x808000 -Wl,-Tdata,0x801100

Die andere Sache mit meinem externen UART am externen Datenbus an
Adresse 0x8000 hat der Linker korrekt ausgefuehrt, d.h das Segment
wurde angelegt.

Gruss,
Stefan

von Stefan (Gast)


Lesenswert?

Ich würde für die .data section nicht über die Linker-Option gehen,
sondern über das Linker-Skript und den Startup-Code.

Dazu muss dein Linker Control Script (*.ld) wissen, dass es ein
externes RAM gibt (=> MEMORY-Definition) und dein Startup-Code, dass
DATA dorthin statt ins SRAM kopiert werden muss. Der externe RAM muss
zu dem Zeitpunkt der Kopieraktion natürlich schon betriebsfähig sein...

von Stefan Kellermann (Gast)


Lesenswert?

Hallo Stefan,

danke fuer den Hinweis!

Hab' ich gleich umgesetzt und funktioniert auch, wenn ich folgenden
Umweg gehe und die urspruengliche section DATA in Exram_data
umbenenne:

Memory:
exram  (rw!x) : ORIGIN = 0x801100, LENGTH = 0xEF00

Sections:
.exram_data 0x801100 : /* AT (ADDR (.exram) + SIZEOF (.exram)) */
  {
     PROVIDE (__data_start = .) ;
    *(.data)
    *(.gnu.linkonce.d*)
    . = ALIGN(2);
     _edata = . ;
     PROVIDE (__data_end = .) ;
  }  > exram

Leider war es mir jedoch nicht moeglich, die urspruengliche section
.data auf Startadresse 0x801100 zu legen. Selbst das Erzwingen im
Linker Script ueber die Eintraege:

Memory-Bereich:
data   (rw!x) : ORIGIN = 0x801100, LENGTH = 0xEF00

Section-Bereich:
.data 0x801100 :
{ usw. } > exram

bring nichts und der Linker meldet mir, dass .data nicht im Bereich
exram liegt. Selbst wenn ich die Section .data im Linker Script
loesche, so ist wird sie nach wie vor auf die Startadresse 0x800100
abgebildet.
Kann mir jemand sagen, wer oder was hier seine Haende im Spiel hat?

Gruss,
Stefan

von Stefan (Gast)


Lesenswert?

Nur eine Vermutung:

Mache einen Make-Lauf mit der höchsten Verbose/Log-Stufe. Das gibt zwar
viel Output, aber hier sollte sich zeigen, ob in einer Kommandozeile vom
configure des AVR-GCC mit dem Atmega128-Target her entsprechende
Optionen voreingestellt sind.

von Stefan (Gast)


Lesenswert?

Add:

Die entsprechende GCC Option ist -v (mit Ausführung) bzw. -### (nur
Kommendozeilen anzeigen, nicht ausführen)

von Stefan Kellermann (Gast)


Lesenswert?

Genauso ist es!
AVR-GCC legt den DATA-Bereich automatisch an 0x800100. So sieht die
entsprechende Kommandozeile aus:

C:/WinAVR/bin/../lib/gcc/avr/3.4.5/../../../../avr/bin/ld.exe -m avr5
-Tdata 0x800100 -o Myfile.elf
C:/WinAVR/bin/../lib/gcc/avr/3.4.5/../../../../avr/lib/avr5/crtcan128.o
-LC:/WinAVR/lib/gcc/avr/3.4.5/avr5
-LC:/WinAVR/lib/gcc/avr/3.4.5
-LC:/WinAVR/lib/gcc
-Lc:/WinAVR/lib/gcc/avr/3.4.5/avr5
-Lc:/WinAVR/lib/gcc/avr/3.4.5
-LC:/WinAVR/bin/../lib/gcc/avr/3.4.5/../../../../avr/lib/avr5
-LC:/WinAVR/bin/../lib/gcc/avr/3.4.5/../../../../avr/lib
-Lc:/WinAVR/lib/gcc/avr/3.4.5/../../../../avr/lib/avr5
-Lc:/WinAVR/lib/gcc/avr/3.4.5/../../../../avr/lib
-Map Myfile.map
-Tlnk_cmd.x Myfile.o AVR_startup.o -lgcc -lc -lgcc

Leider ist es mir auch mit 'nem Hex-Editor nicht gelungen, dem AVR-GCC
diese Flausen auszutreiben. So muss man wohl mit diesem kleinen Uebel
leben.
Das System funktioniert, was das Wichtigste ist.

Stefan, ich danke Dir vielmals fuer deine Unterstuetzung!!!

Gruss,
Stefan Kellermann

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.