Forum: Compiler & IDEs Pointer bei AtMega128


von Stefan (Gast)


Lesenswert?

Hallo,

ich hab (denke ich) ein Pointer-Problem beim AtMega 128.
Dieses ist erst aufgetreten nachdem das Programm größer geworden ist.
Ich arbeite hierbei mit Pointern auf Funktion, Konstanten im Flash und
auch Pointern im RAM.
Mit folgendem hab ich mir die Größe der Pointer anzeigen lassen:

volatile unsigned char (*funktion)(char daten);
volatile int  k = sizeof(PGM_P);
volatile int  l = sizeof(char *);
volatile int m = sizeof(funktion);

Die Größe ergibt immer 2 Bytes.
Müssten nicht der Funktionspointer under PROGMEM Pointer 4 Byte groß
sein?
Ich denke meine Probleme haben eingesetzt als die Proggröße über 64K
stieg.
Wenns daran liegt, wie bekommt man die Pointer größer?

Grüße
Stefan

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Auch PROGMEM-Pointer sind nur zwei Bytes groß - aber damit lassen sich
trotzdem 128 kByte adressieren, genauer: 64 KWord.
Der Programmspeicher ist beim AVR 16 Bit breit organisiert.

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


Lesenswert?

Allerdings können ROM-Pointer damit nur 64 KB an ROM-Daten
adressieren (auch wenn sie alle 128 KB für Befehle benutzen
können).

von Stefan (Gast)


Lesenswert?

Auf die Idee bin ich durch die Doku gekommen:

#define pgm_read_byte_far(address_long)
__ELPM((uint32_t)(address_long))
Read a byte from the program space with a 32-bit (far) address.
Note:
    The address is a byte address. The address is in the program space

von A.K. (Gast)


Lesenswert?

Ich habe freilich den Eindruck gewonnen, dass WinAVR die Daten deshalb
im ROM vorne plaziert, den Code dahinter. Probleme sind also erst zu
erwarten, wenn man mehr als 64KB Daten im ROM liegen hat.

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


Lesenswert?

> Ich habe freilich den Eindruck gewonnen, dass WinAVR die Daten
> deshalb im ROM vorne plaziert, den Code dahinter.

Das ist exakt der Grund, warum AVR-GCC (bzw. die Linkerscripte) das in
dieser Reihenfolge erledigen, richtig.  Die Initialisierungswerte der
Variablen dagegen landen hinter dem Code, aber die Init-Routine weiß
mit RAMPZ und ELPM umzugehen.

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.