GCC: Flash-Datenbereiche >64K / kein Zugriff - Workaround?

Gast #497745
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
Gast #497807
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.
Gast #498357
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?!
Gast #498414
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren