Forum: Compiler & IDEs Progmem Pointer nicht schreibbar


von Jan M. (mueschel)


Lesenswert?

Hallo,
ich verstehe folgenden Fehler nicht:
1
typedef const struct font_info PROGMEM* FONT_P;
2
3
FONT_P global_font_select;
4
5
void font_set_config(FONT_P font){
6
  global_font_select = font;
7
}

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?

von Karl H. (kbuchegg)


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.

von Jan M. (mueschel)


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?

von Karl H. (kbuchegg)


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)

von Oliver (Gast)


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

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.