AVR mit >64kB Flash: Wie sag ich's meinem Linker?

Gast #4911756
Hallo zusammen,

ich hab mit AtmelStudio 7 ein Projekt für einen 644 entwickelt.
Da mir das RAM ausgeht, werde ich auf einen 1284 umstellen.
Das Extra an Flash brauche ich in absehbarer Zeit nicht.

Jetzt greife ich an verschiedenen Stellen auf Daten im Flash mittels 
"pgm_read_byte()" zu, welches nur die ersten 64kB adressieren kann.
Beim 644 kein Problem, aber nun hat der 1284 ja 128kB.

Ich könnte nun natürlich alle Zugriffe auf "pgm_read_byte_far()" 
umstellen, was ich aber wegen des Overheads vermeiden möchte.
Stattdessen würde ich lieber dem Linker sagen, dass Daten im Flash nur 
in die ersten 64kB legen soll, oder dem Linker sagen, dass er auf den 
Adressraum jenseits der ersten 64kB ganz verzichten soll.

Nun gibt es aber in AtmelStudio keine projektspezifischen Linkerskripte.

Wie gehe ich am sinnvollsten vor?

Danke!
#4911766
Andererseits, wer sagt denn, daß der Linker die Daten am oberen 
Speicherrand ausrichtet? Wäre das nicht ein wenig unlogisch? Ich würde 
vermuten, daß auch beim 1284er die Daten langsam von unten an die 64kB 
Grenze ranwachsen. Also muss man gar nichts tun.
#4911768
Bronco schrieb:
> Jetzt greife ich an verschiedenen Stellen auf Daten im Flash mittels
> "pgm_read_byte()" zu, welches nur die ersten 64kB adressieren kann.

Und legst die Daten im Flash mittels PROGMEM ab, oder?

Bronco schrieb:
> Ich könnte nun natürlich alle Zugriffe auf "pgm_read_byte_far()"
> umstellen, was ich aber wegen des Overheads vermeiden möchte.
> Stattdessen würde ich lieber dem Linker sagen, dass Daten im Flash nur
> in die ersten 64kB legen soll, oder dem Linker sagen, dass er auf den
> Adressraum jenseits der ersten 64kB ganz verzichten soll.

Brauchst du alles nicht. Die Daten liegen zwischen den Vektoren und dem 
Code. Du bekommst also erst Probleme, wenn diese Daten selber größer als 
64k werden.
#4911900
Bronco schrieb:
> Ich könnte nun natürlich alle Zugriffe auf "pgm_read_byte_far()"
> umstellen, was ich aber wegen des Overheads vermeiden möchte.
Oder du machst es sauber und verwendest einfach die Refactor-Funktion 
der IDE und änderst alle Aufrufe von "pgm_read_byte" mit nur einem Klick 
zu "pgm_read_byte_far"

mfg
Persönliche Seite #4912004
Stefan E. schrieb:
> Die Daten liegen zwischen den Vektoren und dem Code. Du bekommst also
> erst Probleme, wenn diese Daten selber größer als 64k werden.

Eine Möglichkeit, um das zu testen, ist den Wert von __ctors_start 
auszuwerten, z.B. so:
1
$ avr-nm foo.elf | grep __ctors_start
2
00000026 T __ctors_start

__ctors_start wird im standard Linker-Description-File definiert in 
einer Section, die fast direkt auf .progmem.data folgt, nämlich .ctors. 
Falls .jumptables und .lowtext leer sind, was üblicherweise der Fall 
ist, taucht __ctors_start als Test, ob .progmem nicht übergelaufen ist. 
nm gibt die Werte in hex aus, und man kann dann in einem Skript (z.B. sh 
in einem Makefile) testen, ob der Wert <= 10000 ist.

.progmem.* ist die Section, die für PROGMEM und __flash verwendet wird.

Eigentlich wär's ganz sinnig, wenn man Binutils anweisen könnte, die 
Situation anzuwarnen oder nen Fehler auszugeben...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.