www.mikrocontroller.net

Forum: Compiler & IDEs Pointer bei AtMega128


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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).

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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

Bewertung
0 lesenswert
nicht 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.

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.