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
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.
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).
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
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.
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.