www.mikrocontroller.net

Forum: Compiler & IDEs GCC: Flash-Datenbereiche >64K / kein Zugriff - Workaround?


Autor: Grollo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WinAVR kann ja aufgrund der nur 2Byte großen Pointer nur bis zu 64K an 
ROM-Daten (also im Flash) addressieren. Daher packt er diese Daten ja 
auch an den Anfang.
Jetzt habe ich aber viele große Datenbereiche, die insg. über 64K groß 
sind. Wie komme ich jetzt da ran?

Normal arbeite ich mit:
Datenbereich:
const unsigned int Datenbereich1[12000] PROGMEM = { ................}
const unsigned int Datenbereich2[9876] PROGMEM = { ................}
....

const prog_uint16_t  *Datenblock;
und greife dann mit
"pgm_read_byte" darauf zu.

Aber alles ab einem Addressbereich >64K fängt wieder bei 0 an (d.h. an 
die Daten hinter 64K komme ich so nicht ran).
Was kann ich da nun machen? Gibt es einen Trick, um an verschiedene 
Datenbereiche ranzukommen, die dann teilweise auch hinter der 64K Grenze 
liegen (aber immer woanders, ich weiß ja vor der Kompilierung nicht 
unbedingt, was alles eingebunden wird).

Danke

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für alles was über 64 K geht, musst Du die "*_far"-Funktionen zum lesen 
nehmen, also z.B. "pgm_read_byte_far" anstelle von "pgm_read_byte". Die 
arbeiten mit 32-Bit-Adressen. Schau einfach mal in die libc-Doku. Da 
müsste alles drin stehen.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der kritische Teil sind nur die diversen _P-Funktionen, die kann man
dann gar nicht mehr benutzen.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus Datenblatt ATmega128
<cut>
The RAMPZ Register is normally used to select which 64K RAM Page is
accessed by the Z-pointer. As the ATmega128 does not support more than 
64K of SRAM memory, this register is used only to select which page in 
the program memory is accessed when the ELPM/SPM instruction is used. 
The different settings of the RAMPZ0 bit have the following effects:
RAMPZ0 = 0: Program memory address $0000 - $7FFF (lower 64K bytes)
            is accessed by ELPM/SPM
RAMPZ0 = 1: Program memory address $8000 - $FFFF (higher 64K bytes)
            is accessed by ELPM/SPM
</cut>

Also etwas mit RAMPZ(0) und ELPM spielen?!

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Werner:
Es geht hier um C-Programmierung! Und in der AVR-libc gibts 
entsprechende Funktionen, wie oben bereits erwähnt. Es ist nicht 
wirklich sinnvoll, jemandem, der in der libc-Doku noch nicht einmal 
"pgm_read_byte_far" findet, nichts von Assembler-Befehlen und der 
Manipulation von Zeigern erzählen, auf die er als C-Programmierer 
(anscheinend) ohne Assembler-Kenntnisse eh keinen direkten Zugriff 
hat...

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.