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


von Grollo (Gast)


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

von johnny.m (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Werner B. (Gast)


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?!

von johnny.m (Gast)


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...

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.