mikrocontroller.net

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


Autor: Stefan Kellermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kellermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Stefan Kellermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Add:

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

Autor: Stefan Kellermann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.