Forum: Compiler & IDEs AVR: Struct im Flash mit Zeiger auf RAM


von K.L. (Gast)


Lesenswert?

Moin moin,

Ich habe eine Struktur im Flash abgelegt, die einen Zeiger auf eine 
Variable im RAM enthält. Das Lesen der Variable funktioniert, aber das 
Beschreiben nicht. Wer kann mir weiterhelfen?
1
#include <avr/pgmspace.h>
2
3
typedef struct
4
{
5
  prog_char  x;              // char im Flash
6
  prog_char  y;              // char im Flash
7
       char  *v;             // Zeiger im Flash auf char im RAM
8
} ts_value;
9
10
unsigned char uc_value = 3;  // hier hin zeigt *v
11
                             // struct im Flash
12
ts_value PROGMEM  value = { 1, 2, &uc_value };
13
14
void function ( ts_value *value )
15
{                    
16
  unsigned char * PROGMEM ptr_value;
17
                             // hole Adresse im Flash => Zeiger auf SRAM
18
  ptr_value = pgm_read_word ( &value->v );
19
  
20
  if ( *ptr_value == 1 )     // s.o.: uc_value = 3;
21
  {
22
     //code wird ausgeführt
23
  }
24
  *ptr_value = 4;            // Variable im SRAM soll geändert werden: geht nicht
25
}

von K.L. (Gast)


Lesenswert?

ups, habe drei kleine Fehler korrigiert:
"char *v" in "unsigned char *v"
"void function (ts_value * value)" in "void function ( const ts_value * 
value)"
"ptr_value = pgm_read_word ( &value->v );" in "ptr_value = (unsigned 
char *) pgm_read_word ( &value->v );"
1
typedef struct
2
{
3
  prog_char       x;         // char im Flash
4
  prog_char       y;         // char im Flash
5
  unsigned char  *v;         // Zeiger im Flash auf char im RAM
6
} ts_value;
7
 
8
unsigned char uc_value = 3;  // hier hin zeigt *v
9
                             // struct im Flash
10
ts_value PROGMEM  value = { 1, 2, &uc_value };
11
12
void function ( const ts_value *value )
13
{                    
14
  unsigned char * PROGMEM ptr_value;
15
                             // hole Adresse im Flash => Zeiger auf SRAM
16
  ptr_value = (unsigned char *) pgm_read_word ( &value->v ); 
17
  
18
  if ( *ptr_value == 1 )     // s.o.: uc_value = 3;
19
  {
20
     //code wird ausgeführt
21
  }
22
  *ptr_value = 4;            // Variable im SRAM soll geändert werden: geht nicht
23
}

Wie bekomme ich es hin, dass ich die Variable im RAM über der Zeiger im 
Flash verändern kann?

von Karl H. (kbuchegg)


Lesenswert?

unsigned char * PROGMEM ptr_value;

Warum hier PROGMEM?
Dieser Pointr kann logischerweise nicht im Flash angesiedelt sein. 
Dieser Pointer ist ein ganz normaler Pointer.

von K.L. (Gast)


Lesenswert?

> unsigned char * PROGMEM ptr_value;
>
> Warum hier PROGMEM?
> Dieser Pointr kann logischerweise nicht im Flash angesiedelt sein.
> Dieser Pointer ist ein ganz normaler Pointer.

Das stimmt allerdings. Mein Gedanke war: Der Zeiger kommt aus dem Flash. 
Jetzt gehts.

Danke.

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.