AVR: Struct im Flash mit Zeiger auf RAM

Gast #2085331
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
}
Gast #2085344
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?
Gast #2085475
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.

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