www.mikrocontroller.net

Forum: Compiler & IDEs Progmem Pointer nicht schreibbar


Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich verstehe folgenden Fehler nicht:
typedef const struct font_info PROGMEM* FONT_P;

FONT_P global_font_select;

void font_set_config(FONT_P font){
  global_font_select = font;
}

AVR-GCC 4.3.3 meint dazu:
>error: assignment of read-only variable 'global_font_select'

Nach meinem Verständnis ist global_font_select doch ein (variabler) 
Pointer auf eine konstante Struktur die im Flash liegt - und somit 
schreibbar?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan M. schrieb:

> AVR-GCC 4.3.3 meint dazu:
>>error: assignment of read-only variable 'global_font_select'

Das Problem ist das PROGMEM
Du willst ja den Pointer selbst nicht ins Flash ablegen, sondern 
ausdrücken, dass du einen Pointer hast, der ins Flash zeigt. Das geht 
aber so nicht.

Lass das PROGMEM weg. Es bringt dir an dieser Stelle nichts.

Autor: Jan M. (mueschel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne das PROGMEM funktioniert es, das habe ich auch herausgefunden. 
Allerdings sehe ich noch nicht, wo genau der Unterschied zur Definition 
von PGM_P liegt.
<avr/progmem.h>:
>#define   PGM_P   const prog_char  *
>typedef char PROGMEM   prog_char

Läuft das nicht auch prinzipiell auf das Konstrukt
>const char PROGMEM*
hinaus?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jan M. schrieb:
> Ohne das PROGMEM funktioniert es, das habe ich auch herausgefunden.
> Allerdings sehe ich noch nicht, wo genau der Unterschied zur Definition
> von PGM_P liegt.
> <avr/progmem.h>:
>>#define   PGM_P   const prog_char  *
>>typedef char PROGMEM   prog_char


Hier steht explizit, dass es sich um chars handelt, welche im Flash 
stehen.
Diese im Flash stehenden chars werden dann benutzt um einen Pointer 
darauf zu instatieren.

> Läuft das nicht auch prinzipiell auf das Konstrukt
>>const char PROGMEM*
> hinaus?

Nicht ganz.
So wie ich das sehe, ist es völlig egal, wo das PROGMEM steht. In der 
Datentypdefinition, in der das PROGMEM vorkommt, und zwar ganz egal an 
welcher Stelle, bedeutet es: dieser Datentyp steht im Flash.

PROGMEM ist kein Modifizierer, wie const oder volatile, der 
positionsabhängig eine andere Bedeutung hat.

typedef const struct font_info PROGMEM* FONT_P;
typedef const struct font_info * FONT_P PROGMEM;
typedef const PROGMEM struct font_info * FONT_P;

ist alles dasselbe. Ein Pointer der auf struct font_info zeigt und im 
Flash ist (der Pointer und nicht die struct)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt keinen Typ "Pointer ins Flash", und auch keine Möglichkeit, so 
etwas zu definieren. Es gibt nur Pointer. Ob die dann ins SRAM oder ins 
Flash zeigen, entscheidet die nutzenden Funktion.

PROGMEM sorgt nur dafür, daß die Variable vom Linker ins enstprechende 
Speichersegment gelegt wird.

Oliver

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.