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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.