Progmem Pointer nicht schreibbar

OP #1627360
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?
#1627431
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.
OP #1627441
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?
#1627463
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)
Gast #1627843
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren